re-add: make re-add try to write sysfs node first
If sysfs node existed, we should try to write "re-add" to it. Signed-off-by: Guoqing Jiang <gqjiang@suse.com> Signed-off-by: NeilBrown <neilb@suse.com>
This commit is contained in:
parent
8266a36ad6
commit
9465f17058
13
Manage.c
13
Manage.c
|
@ -1309,6 +1309,7 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
int sysfd = -1;
|
int sysfd = -1;
|
||||||
int count = 0; /* number of actions taken */
|
int count = 0; /* number of actions taken */
|
||||||
struct mdinfo info;
|
struct mdinfo info;
|
||||||
|
struct mdinfo devinfo;
|
||||||
int frozen = 0;
|
int frozen = 0;
|
||||||
int busy = 0;
|
int busy = 0;
|
||||||
int raid_slot = -1;
|
int raid_slot = -1;
|
||||||
|
@ -1517,6 +1518,18 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
pr_err("Cannot add disks to a \'member\' array, perform this operation on the parent container\n");
|
pr_err("Cannot add disks to a \'member\' array, perform this operation on the parent container\n");
|
||||||
goto abort;
|
goto abort;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Let's first try to write re-add to sysfs */
|
||||||
|
if (rdev != 0 &&
|
||||||
|
(dv->disposition == 'A' || dv->disposition == 'F')) {
|
||||||
|
sysfs_init_dev(&devinfo, rdev);
|
||||||
|
if (sysfs_set_str(&info, &devinfo, "state", "re-add") == 0) {
|
||||||
|
pr_err("re-add %s to %s succeed\n",
|
||||||
|
dv->devname, info.sys_name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (dv->disposition == 'F')
|
if (dv->disposition == 'F')
|
||||||
/* Need to remove first */
|
/* Need to remove first */
|
||||||
ioctl(fd, HOT_REMOVE_DISK, rdev);
|
ioctl(fd, HOT_REMOVE_DISK, rdev);
|
||||||
|
|
1
mdadm.h
1
mdadm.h
|
@ -539,6 +539,7 @@ enum sysfs_read_flags {
|
||||||
*/
|
*/
|
||||||
extern int sysfs_open(char *devnm, char *devname, char *attr);
|
extern int sysfs_open(char *devnm, char *devname, char *attr);
|
||||||
extern void sysfs_init(struct mdinfo *mdi, int fd, char *devnm);
|
extern void sysfs_init(struct mdinfo *mdi, int fd, char *devnm);
|
||||||
|
extern void sysfs_init_dev(struct mdinfo *mdi, unsigned long devid);
|
||||||
extern void sysfs_free(struct mdinfo *sra);
|
extern void sysfs_free(struct mdinfo *sra);
|
||||||
extern struct mdinfo *sysfs_read(int fd, char *devnm, unsigned long options);
|
extern struct mdinfo *sysfs_read(int fd, char *devnm, unsigned long options);
|
||||||
extern int sysfs_attr_match(const char *attr, const char *str);
|
extern int sysfs_attr_match(const char *attr, const char *str);
|
||||||
|
|
6
sysfs.c
6
sysfs.c
|
@ -74,6 +74,12 @@ int sysfs_open(char *devnm, char *devname, char *attr)
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sysfs_init_dev(struct mdinfo *mdi, unsigned long devid)
|
||||||
|
{
|
||||||
|
snprintf(mdi->sys_name,
|
||||||
|
sizeof(mdi->sys_name), "dev-%s", devid2kname(devid));
|
||||||
|
}
|
||||||
|
|
||||||
void sysfs_init(struct mdinfo *mdi, int fd, char *devnm)
|
void sysfs_init(struct mdinfo *mdi, int fd, char *devnm)
|
||||||
{
|
{
|
||||||
mdi->sys_name[0] = 0;
|
mdi->sys_name[0] = 0;
|
||||||
|
|
Loading…
Reference in New Issue