diff options
-rw-r--r-- | drivers/block/drbd/drbd_bitmap.c | 16 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_int.h | 1 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_nl.c | 4 |
3 files changed, 18 insertions, 3 deletions
diff --git a/drivers/block/drbd/drbd_bitmap.c b/drivers/block/drbd/drbd_bitmap.c index 33626e34c92a..4a076b2553e6 100644 --- a/drivers/block/drbd/drbd_bitmap.c +++ b/drivers/block/drbd/drbd_bitmap.c | |||
@@ -922,6 +922,7 @@ struct bm_aio_ctx { | |||
922 | unsigned flags; | 922 | unsigned flags; |
923 | #define BM_AIO_COPY_PAGES 1 | 923 | #define BM_AIO_COPY_PAGES 1 |
924 | #define BM_AIO_WRITE_HINTED 2 | 924 | #define BM_AIO_WRITE_HINTED 2 |
925 | #define BM_WRITE_ALL_PAGES 4 | ||
925 | int error; | 926 | int error; |
926 | struct kref kref; | 927 | struct kref kref; |
927 | }; | 928 | }; |
@@ -1096,7 +1097,9 @@ static int bm_rw(struct drbd_conf *mdev, int rw, unsigned flags, unsigned lazy_w | |||
1096 | !test_and_clear_bit(BM_PAGE_HINT_WRITEOUT, | 1097 | !test_and_clear_bit(BM_PAGE_HINT_WRITEOUT, |
1097 | &page_private(b->bm_pages[i]))) | 1098 | &page_private(b->bm_pages[i]))) |
1098 | continue; | 1099 | continue; |
1099 | if (bm_test_page_unchanged(b->bm_pages[i])) { | 1100 | |
1101 | if (!(flags & BM_WRITE_ALL_PAGES) && | ||
1102 | bm_test_page_unchanged(b->bm_pages[i])) { | ||
1100 | dynamic_dev_dbg(DEV, "skipped bm write for idx %u\n", i); | 1103 | dynamic_dev_dbg(DEV, "skipped bm write for idx %u\n", i); |
1101 | continue; | 1104 | continue; |
1102 | } | 1105 | } |
@@ -1181,6 +1184,17 @@ int drbd_bm_write(struct drbd_conf *mdev) __must_hold(local) | |||
1181 | } | 1184 | } |
1182 | 1185 | ||
1183 | /** | 1186 | /** |
1187 | * drbd_bm_write_all() - Write the whole bitmap to its on disk location. | ||
1188 | * @mdev: DRBD device. | ||
1189 | * | ||
1190 | * Will write all pages. | ||
1191 | */ | ||
1192 | int drbd_bm_write_all(struct drbd_conf *mdev) __must_hold(local) | ||
1193 | { | ||
1194 | return bm_rw(mdev, WRITE, BM_WRITE_ALL_PAGES, 0); | ||
1195 | } | ||
1196 | |||
1197 | /** | ||
1184 | * drbd_bm_lazy_write_out() - Write bitmap pages 0 to @upper_idx-1, if they have changed. | 1198 | * drbd_bm_lazy_write_out() - Write bitmap pages 0 to @upper_idx-1, if they have changed. |
1185 | * @mdev: DRBD device. | 1199 | * @mdev: DRBD device. |
1186 | * @upper_idx: 0: write all changed pages; +ve: page index to stop scanning for changed pages | 1200 | * @upper_idx: 0: write all changed pages; +ve: page index to stop scanning for changed pages |
diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index 813f50dbe5ca..d8b3c88d6f1c 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h | |||
@@ -1329,6 +1329,7 @@ extern int drbd_bm_read(struct drbd_conf *mdev) __must_hold(local); | |||
1329 | extern void drbd_bm_mark_for_writeout(struct drbd_conf *mdev, int page_nr); | 1329 | extern void drbd_bm_mark_for_writeout(struct drbd_conf *mdev, int page_nr); |
1330 | extern int drbd_bm_write(struct drbd_conf *mdev) __must_hold(local); | 1330 | extern int drbd_bm_write(struct drbd_conf *mdev) __must_hold(local); |
1331 | extern int drbd_bm_write_hinted(struct drbd_conf *mdev) __must_hold(local); | 1331 | extern int drbd_bm_write_hinted(struct drbd_conf *mdev) __must_hold(local); |
1332 | extern int drbd_bm_write_all(struct drbd_conf *mdev) __must_hold(local); | ||
1332 | extern int drbd_bm_write_copy_pages(struct drbd_conf *mdev) __must_hold(local); | 1333 | extern int drbd_bm_write_copy_pages(struct drbd_conf *mdev) __must_hold(local); |
1333 | extern size_t drbd_bm_words(struct drbd_conf *mdev); | 1334 | extern size_t drbd_bm_words(struct drbd_conf *mdev); |
1334 | extern unsigned long drbd_bm_bits(struct drbd_conf *mdev); | 1335 | extern unsigned long drbd_bm_bits(struct drbd_conf *mdev); |
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index d1073705bf1f..c02d5265c397 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c | |||
@@ -894,8 +894,8 @@ enum determine_dev_size drbd_determine_dev_size(struct drbd_conf *mdev, enum dds | |||
894 | la_size_changed && md_moved ? "size changed and md moved" : | 894 | la_size_changed && md_moved ? "size changed and md moved" : |
895 | la_size_changed ? "size changed" : "md moved"); | 895 | la_size_changed ? "size changed" : "md moved"); |
896 | /* next line implicitly does drbd_suspend_io()+drbd_resume_io() */ | 896 | /* next line implicitly does drbd_suspend_io()+drbd_resume_io() */ |
897 | err = drbd_bitmap_io(mdev, &drbd_bm_write, | 897 | err = drbd_bitmap_io(mdev, md_moved ? &drbd_bm_write_all : &drbd_bm_write, |
898 | "size changed", BM_LOCKED_MASK); | 898 | "size changed", BM_LOCKED_MASK); |
899 | if (err) { | 899 | if (err) { |
900 | rv = dev_size_error; | 900 | rv = dev_size_error; |
901 | goto out; | 901 | goto out; |