Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp6276033imu; Mon, 21 Jan 2019 06:14:28 -0800 (PST) X-Google-Smtp-Source: ALg8bN6+XE66v3jvqIrJwH4ejZdqZF/Kpl9J2zQZaYz1haE1yPI1f3rL62wt/7TgUZfS+6Bg0CpA X-Received: by 2002:a65:62da:: with SMTP id m26mr28430673pgv.278.1548080067977; Mon, 21 Jan 2019 06:14:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1548080067; cv=none; d=google.com; s=arc-20160816; b=Cv86QoLTBbY23iKx85FnSSB+e3Fk7MCegmL43gkJuUEaQWZeyqMx/rrrsLtdEA607j JOI/mql0KLj8fLlpglSD7eBS4Y33tU97f6vtyEzKXcebsrbaGlOVxlyjr4JPze0uwtpy 7vdqHrjnZG3xQngSvfUSH52fk6EGIvBghEdP3p6d4PSBaDbQab8JMuHJbStz88vs0M/v boW6vYRhrvDzj9ot9Lw9qBlYplYmhdsvcYNxnWkyjuxmdgzOGAxo/Oyb+9/tJpfNA1xB vZJdy8aYotd1OUJlcmSKigg/zjVDV/IjYU+ipvnVqpU/zwzGAEBAyv5iy0iewNxHYkfK oe5w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=uwbIPaWimTQep4iyYmgdoYG66xxoHwuEKqVtBfeIHE8=; b=FHXy3SwsbaOJ0JttD4/N2ZoIoIuScakH7x2V1+p8g3tz9lAgCJQFQKhkpfM+pOVgYk MPbQHhHpeCJquDlFVXnOdDAQxvxgyx9aQJIxznJskZ/e/Gf8gA2jdlfCJMxJm+YJofV4 jlm84AiDn3p7A1p7I+/8z/5rB696O9q0O9rcv0x/uf/7pJYcIpxA1EUmIVhLt3zbNns7 RK81KjU+4rsfK2QDir07Cuf1um3nUIy7XpuVGzz4gjLx81wvoQXVL7WdVFUwCTJMJt1Q QLbGua8EDTvnlahT5KAnEr+BryZSHcGhx6ZxB6bYdf+xDk19gbm+0OdtlratQ5hxdmjt ysSg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=veZiTmmr; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v189si11741807pgb.398.2019.01.21.06.14.12; Mon, 21 Jan 2019 06:14:27 -0800 (PST) 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=veZiTmmr; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731358AbfAUNxy (ORCPT + 99 others); Mon, 21 Jan 2019 08:53:54 -0500 Received: from mail.kernel.org ([198.145.29.99]:37788 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731347AbfAUNxv (ORCPT ); Mon, 21 Jan 2019 08:53:51 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.ziggo.nl [83.86.89.107]) (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 AD23A2084C; Mon, 21 Jan 2019 13:53:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548078830; bh=jGuGdLqgpHk+E+/Bbwp81yoJ7Rt9O10fe2Bilcho3KU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=veZiTmmrPaWRRt4GtWf/+uE02n0CVpuXk+P8CMSh4N0rUDFlnAkqC/4GehZfFLlAp fueR13KRmwkBZXRNwiwdgVDTHF5T+z8H7xcmqhrnTeKZ8BdqdN208AVwdpbEGFMu6f fC95C5RXQqkN4TSsTMh4TtHTxbpB6uGoaG6khrPk= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Jens Axboe , linux-block@vger.kernel.org, Martijn Coenen , Bart Van Assche , Jaegeuk Kim Subject: [PATCH 4.14 58/59] loop: drop caches if offset or block_size are changed Date: Mon, 21 Jan 2019 14:44:23 +0100 Message-Id: <20190121122503.771813232@linuxfoundation.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190121122456.529172919@linuxfoundation.org> References: <20190121122456.529172919@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.14-stable review patch. If anyone has any objections, please let me know. ------------------ From: Jaegeuk Kim commit 5db470e229e22b7eda6e23b5566e532c96fb5bc3 upstream. If we don't drop caches used in old offset or block_size, we can get old data from new offset/block_size, which gives unexpected data to user. For example, Martijn found a loopback bug in the below scenario. 1) LOOP_SET_FD loads first two pages on loop file 2) LOOP_SET_STATUS64 changes the offset on the loop file 3) mount is failed due to the cached pages having wrong superblock Cc: Jens Axboe Cc: linux-block@vger.kernel.org Reported-by: Martijn Coenen Reviewed-by: Bart Van Assche Signed-off-by: Jaegeuk Kim Signed-off-by: Jens Axboe Signed-off-by: Greg Kroah-Hartman --- drivers/block/loop.c | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -1097,6 +1097,12 @@ loop_set_status(struct loop_device *lo, if ((unsigned int) info->lo_encrypt_key_size > LO_KEY_SIZE) return -EINVAL; + if (lo->lo_offset != info->lo_offset || + lo->lo_sizelimit != info->lo_sizelimit) { + sync_blockdev(lo->lo_device); + kill_bdev(lo->lo_device); + } + /* I/O need to be drained during transfer transition */ blk_mq_freeze_queue(lo->lo_queue); @@ -1125,6 +1131,14 @@ loop_set_status(struct loop_device *lo, 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 exit; + } if (figure_loop_size(lo, info->lo_offset, info->lo_sizelimit)) { err = -EFBIG; goto exit; @@ -1346,22 +1360,39 @@ static int loop_set_dio(struct loop_devi static int loop_set_block_size(struct loop_device *lo, unsigned long arg) { + int err = 0; + if (lo->lo_state != Lo_bound) return -ENXIO; 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); + } + 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); - return 0; + return err; } static int lo_ioctl(struct block_device *bdev, fmode_t mode,