]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Introduce sysfs_set_num_signed() and use it to set bitmap/offset
authorJes Sorensen <Jes.Sorensen@redhat.com>
Thu, 26 Apr 2012 15:12:57 +0000 (17:12 +0200)
committerNeilBrown <neilb@suse.de>
Sun, 29 Apr 2012 23:56:22 +0000 (09:56 +1000)
mdinfo->bitmap_offset is a signed long and needs to be treated as
such when passed to the kernel.

This resolves the problem with adding internal bitmaps to a 1.0 array.

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Grow.c
mdadm.h
sysfs.c

diff --git a/Grow.c b/Grow.c
index b4b9ff293d8cbc708258a7505303b22d610950d7..0b0d7182f878c19affeb192e849e63379c552994 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -424,8 +424,8 @@ int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay, int
                if (offset_setable) {
                        st->ss->getinfo_super(st, mdi, NULL);
                        sysfs_init(mdi, fd, -1);
-                       rv = sysfs_set_num(mdi, NULL, "bitmap/location",
-                                          mdi->bitmap_offset);
+                       rv = sysfs_set_num_signed(mdi, NULL, "bitmap/location",
+                                                 mdi->bitmap_offset);
                } else {
                        array.state |= (1<<MD_SB_BITMAP_PRESENT);
                        rv = ioctl(fd, SET_ARRAY_INFO, &array);
diff --git a/mdadm.h b/mdadm.h
index e60a7066cc481f2c6a04881b6367ab0dcc761212..0c91a34b0780a0aa26dc1b6f0228106ee66b3b7c 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -473,6 +473,8 @@ extern int sysfs_set_str(struct mdinfo *sra, struct mdinfo *dev,
                         char *name, char *val);
 extern int sysfs_set_num(struct mdinfo *sra, struct mdinfo *dev,
                         char *name, unsigned long long val);
+extern int sysfs_set_num_signed(struct mdinfo *sra, struct mdinfo *dev,
+                               char *name, long long val);
 extern int sysfs_uevent(struct mdinfo *sra, char *event);
 extern int sysfs_get_fd(struct mdinfo *sra, struct mdinfo *dev,
                        char *name);
diff --git a/sysfs.c b/sysfs.c
index a1007cf276658f0f158a71c4e33657432f3ca07e..8e9d0c5a598f054ef8c491da46cd1dc2a3f4e24e 100644 (file)
--- a/sysfs.c
+++ b/sysfs.c
@@ -428,6 +428,14 @@ int sysfs_set_num(struct mdinfo *sra, struct mdinfo *dev,
        return sysfs_set_str(sra, dev, name, valstr);
 }
 
+int sysfs_set_num_signed(struct mdinfo *sra, struct mdinfo *dev,
+                        char *name, long long val)
+{
+       char valstr[50];
+       sprintf(valstr, "%lli", val);
+       return sysfs_set_str(sra, dev, name, valstr);
+}
+
 int sysfs_uevent(struct mdinfo *sra, char *event)
 {
        char fname[50];