Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp3971029yba; Tue, 7 May 2019 09:56:27 -0700 (PDT) X-Google-Smtp-Source: APXvYqyCrefVItyXq6XsuF3WB1jOZKmEObw+MwQ/Rva72Q3FVum3Fb/JS7igKDLlXdfOPTt8exJ3 X-Received: by 2002:a65:60d0:: with SMTP id r16mr39412696pgv.229.1557248187800; Tue, 07 May 2019 09:56:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1557248187; cv=none; d=google.com; s=arc-20160816; b=kaGIsXEVGnwTFQHEC0wxaFXysRKg9qVJ2rL3jZFxLwcW0ArazNVWDzq/W3in7Yzfad UDtegyrsQzTofVh9b9klVGJGj9fpY+w1cgKCWpNO92n1u8GS9yt20f3aiwBIAGqCjV+2 Hq1wrTnhqY9swq8o7e2n+ko4hjN/C8hDpjiP00PzfpQAGjwXS1ohKi2MbQhwlP917aHI pzANmxb4ltfpmqDitYInnN8+UxbdN/SG0rP8j9cIskX3jeH35bTtM/R9Z1OdaeaubR1U bVfP/stUz3Sg9E98Qi3wB9i/U8mI9bupvpxNeBDeI6pp7N9sUrGzKM8cZO1Y/qMz9U87 dOFA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=vWTcC3K3Nu/SMUmuigxcpBE1n1Srz3+InaoHGAS0US0=; b=BNkhPArEW/wjt1oFnC6IFP9syKVul5gAkjn2BaSVCkINKh2d+izvz5drT3hH1496Mn nldNka/o3GRaZiivTQBO8PzDCFQEVkvnskhHko1RowNobursyazh1vlQVZ0ucWtl7HVn w2jQW9eUDq01vyLD5A9gqTJkuYEnPLdX2W/NbXj1313phV+ZwE0wCZ1B+50uuhoWi3Rr 9Acw8mrZX6AnRVDk3sddeuZHHJWdd4nuQM0Auyl4iXxPDkyqzMbJB7kvQtf1TqJS8Tyk vGhf/bHS5T3+vp6/4NSadLh12lxubs92+QbSS9a0h/b3RiDw8Pw94qgd9VMIVVDPZoae /gNg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=ZAgBKk0c; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x10si7915267plr.213.2019.05.07.09.56.12; Tue, 07 May 2019 09:56:27 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=ZAgBKk0c; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727191AbfEGQzT (ORCPT + 99 others); Tue, 7 May 2019 12:55:19 -0400 Received: from mail-io1-f66.google.com ([209.85.166.66]:45428 "EHLO mail-io1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726473AbfEGQzS (ORCPT ); Tue, 7 May 2019 12:55:18 -0400 Received: by mail-io1-f66.google.com with SMTP id b3so9098925iob.12 for ; Tue, 07 May 2019 09:55:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=vWTcC3K3Nu/SMUmuigxcpBE1n1Srz3+InaoHGAS0US0=; b=ZAgBKk0c5qL5FHQqkjp7nmToPCYYtI7Zf2AAgdCa6fkexw7TAFbxpwf3A1DWC1FFUW xk667tBcqeee4P5HGHfWRJ7hC/FxM8umoC3nz0lRjkCe7ReT09URoeYT0eQ6FbLY9iV3 bYxmicA5E6e7r0eKMJGqZxGkWuJ6cAV7DhmTk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=vWTcC3K3Nu/SMUmuigxcpBE1n1Srz3+InaoHGAS0US0=; b=X3WjAPdHdQKCsVc0vbKSYlAhTN7N9F/Pecgf0cHe5R1mDHm32VbJEE/EmU9Lofe6Bp YDsSIgUea4V39Q+V/WL5Cdq1A7DjYjzFMPlR5bU3iyBGX6FPIKkZPaFkoquwEpj0ugjA pASvn1mJq89qJ9k2LOd92Z5t1/zel/sZyl989qNGva6t2tLCBE738r1WP6uZ1hIsalbN T1sqMghykhITEJydwebnmvcjHKFuzu2tXwaguflwalX/VB2cnIj/2Vb6WFKaF17oEzVa 6PDd5pMdQjr5aGiKd1zT7b0L0wPhjvqZScWRckpGZbRdkF3AGWhGKLO5keEkszcPucXR 5pKg== X-Gm-Message-State: APjAAAXF6ScV5ycjzLNBGsfc42puE50mWxRpq3BHuDjUnI0RNhlt8XZq sjCG/fGKKM8lL9SJ31HA/WWNZxX/vbsMMuJ8Ai7WxA== X-Received: by 2002:a5d:8b42:: with SMTP id c2mr15118561iot.192.1557247641118; Tue, 07 May 2019 09:47:21 -0700 (PDT) MIME-Version: 1.0 References: <20190506182736.21064-1-evgreen@chromium.org> <20190506182736.21064-3-evgreen@chromium.org> In-Reply-To: <20190506182736.21064-3-evgreen@chromium.org> From: Gwendal Grignou Date: Tue, 7 May 2019 09:47:09 -0700 Message-ID: Subject: Re: [PATCH v5 2/2] loop: Better discard support for block devices To: Evan Green Cc: Jens Axboe , Martin K Petersen , Bart Van Assche , Alexis Savery , Ming Lei , linux-block@vger.kernel.org, linux-kernel Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Reviewed-by: Gwendal Grignou On Mon, May 6, 2019 at 11:30 AM Evan Green wrote: > > If the backing device for a loop device is a block device, > then mirror the "write zeroes" capabilities of the underlying > block device into the loop device. Copy this capability into both > max_write_zeroes_sectors and max_discard_sectors of the loop device. > > The reason for this is that REQ_OP_DISCARD on a loop device translates > into blkdev_issue_zeroout(), rather than blkdev_issue_discard(). This > presents a consistent interface for loop devices (that discarded data > is zeroed), regardless of the backing device type of the loop device. > There should be no behavior change for loop devices backed by regular > files. > > While in there, differentiate between REQ_OP_DISCARD and > REQ_OP_WRITE_ZEROES, which are different for block devices, > but which the loop device had just been lumping together, since > they're largely the same for files. > > This change fixes blktest block/003, and removes an extraneous > error print in block/013 when testing on a loop device backed > by a block device that does not support discard. > > Signed-off-by: Evan Green > --- > > Changes in v5: > - Don't mirror discard if lo_encrypt_key_size is non-zero (Gwendal) > > Changes in v4: > - Mirror blkdev's write_zeroes into loopdev's discard_sectors. > > Changes in v3: > - Updated commit description > > Changes in v2: None > > drivers/block/loop.c | 57 ++++++++++++++++++++++++++++---------------- > 1 file changed, 37 insertions(+), 20 deletions(-) > > diff --git a/drivers/block/loop.c b/drivers/block/loop.c > index bbf21ebeccd3..a147210ed009 100644 > --- a/drivers/block/loop.c > +++ b/drivers/block/loop.c > @@ -417,19 +417,14 @@ static int lo_read_transfer(struct loop_device *lo, struct request *rq, > return ret; > } > > -static int lo_discard(struct loop_device *lo, struct request *rq, loff_t pos) > +static int lo_discard(struct loop_device *lo, struct request *rq, > + int mode, loff_t pos) > { > - /* > - * We use punch hole to reclaim the free space used by the > - * image a.k.a. discard. However we do not support discard if > - * encryption is enabled, because it may give an attacker > - * useful information. > - */ > struct file *file = lo->lo_backing_file; > - int mode = FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE; > + struct request_queue *q = lo->lo_queue; > int ret; > > - if ((!file->f_op->fallocate) || lo->lo_encrypt_key_size) { > + if (!blk_queue_discard(q)) { > ret = -EOPNOTSUPP; > goto out; > } > @@ -599,8 +594,13 @@ static int do_req_filebacked(struct loop_device *lo, struct request *rq) > case REQ_OP_FLUSH: > return lo_req_flush(lo, rq); > case REQ_OP_DISCARD: > + return lo_discard(lo, rq, > + FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, pos); > + > case REQ_OP_WRITE_ZEROES: > - return lo_discard(lo, rq, pos); > + return lo_discard(lo, rq, > + FALLOC_FL_ZERO_RANGE | FALLOC_FL_KEEP_SIZE, pos); > + > case REQ_OP_WRITE: > if (lo->transfer) > return lo_write_transfer(lo, rq, pos); > @@ -854,6 +854,21 @@ static void loop_config_discard(struct loop_device *lo) > struct file *file = lo->lo_backing_file; > struct inode *inode = file->f_mapping->host; > struct request_queue *q = lo->lo_queue; > + struct request_queue *backingq; > + > + /* > + * If the backing device is a block device, mirror its zeroing > + * capability. REQ_OP_DISCARD translates to a zero-out even when backed > + * by block devices to keep consistent behavior with file-backed loop > + * devices. > + */ > + if (S_ISBLK(inode->i_mode) && !lo->lo_encrypt_key_size) { > + backingq = bdev_get_queue(inode->i_bdev); > + blk_queue_max_discard_sectors(q, > + backingq->limits.max_write_zeroes_sectors); > + > + blk_queue_max_write_zeroes_sectors(q, > + backingq->limits.max_write_zeroes_sectors); > > /* > * We use punch hole to reclaim the free space used by the > @@ -861,22 +876,24 @@ static void loop_config_discard(struct loop_device *lo) > * encryption is enabled, because it may give an attacker > * useful information. > */ > - if ((!file->f_op->fallocate) || > - lo->lo_encrypt_key_size) { > + } else if ((!file->f_op->fallocate) || lo->lo_encrypt_key_size) { > q->limits.discard_granularity = 0; > q->limits.discard_alignment = 0; > blk_queue_max_discard_sectors(q, 0); > blk_queue_max_write_zeroes_sectors(q, 0); > - blk_queue_flag_clear(QUEUE_FLAG_DISCARD, q); > - return; > - } > > - q->limits.discard_granularity = inode->i_sb->s_blocksize; > - q->limits.discard_alignment = 0; > + } else { > + q->limits.discard_granularity = inode->i_sb->s_blocksize; > + q->limits.discard_alignment = 0; > + > + blk_queue_max_discard_sectors(q, UINT_MAX >> 9); > + blk_queue_max_write_zeroes_sectors(q, UINT_MAX >> 9); > + } > > - blk_queue_max_discard_sectors(q, UINT_MAX >> 9); > - blk_queue_max_write_zeroes_sectors(q, UINT_MAX >> 9); > - blk_queue_flag_set(QUEUE_FLAG_DISCARD, q); > + if (q->limits.max_write_zeroes_sectors) > + blk_queue_flag_set(QUEUE_FLAG_DISCARD, q); > + else > + blk_queue_flag_clear(QUEUE_FLAG_DISCARD, q); > } > > static void loop_unprepare_queue(struct loop_device *lo) > -- > 2.20.1 >