From: Qu Wenruo <quwenruo@cn.fujitsu.com>
To: <linux-btrfs@vger.kernel.org>
Subject: Re: [PATCH] btrfs-progs: Check superblock's checksum in btrfs-progs.
Date: Wed, 2 Jul 2014 17:05:15 +0800 [thread overview]
Message-ID: <53B3CB4B.2080004@cn.fujitsu.com> (raw)
In-Reply-To: <1403836494-26904-1-git-send-email-quwenruo@cn.fujitsu.com>
I'm very sorry that this patch breaks the open_ctree().
1) pread() only reads sizeof(struct btrfs_super_block), not
BTRFS_SUPER_INFO_SIZE.
Which makes csum always dismatch.
2) memcpy() uses wrong src(should be 'buf' not 'sb').
I'll send v2 version patch soon.
Thanks,
Qu
-------- Original Message --------
Subject: [PATCH] btrfs-progs: Check superblock's checksum in btrfs-progs.
From: Qu Wenruo <quwenruo@cn.fujitsu.com>
To: linux-btrfs@vger.kernel.org
Date: 2014年06月27日 10:34
> Btrfs-progs will read the superblock without checking the checksum.
> When all superblocks are corrupted, continuing will cause disaster.
>
> So this patch will add checksum check for btrfs-progs when reading
> superblocks.
>
> Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
> ---
> disk-io.c | 15 +++++++++++++--
> 1 file changed, 13 insertions(+), 2 deletions(-)
>
> diff --git a/disk-io.c b/disk-io.c
> index 8db0335..3524834 100644
> --- a/disk-io.c
> +++ b/disk-io.c
> @@ -990,7 +990,8 @@ int btrfs_scan_fs_devices(int fd, const char *path,
> ret = btrfs_scan_one_device(fd, path, fs_devices,
> &total_devs, sb_bytenr);
> if (ret) {
> - fprintf(stderr, "No valid Btrfs found on %s\n", path);
> + fprintf(stderr, "No valid Btrfs found or all superblock are corrupted on %s\n",
> + path);
> return ret;
> }
>
> @@ -1100,7 +1101,7 @@ static struct btrfs_fs_info *__open_ctree_fd(int fp, const char *path,
> else
> ret = btrfs_read_dev_super(fp, disk_super, sb_bytenr);
> if (ret) {
> - printk("No valid btrfs found\n");
> + fprintf(stderr, "No valid btrfs found or all super blocks are corrupted\n");
> goto out_devices;
> }
>
> @@ -1191,6 +1192,8 @@ int btrfs_read_dev_super(int fd, struct btrfs_super_block *sb, u64 sb_bytenr)
> int ret;
> u64 transid = 0;
> u64 bytenr;
> + u32 crc;
> + char crc_result[BTRFS_CSUM_SIZE];
>
> if (sb_bytenr != BTRFS_SUPER_INFO_OFFSET) {
> ret = pread64(fd, &buf, sizeof(buf), sb_bytenr);
> @@ -1226,6 +1229,14 @@ int btrfs_read_dev_super(int fd, struct btrfs_super_block *sb, u64 sb_bytenr)
> if (btrfs_super_magic(&buf) != BTRFS_MAGIC)
> continue;
>
> + /* check if the superblock is damaged */
> + crc = ~(u32)0;
> + crc = btrfs_csum_data(NULL, (char *)sb + BTRFS_CSUM_SIZE,
> + crc, BTRFS_SUPER_INFO_SIZE -
> + BTRFS_CSUM_SIZE);
> + btrfs_csum_final(crc, crc_result);
> + if (memcmp(crc_result, sb->csum, BTRFS_CSUM_SIZE))
> + continue;
> if (!fsid_is_initialized) {
> memcpy(fsid, buf.fsid, sizeof(fsid));
> fsid_is_initialized = 1;
prev parent reply other threads:[~2014-07-02 9:04 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-27 2:34 [PATCH] btrfs-progs: Check superblock's checksum in btrfs-progs Qu Wenruo
2014-07-02 9:05 ` Qu Wenruo [this message]
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=53B3CB4B.2080004@cn.fujitsu.com \
--to=quwenruo@cn.fujitsu.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.