diff options
author | Jes Sorensen <Jes.Sorensen@redhat.com> | 2012-04-26 17:12:57 +0200 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2012-04-30 09:56:22 +1000 |
commit | 012a8641290e566f87f1d52f54022752c39ee326 (patch) | |
tree | ec9a3d136040545090965e29516425738ebf198d | |
parent | 34a13953facb53625d300e63af355bf2df0309e0 (diff) | |
download | mdadm-012a8641290e566f87f1d52f54022752c39ee326.tar.gz |
Introduce sysfs_set_num_signed() and use it to set bitmap/offset
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>
-rw-r--r-- | Grow.c | 4 | ||||
-rw-r--r-- | mdadm.h | 2 | ||||
-rw-r--r-- | sysfs.c | 8 |
3 files changed, 12 insertions, 2 deletions
@@ -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); @@ -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); @@ -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]; |