From 53e76b1def4d3d6c884e45f1ac723b5f3a1b7376 Mon Sep 17 00:00:00 2001 From: Guoqing Jiang Date: Wed, 2 Dec 2015 00:30:12 +0800 Subject: [PATCH] mdadm: do not display bitmap info if it is cleared "mdadm -X DISK" is used to report information about a bitmap file, it is better to not display all the related infos if bitmap is cleared with "--bitmap=none" under grow mode. To do that, the locate_bitmap is changed a little to have a return value based on MD_FEATURE_BITMAP_OFFSET. Signed-off-by: Guoqing Jiang Signed-off-by: NeilBrown --- bitmap.c | 8 ++++++-- mdadm.h | 2 +- super0.c | 7 ++++--- super1.c | 12 +++++++++--- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/bitmap.c b/bitmap.c index 803eda38..dab674b4 100644 --- a/bitmap.c +++ b/bitmap.c @@ -221,8 +221,12 @@ int bitmap_file_open(char *filename, struct supertype **stp) pr_err("No bitmap possible with %s metadata\n", st->ss->name); return -1; - } else - st->ss->locate_bitmap(st, fd); + } else { + if (st->ss->locate_bitmap(st, fd)) { + pr_err("%s doesn't have bitmap\n", filename); + fd = -1; + } + } *stp = st; } else { diff --git a/mdadm.h b/mdadm.h index 477ef183..edb8f9db 100755 --- a/mdadm.h +++ b/mdadm.h @@ -903,7 +903,7 @@ extern struct superswitch { /* Seek 'fd' to start of write-intent-bitmap. Must be an * md-native format bitmap */ - void (*locate_bitmap)(struct supertype *st, int fd); + int (*locate_bitmap)(struct supertype *st, int fd); /* if add_internal_bitmap succeeded for existing array, this * writes it out. */ diff --git a/super0.c b/super0.c index 6ad9d39f..7f800147 100644 --- a/super0.c +++ b/super0.c @@ -1155,16 +1155,16 @@ static int add_internal_bitmap0(struct supertype *st, int *chunkp, return 1; } -static void locate_bitmap0(struct supertype *st, int fd) +static int locate_bitmap0(struct supertype *st, int fd) { unsigned long long dsize; unsigned long long offset; if (!get_dev_size(fd, NULL, &dsize)) - return; + return -1; if (dsize < MD_RESERVED_SECTORS*512) - return; + return -1; offset = MD_NEW_SIZE_SECTORS(dsize>>9); @@ -1173,6 +1173,7 @@ static void locate_bitmap0(struct supertype *st, int fd) offset += MD_SB_BYTES; lseek64(fd, offset, 0); + return 0; } static int write_bitmap0(struct supertype *st, int fd, enum bitmap_update update) diff --git a/super1.c b/super1.c index 332d492e..7b2bd869 100644 --- a/super1.c +++ b/super1.c @@ -1520,7 +1520,7 @@ static int add_to_super1(struct supertype *st, mdu_disk_info_t *dk, } #endif -static void locate_bitmap1(struct supertype *st, int fd); +static int locate_bitmap1(struct supertype *st, int fd); static int store_super1(struct supertype *st, int fd) { @@ -2305,24 +2305,30 @@ add_internal_bitmap1(struct supertype *st, return 1; } -static void locate_bitmap1(struct supertype *st, int fd) +static int locate_bitmap1(struct supertype *st, int fd) { unsigned long long offset; struct mdp_superblock_1 *sb; int mustfree = 0; + int ret; if (!st->sb) { if (st->ss->load_super(st, fd, NULL)) - return; /* no error I hope... */ + return -1; /* no error I hope... */ mustfree = 1; } sb = st->sb; + if ((__le32_to_cpu(sb->feature_map) & MD_FEATURE_BITMAP_OFFSET)) + ret = 0; + else + ret = -1; offset = __le64_to_cpu(sb->super_offset); offset += (int32_t) __le32_to_cpu(sb->bitmap_offset); if (mustfree) free(sb); lseek64(fd, offset<<9, 0); + return ret; } static int write_bitmap1(struct supertype *st, int fd, enum bitmap_update update) -- 2.39.2