drbd: Implemented the set_new_bits parameter for drbd_bm_resize()
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
This commit is contained in:
parent
d845030f21
commit
02d9a94bbb
4 changed files with 10 additions and 6 deletions
|
@ -441,7 +441,7 @@ static void bm_memset(struct drbd_bitmap *b, size_t offset, int c, size_t len)
|
||||||
* In case this is actually a resize, we copy the old bitmap into the new one.
|
* In case this is actually a resize, we copy the old bitmap into the new one.
|
||||||
* Otherwise, the bitmap is initialized to all bits set.
|
* Otherwise, the bitmap is initialized to all bits set.
|
||||||
*/
|
*/
|
||||||
int drbd_bm_resize(struct drbd_conf *mdev, sector_t capacity)
|
int drbd_bm_resize(struct drbd_conf *mdev, sector_t capacity, int set_new_bits)
|
||||||
{
|
{
|
||||||
struct drbd_bitmap *b = mdev->bitmap;
|
struct drbd_bitmap *b = mdev->bitmap;
|
||||||
unsigned long bits, words, owords, obits, *p_addr, *bm;
|
unsigned long bits, words, owords, obits, *p_addr, *bm;
|
||||||
|
@ -526,8 +526,12 @@ int drbd_bm_resize(struct drbd_conf *mdev, sector_t capacity)
|
||||||
b->bm_dev_capacity = capacity;
|
b->bm_dev_capacity = capacity;
|
||||||
|
|
||||||
if (growing) {
|
if (growing) {
|
||||||
bm_memset(b, owords, 0xff, words-owords);
|
if (set_new_bits) {
|
||||||
b->bm_set += bits - obits;
|
bm_memset(b, owords, 0xff, words-owords);
|
||||||
|
b->bm_set += bits - obits;
|
||||||
|
} else
|
||||||
|
bm_memset(b, owords, 0x00, words-owords);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (want < have) {
|
if (want < have) {
|
||||||
|
|
|
@ -1311,7 +1311,7 @@ struct bm_extent {
|
||||||
#define APP_R_HSIZE 15
|
#define APP_R_HSIZE 15
|
||||||
|
|
||||||
extern int drbd_bm_init(struct drbd_conf *mdev);
|
extern int drbd_bm_init(struct drbd_conf *mdev);
|
||||||
extern int drbd_bm_resize(struct drbd_conf *mdev, sector_t sectors);
|
extern int drbd_bm_resize(struct drbd_conf *mdev, sector_t sectors, int set_new_bits);
|
||||||
extern void drbd_bm_cleanup(struct drbd_conf *mdev);
|
extern void drbd_bm_cleanup(struct drbd_conf *mdev);
|
||||||
extern void drbd_bm_set_all(struct drbd_conf *mdev);
|
extern void drbd_bm_set_all(struct drbd_conf *mdev);
|
||||||
extern void drbd_bm_clear_all(struct drbd_conf *mdev);
|
extern void drbd_bm_clear_all(struct drbd_conf *mdev);
|
||||||
|
|
|
@ -2688,7 +2688,7 @@ void drbd_mdev_cleanup(struct drbd_conf *mdev)
|
||||||
drbd_set_my_capacity(mdev, 0);
|
drbd_set_my_capacity(mdev, 0);
|
||||||
if (mdev->bitmap) {
|
if (mdev->bitmap) {
|
||||||
/* maybe never allocated. */
|
/* maybe never allocated. */
|
||||||
drbd_bm_resize(mdev, 0);
|
drbd_bm_resize(mdev, 0, 1);
|
||||||
drbd_bm_cleanup(mdev);
|
drbd_bm_cleanup(mdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -546,7 +546,7 @@ enum determine_dev_size drbd_determin_dev_size(struct drbd_conf *mdev, enum dds_
|
||||||
if (drbd_get_capacity(mdev->this_bdev) != size ||
|
if (drbd_get_capacity(mdev->this_bdev) != size ||
|
||||||
drbd_bm_capacity(mdev) != size) {
|
drbd_bm_capacity(mdev) != size) {
|
||||||
int err;
|
int err;
|
||||||
err = drbd_bm_resize(mdev, size);
|
err = drbd_bm_resize(mdev, size, !(flags & DDSF_NO_RESYNC));
|
||||||
if (unlikely(err)) {
|
if (unlikely(err)) {
|
||||||
/* currently there is only one error: ENOMEM! */
|
/* currently there is only one error: ENOMEM! */
|
||||||
size = drbd_bm_capacity(mdev)>>1;
|
size = drbd_bm_capacity(mdev)>>1;
|
||||||
|
|
Reference in a new issue