From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754822AbcEZSIh (ORCPT ); Thu, 26 May 2016 14:08:37 -0400 Received: from mx0b-00082601.pphosted.com ([67.231.153.30]:42323 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754361AbcEZSIf (ORCPT ); Thu, 26 May 2016 14:08:35 -0400 Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=fb.com; Date: Thu, 26 May 2016 11:08:14 -0700 From: Shaohua Li To: , CC: , , , , Subject: [PATCH] block: correctly fallback for zeroout Message-ID: <20160526180813.GA49039@shli-mbp.local> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline User-Agent: Mutt/1.6.1 (2016-04-27) X-Originating-IP: [2620:10d:c090:200::d:77f6] X-ClientProxiedBy: BY2PR04CA058.namprd04.prod.outlook.com (10.141.249.176) To BLUPR15MB0050.namprd15.prod.outlook.com (10.161.124.24) X-MS-Office365-Filtering-Correlation-Id: 8ab6fc81-4599-4b6f-ff6a-08d38590bbac X-Microsoft-Exchange-Diagnostics: 1;BLUPR15MB0050;2:9UQa9n8CsTqA8bSK/OUIyWMRsTxjLFWLVJNv5MuzCbgJUVc8P14qR8JBGSV4lBgI26Tu0AhdxNBfY/sSyayGW1ugYybFLNqIFzj0afMLMrXnh3Ffow9fYtmOjANV3sv4jVcrFZtFzoqdE8U1FqRjBhHfGNHo83xPkOhqvTQwkxfzBoLl6Q4rVcoOfu2+BdzO;3:FNLwSzAYFfHTAmvuBysCQuGtXhgjiqAN9c0BTLucr9s37Cp7Q3JIATMj3Pq1wsMaCrlHDamMm68nHr3dow5p9y27QkYmfOx/K7wsG1pSn7H8RaPLCsJ9mJVCwr9M14zg;25:COk+vwWxAN3DqLvlarHEeYCSJ6Bou81Nt7qSueoCUThaG2B30L8ImhTWEFHGYea7CfSa1K7pMnoIglk6cbID9tYrKvbv98wFq/Yde5rZ4qVaqJe7JyD/Ny7Bg4viVTxZKanqzsGodli9ytVq/XgM27CAT8utP3ME0zvP9jDdf63dFzPGrPGf3FBW6TE+km3S8yTbfCxAywublyoaOQ40iRcEFNoTuLarTw0gsV1Jqe9UzwKxMZjBPByggmi4etImyxsvNeTLoFk8I+33cIdnJHvuwnlSLKJvcSInWlv7WqpBHiqAU+PrNWHp4tGUS/JGmQkroNdqlZQ3xdiGSdbj6Nz7/pBUGqWtfrfU1HOhffbxa/v9HBoEWputdQYbKhgGwLTNksdig07Z8jlkosfu1JFv233SQe4KNS5dNMNYMcM=;20:3Js0OIgKodq8JEAEkKbg0xLjs/Eblzd/C4hRDorJWSVlfrSNr2hXhSYpvPgMK9sbecseDq1OhISwMvaDyrwLnZYY32rcx4C3k5PXB55iy69pkjoYMc7N68RB6ga7iQ/fOoJveRPb5zkMnYi13Fcn9ci20FgCBg+DfZAG8BUHEIE= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR15MB0050; X-LD-Processed: 8ae927fe-1255-47a7-a2af-5f3a069daaa2,ExtAddr X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(67672495146484)(146099531331640)(201166117486090); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046);SRVR:BLUPR15MB0050;BCL:0;PCL:0;RULEID:;SRVR:BLUPR15MB0050; X-Microsoft-Exchange-Diagnostics: 1;BLUPR15MB0050;4:qUyz3hAcdFgE+XV7UrbFsl1vDxTgcuG78rXqIMH2Cz7Ar3uxd/xf3yV+ZkPZEomJSwwwWQ9jzZetoz4VKMkZDw62Hesj8ZLRSsEPx9cYq5avvBnjLxribAoffyLplqnTs1Wra3ZPk1L5mTmGfwonzy/KHPadK/jz56jm/Hk13s4Iy8uM2RQSfjAFkjMHdUSENkR0167H0zdqJBn1J5gNJ0k0++vnLLvSbEWQShDpTh7NuW5ozFt3AlhQQX4tZ0iUO0b4r0TBW6tWwpj6TObrOiCbMcYJgzpEnKywK00ratJfbWwp5k2SCS/dzbzppcT3aaQF/QGHKjT5JG1JRhsrKShOFlGi3pwKz5nCJjtSJFwFTklQfE673tgrgFWnCLLSv9I39gVYMz+Tb7aDZVhqfK76nnuxtRkJ3UTq6VJZ8PYF0ITREz0SnFur+pqdvhi+EyrBR1/M4HdCeUcHgmsWB9vZa8ugUNiOV8vtHtg2oiI= X-Forefront-PRVS: 0954EE4910 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(50944005)(97756001)(5004730100002)(229853001)(586003)(2906002)(42186005)(83506001)(77096005)(23726003)(33656002)(98436002)(86362001)(54356999)(92566002)(4001350100001)(9686002)(5001770100001)(81166006)(50466002)(1076002)(47776003)(5008740100001)(50986999)(19580395003)(4326007)(189998001)(19580405001)(15975445007)(46406003)(8676002);DIR:OUT;SFP:1102;SCL:1;SRVR:BLUPR15MB0050;H:shli-mbp.local;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BLUPR15MB0050;23:hXSTSvCEXvfpCMwJh6NMPZgDozyp1Zi+gQWOEfYmFO35+Rn4a39hkJCFx+QIIXNnrc3ah8+qorqiT/1I45KZbVWtS2HCG1y03m/B/jkoZcVaEbFsYdvAdEjP9sJ/3KarcNqsZVmtJMJsWGfARKfQMDij38cXwkr/jb+mXQXfcSR91PL4kOeUXBSMHpBGdjctgZdx1OkmnQFW2rTYG69kbgkBEsqt9EUha4xMELu6FI715bJJB3+5hhqtR+cOCLZWDdXrSUFQn210DzrwK4JE8sFfyDD2kzoCYdsknyRClDZwrxSJrDRMCckoMj1GRR0iG5YY2y+PoBaYIDTl0GNv7+2KBffjiRzmebfadDhv3xrFhaJQ/1wOjlwjB9LWnRWmhbZP/fIYoA8gEvfUJXrk/e0MqKH/37b7hM7ayRDzk/wMpbJOOOrYGlQb9UfCI60JJIbIhJgbkXTYLKAZNlneEvuXVTMDDVGMz1Q61387gXq4wFwYYy7Gr3JfulXlD174rWLSDxhSixMYhx63xUhYUMquXlopMKpZiG6vnZcOAcagE4qESEeB7xw4A6KxKjeXoMGc3LAr60MeRPt8k9s9XLc7zlCnWJq2HWZ9ypvLiOeNFzUahkVqXPEIKxXc+DzaiW97D93XhZx7kCMp409nXf17TdR38WYn3009db/ZaRD8hMA4z5haAZ4SEVnFuo723GzdyYVquttL6pUU1nUBxzHNMWhvzEOGCQ7lEpBewkY16f/sFfQSV0D7NRsTT5KYs9UJ4DBarQg8SdI7znQuwIHC3/py+iRmOdZdjQLKUSoKOgphupnlSuBV44IIgt4Bmf2X5SacwM0+Q55qXCLdakiDcAGLoOGOtVraFYX/+4qnVyIuLL0qeZi0g8bRomdpJhnBnjjddCOyq/D5W7602hHfT2He+j1CEveL4IqU/0U= X-Microsoft-Exchange-Diagnostics: 1;BLUPR15MB0050;5:8d7/2064bCCaPr08Lr2RKN/Xs92KRHuiqgKkG23c7K9pnCtMuUvcutAUzu5svkc2nAwMfhXsq2/Eb09iOJaRkhs51BHcLANJ8lQaZhvpxUVRjsrk4B2UUhp3d59lKlBq9Rxu/3O+VFJWO0dqF1ofbQ==;24:OzVpIYyJH5NMs4wEWMtNRapBpzjYKHCjUqI0zU7+OVdQW2edg+SfSH93vUQQHty0yp6STjYCJU7AiFK+Ie+/IBByn+AtJ7OYG+OLXvadVUw=;7:xOsTQpschDiYO022GoHhSe6dSl0LWcc4joImzsQWOr+/h4Y/+K5NVOREBMwDa9ZZqsHuhndESEAx9c12yjcJLBSDtLOi5JaJFDADNtE2fDA3fxseIUHd76JhNolD4jCsZwKXxzOksPz7CeGZvZf70KkLEwRCSLbzBcDQhwWoSiBEheV6BlxFyYBh82sIJ7tK;20:m//YzVN43yizWj5sENXn2eAUtFTDU6950Vnifsz7s1Y6T6a+1h+jmBmhwvOUZGEv9MrujlsfTbhWRzDvvIlETchTmoExRTCNYGcA2uTxSyIX8fdH/M1+J9Tml3xLQ82oLAaGwNM6hg3RwSThjgcxAfgClavW3LZtBfKLLikMwEk= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 May 2016 18:08:24.9521 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR15MB0050 X-OriginatorOrg: fb.com X-Proofpoint-Spam-Reason: safe X-FB-Internal: Safe X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2016-05-26_11:,, signatures=0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org blkdev_issue_zeroout try discard/writesame first, if they fail, zeroout fallback to regular write. The problem is discard/writesame doesn't return error for -EOPNOTSUPP, then zeroout can't do fallback and leave disk data not changed. zeroout should have guaranteed zero-fill behavior. BTW, I saw several callers of blkdev_issue_discard can handle -EOPNOTSUPP, not sure why blkdev_issue_discard not returns -EOPNOTSUPP. The same story for blkdev_issue_write_same. https://bugzilla.kernel.org/show_bug.cgi?id=118581 Cc: Sitsofe Wheeler Cc: Mike Snitzer Cc: Jens Axboe Cc: Martin K. Petersen Signed-off-by: Shaohua Li --- block/blk-lib.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/block/blk-lib.c b/block/blk-lib.c index 23d7f30..232f9ea 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c @@ -95,8 +95,9 @@ EXPORT_SYMBOL(__blkdev_issue_discard); * Description: * Issue a discard request for the sectors in question. */ -int blkdev_issue_discard(struct block_device *bdev, sector_t sector, - sector_t nr_sects, gfp_t gfp_mask, unsigned long flags) +static int do_blkdev_issue_discard(struct block_device *bdev, sector_t sector, + sector_t nr_sects, gfp_t gfp_mask, unsigned long flags, + bool ignore_nosupport) { int type = REQ_WRITE | REQ_DISCARD; struct bio *bio = NULL; @@ -111,13 +112,20 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, &bio); if (!ret && bio) { ret = submit_bio_wait(type, bio); - if (ret == -EOPNOTSUPP) + if (ignore_nosupport && ret == -EOPNOTSUPP) ret = 0; } blk_finish_plug(&plug); return ret; } + +int blkdev_issue_discard(struct block_device *bdev, sector_t sector, + sector_t nr_sects, gfp_t gfp_mask, unsigned long flags) +{ + return do_blkdev_issue_discard(bdev, sector, nr_sects, gfp_mask, + flags, true); +} EXPORT_SYMBOL(blkdev_issue_discard); /** @@ -131,9 +139,9 @@ EXPORT_SYMBOL(blkdev_issue_discard); * Description: * Issue a write same request for the sectors in question. */ -int blkdev_issue_write_same(struct block_device *bdev, sector_t sector, +static int do_blkdev_issue_write_same(struct block_device *bdev, sector_t sector, sector_t nr_sects, gfp_t gfp_mask, - struct page *page) + struct page *page, bool ignore_nosupport) { struct request_queue *q = bdev_get_queue(bdev); unsigned int max_write_same_sectors; @@ -167,7 +175,15 @@ int blkdev_issue_write_same(struct block_device *bdev, sector_t sector, if (bio) ret = submit_bio_wait(REQ_WRITE | REQ_WRITE_SAME, bio); - return ret != -EOPNOTSUPP ? ret : 0; + return (ret != -EOPNOTSUPP || !ignore_nosupport) ? ret : 0; +} + +int blkdev_issue_write_same(struct block_device *bdev, sector_t sector, + sector_t nr_sects, gfp_t gfp_mask, + struct page *page) +{ + return do_blkdev_issue_write_same(bdev, sector, nr_sects, gfp_mask, + page, true); } EXPORT_SYMBOL(blkdev_issue_write_same); @@ -238,12 +254,13 @@ int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, struct request_queue *q = bdev_get_queue(bdev); if (discard && blk_queue_discard(q) && q->limits.discard_zeroes_data && - blkdev_issue_discard(bdev, sector, nr_sects, gfp_mask, 0) == 0) + do_blkdev_issue_discard(bdev, sector, nr_sects, gfp_mask, 0, + false) == 0) return 0; if (bdev_write_same(bdev) && - blkdev_issue_write_same(bdev, sector, nr_sects, gfp_mask, - ZERO_PAGE(0)) == 0) + do_blkdev_issue_write_same(bdev, sector, nr_sects, gfp_mask, + ZERO_PAGE(0), false) == 0) return 0; return __blkdev_issue_zeroout(bdev, sector, nr_sects, gfp_mask); -- 2.8.0.rc2