grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 1/7] Add support for reading a filesystem with a raid5 or rai


From: Goffredo Baroncelli
Subject: Re: [PATCH 1/7] Add support for reading a filesystem with a raid5 or raid6 profile.
Date: Wed, 9 May 2018 21:37:34 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0

On 05/09/2018 03:46 PM, Daniel Kiper wrote:
> On Tue, Apr 24, 2018 at 09:13:10PM +0200, Goffredo Baroncelli wrote:
>> Signed-off-by: Goffredo Baroncelli <address@hidden>
>> ---
>>  grub-core/fs/btrfs.c | 32 ++++++++++++++++++++++++++++++++
>>  1 file changed, 32 insertions(+)
>>
>> diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c
>> index be195448d..b0032ea46 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
> 
> #define GRUB_BTRFS_CHUNK_TYPE_RAID5         0x80
> #define GRUB_BTRFS_CHUNK_TYPE_RAID6         0x100
>  Please start in one column...     ---->    ^^^^^
OK
> 
>>    grub_uint8_t dummy2[0xc];
>>    grub_uint16_t nstripes;
>>    grub_uint16_t nsubstripes;
>> @@ -764,6 +766,36 @@ 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;
>> +          grub_uint64_t stripe_nr, high;
>> +          grub_uint64_t low;
> 
> Could you define all in one line?
Ok
> 
>> +          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;
>> +            }
>> +
>> +          stripe_nr = grub_divmod64 (off, chunk_stripe_length, &low);
> 
> This is clear for me...
I want to put this comment before the line above
              /*
               * A raid 6 layout consists in several stripes spread
               * on the disks, following a layout like the one below
               *
               *   Disk1  Disk2  Disk3  Ddisk4
               *
               *    A1     B1     P1     Q1
               *    Q2     A2     B2     P2  
               *    P3     Q3     A3     B3
               *  [...]
               *
               *  Note that the placement of the parities depends by the row
               *  In the code below:
               *  stripe_nr -> is the stripe number not considering the parities
               *               (A1=0, B1=1, A2 = 2, B2 = 3, ...)
               *  high -> is the row number (0 for A1...Q1, 1 for Q2..P2, ...)
               *  stripen -> is the column number (or number of disk)
               *  off -> logical address to read (from teh beginning of the 
               *         chunk space)
               *  chunk_stripe_length -> size of a stripe (typically 64k)
               *  nstripes -> number of disks
               * 
               */

> 
>> +          high = grub_divmod64 (stripe_nr, nstripes - nparities, &stripen);
then I want to put here

              /*
               * until now stripen is evaluated without the parities (0 for A1,
               * A2, A3... 1 for B1, B2...); now consider also the parities (0
               * for A1, 1 for A2, 2 for A3....); the math is done "modulo"
               * number of disk
               */


>> +          grub_divmod64 (high + stripen, nstripes, &stripen);
> 
> ... but not these two. Could you enlighten me?

It is more clear ? To understand this I spent a lot of time dumping the raw 
data on the disks; this because in wikipedia there is another stripe layout 
(A1, B1, B2 always on the first column; however btrfs does this different)
>> +          stripe_offset = low + chunk_stripe_length * high;
> 
> ???
This is like the other RAID profile: high is the "row number" of the stripe 
matrix; so stripe_offset is the start of the data from the begin of the chunk 
(on the disk)
> 
>> +          csize = chunk_stripe_length - low;
> 
> Chunk size to read?
This is like the other code. We can read until the end of the stripe. Then the 
disks will change.
> 
> Daniel
> 


-- 
gpg @keyserver.linux.it: Goffredo Baroncelli <kreijackATinwind.it>
Key fingerprint BBF5 1610 0B64 DAC6 5F7D  17B2 0EDA 9B37 8B82 E0B5



reply via email to

[Prev in Thread] Current Thread [Next in Thread]