From: Anand Jain <anand.jain@oracle.com>
To: linux-btrfs@vger.kernel.org
Subject: [PATCH 2/2] btrfs: btrfs_rm_device() should zero mirror SB as well
Date: Fri, 26 Jul 2013 01:29:36 +0800 [thread overview]
Message-ID: <1374773376-29853-2-git-send-email-anand.jain@oracle.com> (raw)
In-Reply-To: <1374773376-29853-1-git-send-email-anand.jain@oracle.com>
There is a very less chance that all the copies of SB
on the disk is zeroed unintentionally. unless device
is removed, so this fix will ensure all copies on the
disk is zeroed when the disk is intentionally removed.
reproducer:
-------------------
btrfs dev del /dev/sdc /btrfs
echo $?
0
umount /btrfs
btrfs fi show
Label: none uuid: e7aae9f0-1aa8-41f5-8fb6-d4d8f80cdb2c
Total devices 1 FS bytes used 28.00KiB
devid 1 size 2.00GiB used 20.00MiB path /dev/sdb
./btrfs-select-super -s 1 /dev/sdc
using SB copy 1, bytenr 67108864
btrfs fi show
Label: none uuid: e7aae9f0-1aa8-41f5-8fb6-d4d8f80cdb2c
Total devices 1 FS bytes used 28.00KiB
devid 2 size 2.00GiB used 0.00 path /dev/sdc <-- WRONG
devid 1 size 2.00GiB used 20.00MiB path /dev/sdb
mount /dev/sdc /btrfs
btrfs fi show --kernel
Label: none uuid: e7aae9f0-1aa8-41f5-8fb6-d4d8f80cdb2c mounted: /btrfs
Group profile: metadata: single data: single
Total devices 1 FS bytes used 28.00KiB
devid 1 size 2.00GiB used 20.00MiB path /dev/sdb
---------------------
Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
fs/btrfs/volumes.c | 30 ++++++++++++++++++++++++++++++
1 files changed, 30 insertions(+), 0 deletions(-)
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 557a743..090f57c 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -1641,12 +1641,42 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path)
* remove it from the devices list and zero out the old super
*/
if (clear_super && disk_super) {
+ u64 bytenr;
+ int i;
+
/* make sure this device isn't detected as part of
* the FS anymore
*/
memset(&disk_super->magic, 0, sizeof(disk_super->magic));
set_buffer_dirty(bh);
sync_dirty_buffer(bh);
+
+ /* clear the mirror copies of super block on the disk
+ * being removed, 0th copy is been taken care above and
+ * the below would take of the rest
+ */
+ for (i = 1; i < BTRFS_SUPER_MIRROR_MAX; i++) {
+ brelse(bh);
+ bytenr = btrfs_sb_offset(i);
+ if (bytenr + BTRFS_SUPER_INFO_SIZE >=
+ i_size_read(bdev->bd_inode))
+ break;
+ bh = __bread(bdev, bytenr / 4096,
+ BTRFS_SUPER_INFO_SIZE);
+ if (!bh)
+ continue;
+
+ disk_super = (struct btrfs_super_block *)bh->b_data;
+
+ if (btrfs_super_bytenr(disk_super) != bytenr ||
+ btrfs_super_magic(disk_super) != BTRFS_MAGIC) {
+ continue;
+ }
+ memset(&disk_super->magic, 0,
+ sizeof(disk_super->magic));
+ set_buffer_dirty(bh);
+ sync_dirty_buffer(bh);
+ }
}
ret = 0;
--
1.7.1
next prev parent reply other threads:[~2013-07-25 17:24 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-25 17:29 [PATCH 1/2] btrfs: use BTRFS_SUPER_INFO_SIZE macro at btrfs_read_dev_super() Anand Jain
2013-07-25 17:29 ` Anand Jain [this message]
2013-08-09 20:47 ` [PATCH 2/2] btrfs: btrfs_rm_device() should zero mirror SB as well Eric Sandeen
2013-08-10 2:04 ` anand jain
2013-08-10 22:10 ` Eric Sandeen
2013-08-12 2:39 ` Anand Jain
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1374773376-29853-2-git-send-email-anand.jain@oracle.com \
--to=anand.jain@oracle.com \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).