Re: [PATCH] Fix bitmap offset calculations

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

 



Hi Alireza,

On 04/01/2015 08:58 AM, Alireza Haghdoost wrote:
Does it means if some one use write-intent bitmap without this patch,
he may end-up with some unsync stripes after system crash or power
failure and RAID resynchronization ? It seems the bitmaps does not
record correct address of unsynced blocks due to this bug.

Would you please verify this.

This is for clustered md effort only (which is in Neil's md/for-next tree). The regular md is unaffected.

In a clustered environment, different nodes use different bitmaps. While it worked for bitmaps smaller than a page (which is again a co-incidence), it did not work well for bitmaps which spanned multiple pages. Each node in the cluster has different start offsets, and the earlier calculation was incorrect because of conversion from bits to bytes was inverted.

If you were able to assemble on different nodes, you should be fine with respect to synchronization of unsynced blocks after a failure.

HTH,


On Tue, Mar 24, 2015 at 9:15 PM, NeilBrown <neilb@xxxxxxx> wrote:
On Tue, 24 Mar 2015 11:29:05 -0500 Goldwyn Rodrigues <rgoldwyn@xxxxxxx> wrote:

The calculations of bitmap offset is incorrect with respect to bits to bytes
conversion.

Also, remove an irrelevant duplicate message.

Signed-off-by: Goldwyn Rodrigues <rgoldwyn@xxxxxxxx>
---
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
index ac79fef..e98db04 100644
--- a/drivers/md/bitmap.c
+++ b/drivers/md/bitmap.c
@@ -575,7 +575,9 @@ re_read:

               sector_div(bm_blocks,
                          bitmap->mddev->bitmap_info.chunksize >> 9);
-             bm_blocks = bm_blocks << 3;
+             /* bits to bytes */
+             bm_blocks = ((bm_blocks+7) >> 3) + sizeof(bitmap_super_t);
+             /* to 4k blocks */
               bm_blocks = DIV_ROUND_UP_SECTOR_T(bm_blocks, 4096);
               bitmap->mddev->bitmap_info.offset += bitmap->cluster_slot * (bm_blocks << 3);
               pr_info("%s:%d bm slot: %d offset: %llu\n", __func__, __LINE__,
@@ -672,9 +674,6 @@ out:
                       goto out_no_sb;
               }
               bitmap->cluster_slot = md_cluster_ops->slot_number(bitmap->mddev);
-             pr_info("%s:%d bm slot: %d offset: %llu\n", __func__, __LINE__,
-                     bitmap->cluster_slot,
-                     (unsigned long long)bitmap->mddev->bitmap_info.offset);
               goto re_read;
       }


Applied, thanks.

NeilBrown

--
Goldwyn
--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux