From: Daniel Kiper <dkiper@net-space.pl>
To: Goffredo Baroncelli <kreijack@libero.it>
Cc: grub-devel@gnu.org, Daniel Kiper <dkiper@net-space.pl>,
linux-btrfs@vger.kernel.org,
Goffredo Baroncelli <kreijack@inwind.it>
Subject: Re: [PATCH 1/9] btrfs: Add support for reading a filesystem with a RAID 5 or RAID 6 profile.
Date: Tue, 25 Sep 2018 17:31:42 +0200 [thread overview]
Message-ID: <20180925153142.GA30715@router-fw-old.i.net-space.pl> (raw)
In-Reply-To: <20180919184040.22540-2-kreijack@libero.it>
On Wed, Sep 19, 2018 at 08:40:32PM +0200, Goffredo Baroncelli wrote:
> From: Goffredo Baroncelli <kreijack@inwind.it>
>
> Signed-off-by: Goffredo Baroncelli <kreijack@inwind.it>
> ---
> grub-core/fs/btrfs.c | 66 ++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 66 insertions(+)
>
> diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c
> index be195448d..56c42746d 100644
> --- a/grub-core/fs/btrfs.c
> +++ b/grub-core/fs/btrfs.c
> @@ -119,6 +119,8 @@ struct grub_btrfs_chunk_item
> #define GRUB_BTRFS_CHUNK_TYPE_RAID1 0x10
> #define GRUB_BTRFS_CHUNK_TYPE_DUPLICATED 0x20
> #define GRUB_BTRFS_CHUNK_TYPE_RAID10 0x40
> +#define GRUB_BTRFS_CHUNK_TYPE_RAID5 0x80
> +#define GRUB_BTRFS_CHUNK_TYPE_RAID6 0x100
> grub_uint8_t dummy2[0xc];
> grub_uint16_t nstripes;
> grub_uint16_t nsubstripes;
> @@ -764,6 +766,70 @@ grub_btrfs_read_logical (struct grub_btrfs_data *data, grub_disk_addr_t addr,
> stripe_offset = low + chunk_stripe_length
> * high;
> csize = chunk_stripe_length - low;
> + break;
> + }
> + case GRUB_BTRFS_CHUNK_TYPE_RAID5:
> + case GRUB_BTRFS_CHUNK_TYPE_RAID6:
> + {
> + grub_uint64_t nparities, block_nr, high, low;
> +
> + redundancy = 1; /* no redundancy for now */
> +
> + if (grub_le_to_cpu64 (chunk->type) & GRUB_BTRFS_CHUNK_TYPE_RAID5)
> + {
> + grub_dprintf ("btrfs", "RAID5\n");
> + nparities = 1;
> + }
> + else
> + {
> + grub_dprintf ("btrfs", "RAID6\n");
> + nparities = 2;
> + }
> +
> + /*
> + * A RAID 6 layout consists of several blocks spread on the disks.
> + * The raid terminology is used to call all the blocks of a row
> + * "stripe". Unfortunately the BTRFS terminology confuses block
Stripe is data set or parity (parity stripe) on one disk. Block has
different meaning. Please stick to btrfs terminology and say it clearly
in the comment. And even add a link to btrfs wiki page to ease reading.
I think about this one:
https://btrfs.wiki.kernel.org/index.php/Manpage/mkfs.btrfs#BLOCK_GROUPS.2C_CHUNKS.2C_RAID
> + * and stripe.
I do not think so. Or at least not so much...
> + *
> + * Disk0 Disk1 Disk2 Disk3
> + *
> + * A1 B1 P1 Q1
> + * Q2 A2 B2 P2
> + * P3 Q3 A3 B3
> + * [...]
> + *
> + * Note that the placement of the parities depends on row index.
> + * In the code below:
> + * - block_nr is the block number without the parities
Well, it seems to me that the btrfs code introduces confusion not the
spec itself. I would leave code as is but s/block number/stripe number/.
> + * (A1 = 0, B1 = 1, A2 = 2, B2 = 3, ...),
> + * - high is the row number (0 for A1...Q1, 1 for Q2...P2, ...),
> + * - stripen is the disk number (0 for A1,Q2,P3, 1 for B1...),
s/disk number/disk number in a row/
> + * - off is the logical address to read
> + * - chunk_stripe_length is the size of a block (typically 64k),
s/a block/a stripe/
> + * - nstripes is the number of disks,
s/number of disks/number of disks in a row/
I miss the description of nparities here...
> + * - low is the offset of the data inside a stripe,
> + * - stripe_offset is the disk offset,
s/the disk offset/the data offset in an array/?
> + * - csize is the "potential" data to read. It will be reduced to
> + * size if the latter is smaller.
> + */
> + block_nr = grub_divmod64 (off, chunk_stripe_length, &low);
> +
> + /*
> + * stripen is computed without the parities (0 for A1, A2, A3...
> + * 1 for B1, B2...).
> + */
> + high = grub_divmod64 (block_nr, nstripes - nparities, &stripen);
This is clear...
> + /*
> + * stripen is recomputed considering the parities (0 for A1, 1 for
> + * A2, 2 for A3....).
> + */
> + grub_divmod64 (high + stripen, nstripes, &stripen);
... but this looks strange... You add disk number to row number. Hmmm...
It looks that it works but this is not obvious at first sight. Could you
explain that?
> + stripe_offset = low + chunk_stripe_length * high;
> + csize = chunk_stripe_length - low;
> +
> break;
> }
> default:
Daniel
next prev parent reply other threads:[~2018-09-25 15:47 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-19 18:40 [PATCH V7] Add support for BTRFS raid5/6 to GRUB Goffredo Baroncelli
2018-09-19 18:40 ` [PATCH 1/9] btrfs: Add support for reading a filesystem with a RAID 5 or RAID 6 profile Goffredo Baroncelli
2018-09-25 15:31 ` Daniel Kiper [this message]
2018-09-26 20:40 ` Goffredo Baroncelli
2018-09-27 15:47 ` Daniel Kiper
2018-09-19 18:40 ` [PATCH 2/9] btrfs: Add helper to check the btrfs header Goffredo Baroncelli
2018-09-19 18:40 ` [PATCH 3/9] btrfs: Move the error logging from find_device() to its caller Goffredo Baroncelli
2018-09-25 17:23 ` Daniel Kiper
2018-09-19 18:40 ` [PATCH 4/9] btrfs: Avoid a rescan for a device which was already not found Goffredo Baroncelli
2018-09-25 17:29 ` Daniel Kiper
2018-09-26 19:55 ` Goffredo Baroncelli
2018-09-27 16:03 ` Daniel Kiper
2018-09-19 18:40 ` [PATCH 5/9] btrfs: Move logging code in grub_btrfs_read_logical() Goffredo Baroncelli
2018-09-19 18:40 ` [PATCH 6/9] btrfs: Refactor the code that read from disk Goffredo Baroncelli
2018-09-19 18:40 ` [PATCH 7/9] btrfs: Add support for recovery for a RAID 5 btrfs profiles Goffredo Baroncelli
2018-09-25 19:10 ` Daniel Kiper
2018-09-26 19:55 ` Goffredo Baroncelli
2018-09-27 16:18 ` Daniel Kiper
2018-09-19 18:40 ` [PATCH 8/9] btrfs: Make more generic the code for RAID 6 rebuilding Goffredo Baroncelli
2018-09-19 18:40 ` [PATCH 9/9] btrfs: Add RAID 6 recovery for a btrfs filesystem Goffredo Baroncelli
2018-09-25 19:20 ` Daniel Kiper
2018-09-26 19:56 ` Goffredo Baroncelli
2018-09-27 16:20 ` Daniel Kiper
-- strict thread matches above, loose matches on Subject: below --
2018-10-22 17:29 [PATCH V11] Add support for BTRFS raid5/6 to GRUB Goffredo Baroncelli
2018-10-22 17:29 ` [PATCH 1/9] btrfs: Add support for reading a filesystem with a RAID 5 or RAID 6 profile Goffredo Baroncelli
2018-10-18 17:55 [PATCH V10] Add support for BTRFS raid5/6 to GRUB Goffredo Baroncelli
2018-10-18 17:55 ` [PATCH 1/9] btrfs: Add support for reading a filesystem with a RAID 5 or RAID 6 profile Goffredo Baroncelli
2018-10-11 18:50 [PATCH V9] Add support for BTRFS raid5/6 to GRUB Goffredo Baroncelli
2018-10-11 18:50 ` [PATCH 1/9] btrfs: Add support for reading a filesystem with a RAID 5 or RAID 6 profile Goffredo Baroncelli
2018-10-17 13:46 ` Daniel Kiper
2018-09-27 18:34 [PATCH V8] Add support for BTRFS raid5/6 to GRUB Goffredo Baroncelli
2018-09-27 18:34 ` [PATCH 1/9] btrfs: Add support for reading a filesystem with a RAID 5 or RAID 6 profile Goffredo Baroncelli
2018-10-09 17:51 ` Daniel Kiper
2018-10-11 13:17 ` Daniel Kiper
2018-09-19 18:36 Goffredo Baroncelli
2018-09-19 18:42 ` Goffredo Baroncelli
2018-06-19 17:39 [PATCH V6] Add support for BTRFS raid5/6 to GRUB Goffredo Baroncelli
2018-06-19 17:39 ` [PATCH 1/9] btrfs: Add support for reading a filesystem with a RAID 5 or RAID 6 profile Goffredo Baroncelli
2018-07-08 15:51 ` Goffredo Baroncelli
2018-07-09 10:20 ` Daniel Kiper
2018-07-09 16:29 ` Goffredo Baroncelli
2018-07-12 13:46 ` Daniel Kiper
2018-07-18 6:24 ` Goffredo Baroncelli
2018-09-03 12:52 ` Daniel Kiper
2018-06-03 18:53 [PATCH V5] Add support for BTRFS raid5/6 to GRUB Goffredo Baroncelli
2018-06-03 18:53 ` [PATCH 1/9] btrfs: Add support for reading a filesystem with a RAID 5 or RAID 6 profile Goffredo Baroncelli
2018-06-14 11:17 ` Daniel Kiper
2018-06-14 18:55 ` Goffredo Baroncelli
2018-06-19 17:30 ` Goffredo Baroncelli
2018-05-16 18:48 [PATCH V4] Add support for BTRFS raid5/6 to GRUB Goffredo Baroncelli
2018-05-16 18:48 ` [PATCH 1/9] btrfs: add support for reading a filesystem with a RAID 5 or RAID 6 profile Goffredo Baroncelli
2018-05-30 10:07 ` Daniel Kiper
2018-06-01 18:50 ` Goffredo Baroncelli
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=20180925153142.GA30715@router-fw-old.i.net-space.pl \
--to=dkiper@net-space.pl \
--cc=grub-devel@gnu.org \
--cc=kreijack@inwind.it \
--cc=kreijack@libero.it \
--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).