Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp2499794yba; Fri, 17 May 2019 19:09:57 -0700 (PDT) X-Google-Smtp-Source: APXvYqwYAOZvzHGD1svi/gmOU3e4/NlIRFemM4SA3APbRTv24Jgz9fhAw9Z5Jifa+pCDf6uAMRMa X-Received: by 2002:a17:902:7895:: with SMTP id q21mr57506672pll.73.1558145397793; Fri, 17 May 2019 19:09:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1558145397; cv=none; d=google.com; s=arc-20160816; b=ozuZwJ5Bse2KFslkMJF9Xk69kOiUbwgSaqCdPk4OQMTg0cStPAc3rTMepMn1v6UkLz PLxvHx8WJxca/ztCeyvL9HtuljH5pHdJA1Mr9gvFLam0Wm5QvYW1x+JQQPJBJafVWYg/ PFCTU+qO0aWphHLiN2DzA/2a/UR03ARSeewggKEUlJG0E7txDdSdt20J/A3c+5A6LtGG zdN36gJlDsQMCcF+iv3oXxeUpYeF69y+5FrVAtxP7v0ir1kiIAeQ6w4qECx/D2wem2er k3UjjATBbIcQP2rEKZ9iWdvW83clg3ekRzHdpr3HWT7XQlJv/mUb02y+v+VB5kaNROmr fZTQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature; bh=qNLvuryqp9tgxaeuN6XAVOj/cP3uQ/hAm9n0wIpvvFE=; b=oxCRghOdoX3xCOX/Fk4gjORuTYK+TEfCOGsmOxdWVw4e/ZY/0s66noEot1A26Hktq3 EFZFh2SZMPWCEO8ABjDdDe/VW2WSW/twv9CH7Oqtp0lq7pBDh8UmvxvUhQ7ogMKdd5zB pKi4QuNqo99v7xJE2PInW/igEmmYfR3hkgbTk5oWsgAWKEWOQJ0nIEKMZloL5Lj3Xvct U/7xFtsMJCpY2X++7b6IYNIyCQnhRrCTSsxMsvOrerUyn50bREQjMRCbsyLFkcH5fss6 sb+tfJNNhAMhIU6w3gitOmx/6h5ftqWIGn3v/KDbDaNymTxQ+HfaFXYfhPiyIqCUszVh VJdw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=OXxweGuL; 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=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f4si9563931pgd.325.2019.05.17.19.09.40; Fri, 17 May 2019 19:09:57 -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=@kernel.org header.s=default header.b=OXxweGuL; 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=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727189AbfERAxH (ORCPT + 99 others); Fri, 17 May 2019 20:53:07 -0400 Received: from mail.kernel.org ([198.145.29.99]:37462 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726200AbfERAxH (ORCPT ); Fri, 17 May 2019 20:53:07 -0400 Received: from localhost (unknown [104.132.1.68]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 4764C20848; Sat, 18 May 2019 00:53:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1558140785; bh=66iQAXpgOcprZCr8CiOqoxBvjn/OVWnQ1zBgY9TaV+E=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=OXxweGuLs1atpXSvvpx9TysllOW6kS4Rq9gj3QnFCAaqCfxgPNYHVDFlbLmQKuQmd 3/+efhufGSfnFwam8ZVNq6KBq/7cw5gUVXITBhfBzkV2q23fZ9X9Y6GDbbOW31Q2Ch d2cCLQSFLJvJYh2G2FvySqW12IbKsc51CDSkUxfw= Date: Fri, 17 May 2019 17:53:04 -0700 From: Jaegeuk Kim To: linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net Cc: stable@vger.kernel.org, Jens Axboe , linux-block@vger.kernel.org, Bart Van Assche Subject: Re: [PATCH v2] loop: avoid EAGAIN, if offset or block_size are changed Message-ID: <20190518005304.GA19446@jaegeuk-macbookpro.roam.corp.google.com> References: <20190518004751.18962-1-jaegeuk@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190518004751.18962-1-jaegeuk@kernel.org> User-Agent: Mutt/1.8.2 (2017-04-18) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch tries to avoid EAGAIN due to nrpages!=0 that was originally trying to drop stale pages resulting in wrong data access. Report: https://bugs.chromium.org/p/chromium/issues/detail?id=938958#c38 Cc: Cc: Jens Axboe Cc: linux-block@vger.kernel.org Cc: Bart Van Assche Fixes: 5db470e229e2 ("loop: drop caches if offset or block_size are changed") Reported-by: Gwendal Grignou Reported-by: grygorii tertychnyi Signed-off-by: Jaegeuk Kim --- v2 from v1: - remove obsolete jump drivers/block/loop.c | 45 +++++++++++++++++--------------------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 102d79575895..42994de2dd12 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -1212,6 +1212,7 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info) kuid_t uid = current_uid(); struct block_device *bdev; bool partscan = false; + bool drop_caches = false; err = mutex_lock_killable(&loop_ctl_mutex); if (err) @@ -1232,10 +1233,8 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info) } if (lo->lo_offset != info->lo_offset || - lo->lo_sizelimit != info->lo_sizelimit) { - sync_blockdev(lo->lo_device); - kill_bdev(lo->lo_device); - } + lo->lo_sizelimit != info->lo_sizelimit) + drop_caches = true; /* I/O need to be drained during transfer transition */ blk_mq_freeze_queue(lo->lo_queue); @@ -1265,14 +1264,6 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info) if (lo->lo_offset != info->lo_offset || lo->lo_sizelimit != info->lo_sizelimit) { - /* kill_bdev should have truncated all the pages */ - if (lo->lo_device->bd_inode->i_mapping->nrpages) { - err = -EAGAIN; - pr_warn("%s: loop%d (%s) has still dirty pages (nrpages=%lu)\n", - __func__, lo->lo_number, lo->lo_file_name, - lo->lo_device->bd_inode->i_mapping->nrpages); - goto out_unfreeze; - } if (figure_loop_size(lo, info->lo_offset, info->lo_sizelimit)) { err = -EFBIG; goto out_unfreeze; @@ -1317,6 +1308,12 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info) bdev = lo->lo_device; partscan = true; } + + /* truncate stale pages cached by previous operations */ + if (!err && drop_caches) { + sync_blockdev(lo->lo_device); + kill_bdev(lo->lo_device); + } out_unlock: mutex_unlock(&loop_ctl_mutex); if (partscan) @@ -1498,6 +1495,7 @@ static int loop_set_dio(struct loop_device *lo, unsigned long arg) static int loop_set_block_size(struct loop_device *lo, unsigned long arg) { + bool drop_caches = false; int err = 0; if (lo->lo_state != Lo_bound) @@ -1506,30 +1504,21 @@ static int loop_set_block_size(struct loop_device *lo, unsigned long arg) if (arg < 512 || arg > PAGE_SIZE || !is_power_of_2(arg)) return -EINVAL; - if (lo->lo_queue->limits.logical_block_size != arg) { - sync_blockdev(lo->lo_device); - kill_bdev(lo->lo_device); - } + if (lo->lo_queue->limits.logical_block_size != arg) + drop_caches = true; blk_mq_freeze_queue(lo->lo_queue); - - /* kill_bdev should have truncated all the pages */ - if (lo->lo_queue->limits.logical_block_size != arg && - lo->lo_device->bd_inode->i_mapping->nrpages) { - err = -EAGAIN; - pr_warn("%s: loop%d (%s) has still dirty pages (nrpages=%lu)\n", - __func__, lo->lo_number, lo->lo_file_name, - lo->lo_device->bd_inode->i_mapping->nrpages); - goto out_unfreeze; - } - blk_queue_logical_block_size(lo->lo_queue, arg); blk_queue_physical_block_size(lo->lo_queue, arg); blk_queue_io_min(lo->lo_queue, arg); loop_update_dio(lo); -out_unfreeze: blk_mq_unfreeze_queue(lo->lo_queue); + /* truncate stale pages cached by previous operations */ + if (drop_caches) { + sync_blockdev(lo->lo_device); + kill_bdev(lo->lo_device); + } return err; } -- 2.19.0.605.g01d371f741-goog