From patchwork Wed Sep 20 06:18:43 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 9960881 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 C3D0C601D5 for ; Wed, 20 Sep 2017 06:18:57 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B67E828F8C for ; Wed, 20 Sep 2017 06:18:57 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id ABA2628FAC; Wed, 20 Sep 2017 06:18:57 +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,FREEMAIL_FROM, 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 0B73A28F8C for ; Wed, 20 Sep 2017 06:18:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751709AbdITGSy (ORCPT ); Wed, 20 Sep 2017 02:18:54 -0400 Received: from mout.gmx.net ([212.227.15.19]:64386 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751547AbdITGSy (ORCPT ); Wed, 20 Sep 2017 02:18:54 -0400 Received: from localhost.localdomain ([45.32.39.184]) by mail.gmx.com (mrgmx003 [212.227.17.184]) with ESMTPSA (Nemesis) id 0M243n-1d5slX1SQN-00u3eY; Wed, 20 Sep 2017 08:18:49 +0200 From: Qu Wenruo To: linux-btrfs@vger.kernel.org Cc: dsterba@suse.cz, rich@shroop.net, rrauenza@gmail.com Subject: [PATCH] btrfs: Remove WARN_ON for unaligned device created before v4.13 and adds more user friendly output Date: Wed, 20 Sep 2017 15:18:43 +0900 Message-Id: <20170920061843.9016-1-quwenruo.btrfs@gmx.com> X-Mailer: git-send-email 2.13.3 X-Provags-ID: V03:K0:fgX5kM7VuBrrwZuSqGfB79Jf+UsyPJ0mVmQfzL77a8wfXSE5AnR II3+glRWKRuprDXRX07EriTHrpf6pg2Uj3kv3frTnc67dBypWwVQqE0/pEiZtgoauzbFbGr kZBFsDUc/GTnPD4oY6EUQENE8U7OCUoCcrX1JIyYU3caSoEx+APaGdXfphrSKjf+7XI/RAw Mpr09GkZWS7Vs5s9MF/Mg== X-UI-Out-Filterresults: notjunk:1; V01:K0:dGERitQ6wIQ=:z07h6kAolGnfmJaaIXZoFG D+sLI7o+SqhM+7D35xqoAgVbCqnuJ6lohksaXCSJE7gb+v8wVeiTXaKm/BHW2/v8DDBf4pysC MZ/UFSF+7FpfgE2HNAYfa/55i0FCph2EAVb0gY+L9vIjsG9vCSVshKbh417sH00g6zpTS124O 8v6FSXOE8WPyQ/1gae3PDbclX3+TbYOrwhyep3jYWdIV9EcGWisQUIizX6UYVZyc7Q4KwxnJj 7mQtD9s2B/wPPYUojCQEN4979UkhzsC0NjD5xupRs9AIMDuiIIB8hzK8H+8eRCEDR3XArBgtM pqLOzMyXG2mWyxFK6aMsAuF8W50mtEZdILRRQC5NwSAryN8IWreW62tbtIBfUmU0CJStTWUbD BEQsEFe1LbZl8mLrLtLrlMwdYp0gYN3LvdRot0Q/Kg4SX5q1i0DdetDMxd8l5j+qLk+0cr/xM GjRA9qJiHNW0IW9qi3qBOSJqi6r1m5kys4KgZuaLFE5OgKwHX+lC04N9fn7ozUXsUVuiy1uA+ fl2e1J0x4/IhqRp29dTcVdb5qIR4atLaKXDK6Q310yJpCn1oMjMcGJUhw8Xik/u09l8iJZwDr qsI7wPJ2ZZ6Ims4lwFFqhfkwij8xfZalI43IcXU5hifJypodAkxkKseL+/VFZaRo1vyo71UZf zGaR+IDDVfAOwY5HEKL+vumeKJuW1VqqOOl/asSrQDMLpXUq0kClabLajfATXkXuerPZ2FiOy 4rP8+eINsKNUMd3ZI6yqWEVFvBXJW1adMB8Dc0ARTTUngv7yJmYtw5owJpTyaX7ZQUi3tyXY+ XzAjrGfYj9e0FuICu29RrEgn/Enkw== Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Commit 7dfb8be11b5d ("btrfs: Round down values which are written for total_bytes_size") is fixing the unaligned device size caused by adding/shrinking device. It added a new WARN_ON() when device size is unaligned. This is fine for new device added to btrfs using v4.13 kernel, but not existing device whose total_bytes is already unaligned. And the WARN_ON() will get triggered every time a block group get created/removed on the unaligned device. This patch will remove the WARN_ON(), and warn user more gently what's happening and how to fix it. Reported-by: Rich Rauenzahn Fixes: 7dfb8be11b5d ("btrfs: Round down values which are written for total_bytes_size") Signed-off-by: Qu Wenruo --- fs/btrfs/ctree.h | 1 - fs/btrfs/volumes.c | 16 ++++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 5a8933da39a7..4de9269e435a 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -1562,7 +1562,6 @@ static inline void btrfs_set_device_total_bytes(struct extent_buffer *eb, { BUILD_BUG_ON(sizeof(u64) != sizeof(((struct btrfs_dev_item *)0))->total_bytes); - WARN_ON(!IS_ALIGNED(val, eb->fs_info->sectorsize)); btrfs_set_64(eb, s, offsetof(struct btrfs_dev_item, total_bytes), val); } diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 0e8f16c305df..afae25df6a8c 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -6472,15 +6472,23 @@ static int read_one_chunk(struct btrfs_fs_info *fs_info, struct btrfs_key *key, return 0; } -static void fill_device_from_item(struct extent_buffer *leaf, - struct btrfs_dev_item *dev_item, - struct btrfs_device *device) +static void fill_device_from_item(struct btrfs_fs_info *fs_info, + struct extent_buffer *leaf, + struct btrfs_dev_item *dev_item, + struct btrfs_device *device) { unsigned long ptr; device->devid = btrfs_device_id(leaf, dev_item); device->disk_total_bytes = btrfs_device_total_bytes(leaf, dev_item); device->total_bytes = device->disk_total_bytes; + if (!IS_ALIGNED(device->total_bytes, fs_info->sectorsize)) { + btrfs_warn(fs_info, + "devid %llu has unaligned total bytes %llu", + device->devid, device->disk_total_bytes); + btrfs_warn(fs_info, + "please shrink the device a little and resize back to fix it"); + } device->commit_total_bytes = device->disk_total_bytes; device->bytes_used = btrfs_device_bytes_used(leaf, dev_item); device->commit_bytes_used = device->bytes_used; @@ -6625,7 +6633,7 @@ static int read_one_dev(struct btrfs_fs_info *fs_info, return -EINVAL; } - fill_device_from_item(leaf, dev_item, device); + fill_device_from_item(fs_info, leaf, dev_item, device); device->in_fs_metadata = 1; if (device->writeable && !device->is_tgtdev_for_dev_replace) { device->fs_devices->total_rw_bytes += device->total_bytes;