From patchwork Tue Aug 22 17:33:00 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Omar Sandoval X-Patchwork-Id: 9915833 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 8064F60381 for ; Tue, 22 Aug 2017 17:33:24 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 693F3283ED for ; Tue, 22 Aug 2017 17:33:24 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5DF76286B7; Tue, 22 Aug 2017 17:33:24 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.4 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D05F9283ED for ; Tue, 22 Aug 2017 17:33:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751552AbdHVRdV (ORCPT ); Tue, 22 Aug 2017 13:33:21 -0400 Received: from mail-pg0-f52.google.com ([74.125.83.52]:35731 "EHLO mail-pg0-f52.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752381AbdHVRdR (ORCPT ); Tue, 22 Aug 2017 13:33:17 -0400 Received: by mail-pg0-f52.google.com with SMTP id u191so43290229pgc.2 for ; Tue, 22 Aug 2017 10:33:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=osandov-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=88rNCVl+XAXJrJ9kJqhvOY09ynjdKDQzama2bJS7Q/c=; b=lQiDaxxUYoeXF89p5tkCMCqsBtMAvOuoLZGncuCFYSbl03pTuVPxXEf1Dz3d9A9A/9 IdGIA3Lf2Elxxp4U5JVRymJ3JxAutpSqFPfk0pfWfcrBIAHXkj1N5BYBbfvAA5rV0fBN OUoD/1IQ+pAbZy4+ybXQGXGyKrM1WW/bbepzYUAeBIEd4/PbWXXsdGQaTxTpXE7fEWDG gjkhDZ3bAJynHOQkOApMX8RTt2Cm0659ClayDrmLGp1n3leiRUio5uaW3SjkO+BtkK40 /Poisi8+f806Wt2zSLsWjKsCU+nP2ra72Zh5svb9wUf5o3iBeLyU8UscC1O6stafqh4k goPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=88rNCVl+XAXJrJ9kJqhvOY09ynjdKDQzama2bJS7Q/c=; b=hhcrr3p7Ouw3Z2alKA+DaIZ7tG8uL+FC97V6Zbqs3nSr3OCb+qZOrWILZ14jJE0ibR r7OeDR27MK7swgV1YhGCG6tvvL9n0a5TVW94ebcRlGfsQbaQTrhGSZOh2kHDWouvqS71 Po3GXMXQclWQU5KAjuW+5MOL2NnxtFPqcRwH9xEW/O4jJgwGN4/mtxd1qz+zkJOFE0BE mxHh11pogEJM02Q9JEgfJk8mGJeT+ZMaLZfds2B01EOa9NFKLIGoRk0z2+dNBdhzUN1Y /wGRY4BG1lPw1gjcPT/ud/RkCXTLE7lDMpFtZRUJY4QYLN0FK8DnhnksmPyDHDfbsieO KzBQ== X-Gm-Message-State: AHYfb5jGVZQldWetcs87klQ3TzlesahmOKn1o5f9ZAKPQeRDAqqKFqjO 8+bn6q9mOZ9TtySXet+OTQ== X-Received: by 10.98.133.81 with SMTP id u78mr1470340pfd.189.1503423196161; Tue, 22 Aug 2017 10:33:16 -0700 (PDT) Received: from vader.thefacebook.com ([2620:10d:c090:200::6:99f5]) by smtp.gmail.com with ESMTPSA id m10sm4920083pgd.62.2017.08.22.10.33.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 22 Aug 2017 10:33:15 -0700 (PDT) From: Omar Sandoval To: linux-block@vger.kernel.org Cc: kernel-team@fb.com, Hannes Reinecke , Ming Lei , Karel Zak , Milan Broz Subject: [PATCH v3 3/4] loop: use queue limit instead of private lo_logical_blocksize Date: Tue, 22 Aug 2017 10:33:00 -0700 Message-Id: X-Mailer: git-send-email 2.14.1 In-Reply-To: References: In-Reply-To: References: Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Omar Sandoval There's no reason to track this separately; just use the logical_block_size queue limit. This also fixes an issue where the physical block size would get changed unnecessarily. Tested-by: Milan Broz Reviewed-by: Hannes Reinecke Signed-off-by: Omar Sandoval --- drivers/block/loop.c | 40 +++++++++++++++++----------------------- drivers/block/loop.h | 1 - 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/drivers/block/loop.c b/drivers/block/loop.c index a444dc2d5977..28026f0abaa9 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -221,8 +221,7 @@ static void __loop_update_dio(struct loop_device *lo, bool dio) } static int -figure_loop_size(struct loop_device *lo, loff_t offset, loff_t sizelimit, - loff_t logical_blocksize) +figure_loop_size(struct loop_device *lo, loff_t offset, loff_t sizelimit) { loff_t size = get_size(offset, sizelimit, lo->lo_backing_file); sector_t x = (sector_t)size; @@ -234,12 +233,6 @@ figure_loop_size(struct loop_device *lo, loff_t offset, loff_t sizelimit, lo->lo_offset = offset; if (lo->lo_sizelimit != sizelimit) lo->lo_sizelimit = sizelimit; - if (lo->lo_flags & LO_FLAGS_BLOCKSIZE) { - lo->lo_logical_blocksize = logical_blocksize; - blk_queue_physical_block_size(lo->lo_queue, lo->lo_blocksize); - blk_queue_logical_block_size(lo->lo_queue, - lo->lo_logical_blocksize); - } set_capacity(lo->lo_disk, x); bd_set_size(bdev, (loff_t)get_capacity(bdev->bd_disk) << 9); /* let user-space know about the new size */ @@ -934,7 +927,6 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, lo->use_dio = false; lo->lo_blocksize = lo_blocksize; - lo->lo_logical_blocksize = 512; lo->lo_device = bdev; lo->lo_flags = lo_flags; lo->lo_backing_file = file; @@ -946,6 +938,9 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, if (!(lo_flags & LO_FLAGS_READ_ONLY) && file->f_op->fsync) blk_queue_write_cache(lo->lo_queue, true, false); + blk_queue_logical_block_size(lo->lo_queue, 512); + blk_queue_physical_block_size(lo->lo_queue, 512); + blk_queue_io_min(lo->lo_queue, 512); loop_update_dio(lo); set_capacity(lo->lo_disk, size); @@ -1133,14 +1128,7 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info) } else xfer = NULL; - err = loop_init_xfer(lo, xfer, info); - if (err) - goto exit; - if (info->lo_flags & LO_FLAGS_BLOCKSIZE) { - if (!(lo->lo_flags & LO_FLAGS_BLOCKSIZE)) - lo->lo_logical_blocksize = 512; - lo->lo_flags |= LO_FLAGS_BLOCKSIZE; if (LO_INFO_BLOCKSIZE(info) != 512 && LO_INFO_BLOCKSIZE(info) != 1024 && LO_INFO_BLOCKSIZE(info) != 2048 && @@ -1154,18 +1142,25 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info) } } + err = loop_init_xfer(lo, xfer, info); + if (err) + goto exit; + if (lo->lo_offset != info->lo_offset || lo->lo_sizelimit != info->lo_sizelimit || - lo->lo_flags != lo_flags || - ((lo->lo_flags & LO_FLAGS_BLOCKSIZE) && - lo->lo_logical_blocksize != LO_INFO_BLOCKSIZE(info))) { - if (figure_loop_size(lo, info->lo_offset, info->lo_sizelimit, - LO_INFO_BLOCKSIZE(info))) { + lo->lo_flags != lo_flags) { + if (figure_loop_size(lo, info->lo_offset, info->lo_sizelimit)) { err = -EFBIG; goto exit; } } + if (info->lo_flags & LO_FLAGS_BLOCKSIZE) { + blk_queue_logical_block_size(lo->lo_queue, LO_INFO_BLOCKSIZE(info)); + blk_queue_physical_block_size(lo->lo_queue, LO_INFO_BLOCKSIZE(info)); + blk_queue_io_min(lo->lo_queue, LO_INFO_BLOCKSIZE(info)); + } + loop_config_discard(lo); memcpy(lo->lo_file_name, info->lo_file_name, LO_NAME_SIZE); @@ -1352,8 +1347,7 @@ static int loop_set_capacity(struct loop_device *lo) if (unlikely(lo->lo_state != Lo_bound)) return -ENXIO; - return figure_loop_size(lo, lo->lo_offset, lo->lo_sizelimit, - lo->lo_logical_blocksize); + return figure_loop_size(lo, lo->lo_offset, lo->lo_sizelimit); } static int loop_set_dio(struct loop_device *lo, unsigned long arg) diff --git a/drivers/block/loop.h b/drivers/block/loop.h index 2c096b9a17b8..fecd3f97ef8c 100644 --- a/drivers/block/loop.h +++ b/drivers/block/loop.h @@ -49,7 +49,6 @@ struct loop_device { struct file * lo_backing_file; struct block_device *lo_device; unsigned lo_blocksize; - unsigned lo_logical_blocksize; void *key_data; gfp_t old_gfp_mask;