Prepare and free fdlist in functions
fd handles table creation is put in to function for code reuse. In manage_reshape(), child_grow() function from Grow.c will be reused. To prepare parameters for this function, code from Grow.c can be reused also. Signed-off-by: Adam Kwolek <adam.kwolek@intel.com> Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
8ba77d3281
commit
130994cb83
103
Grow.c
103
Grow.c
|
@ -841,6 +841,70 @@ int remove_disks_on_raid10_to_raid0_takeover(struct supertype *st,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void reshape_free_fdlist(int *fdlist,
|
||||||
|
unsigned long long *offsets,
|
||||||
|
int size)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < size; i++)
|
||||||
|
if (fdlist[i] >= 0)
|
||||||
|
close(fdlist[i]);
|
||||||
|
|
||||||
|
free(fdlist);
|
||||||
|
free(offsets);
|
||||||
|
}
|
||||||
|
|
||||||
|
int reshape_prepare_fdlist(char *devname,
|
||||||
|
struct mdinfo *sra,
|
||||||
|
int raid_disks,
|
||||||
|
int nrdisks,
|
||||||
|
unsigned long blocks,
|
||||||
|
char *backup_file,
|
||||||
|
int *fdlist,
|
||||||
|
unsigned long long *offsets)
|
||||||
|
{
|
||||||
|
int d = 0;
|
||||||
|
struct mdinfo *sd;
|
||||||
|
|
||||||
|
for (d = 0; d <= nrdisks; d++)
|
||||||
|
fdlist[d] = -1;
|
||||||
|
d = raid_disks;
|
||||||
|
for (sd = sra->devs; sd; sd = sd->next) {
|
||||||
|
if (sd->disk.state & (1<<MD_DISK_FAULTY))
|
||||||
|
continue;
|
||||||
|
if (sd->disk.state & (1<<MD_DISK_SYNC)) {
|
||||||
|
char *dn = map_dev(sd->disk.major,
|
||||||
|
sd->disk.minor, 1);
|
||||||
|
fdlist[sd->disk.raid_disk]
|
||||||
|
= dev_open(dn, O_RDONLY);
|
||||||
|
offsets[sd->disk.raid_disk] = sd->data_offset*512;
|
||||||
|
if (fdlist[sd->disk.raid_disk] < 0) {
|
||||||
|
fprintf(stderr,
|
||||||
|
Name ": %s: cannot open component %s\n",
|
||||||
|
devname, dn ? dn : "-unknown-");
|
||||||
|
d = -1;
|
||||||
|
goto release;
|
||||||
|
}
|
||||||
|
} else if (backup_file == NULL) {
|
||||||
|
/* spare */
|
||||||
|
char *dn = map_dev(sd->disk.major,
|
||||||
|
sd->disk.minor, 1);
|
||||||
|
fdlist[d] = dev_open(dn, O_RDWR);
|
||||||
|
offsets[d] = (sd->data_offset + sra->component_size - blocks - 8)*512;
|
||||||
|
if (fdlist[d] < 0) {
|
||||||
|
fprintf(stderr, Name ": %s: cannot open component %s\n",
|
||||||
|
devname, dn ? dn : "-unknown-");
|
||||||
|
d = -1;
|
||||||
|
goto release;
|
||||||
|
}
|
||||||
|
d++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
release:
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
|
int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
|
||||||
long long size,
|
long long size,
|
||||||
int level, char *layout_str, int chunksize, int raid_disks)
|
int level, char *layout_str, int chunksize, int raid_disks)
|
||||||
|
@ -1527,38 +1591,13 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
|
||||||
rv = 1;
|
rv = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
for (d=0; d <= nrdisks; d++)
|
|
||||||
fdlist[d] = -1;
|
d = reshape_prepare_fdlist(devname, sra, array.raid_disks,
|
||||||
d = array.raid_disks;
|
nrdisks, blocks, backup_file,
|
||||||
for (sd = sra->devs; sd; sd=sd->next) {
|
fdlist, offsets);
|
||||||
if (sd->disk.state & (1<<MD_DISK_FAULTY))
|
if (d < 0) {
|
||||||
continue;
|
rv = 1;
|
||||||
if (sd->disk.state & (1<<MD_DISK_SYNC)) {
|
goto release;
|
||||||
char *dn = map_dev(sd->disk.major,
|
|
||||||
sd->disk.minor, 1);
|
|
||||||
fdlist[sd->disk.raid_disk]
|
|
||||||
= dev_open(dn, O_RDONLY);
|
|
||||||
offsets[sd->disk.raid_disk] = sd->data_offset*512;
|
|
||||||
if (fdlist[sd->disk.raid_disk] < 0) {
|
|
||||||
fprintf(stderr, Name ": %s: cannot open component %s\n",
|
|
||||||
devname, dn?dn:"-unknown-");
|
|
||||||
rv = 1;
|
|
||||||
goto release;
|
|
||||||
}
|
|
||||||
} else if (backup_file == NULL) {
|
|
||||||
/* spare */
|
|
||||||
char *dn = map_dev(sd->disk.major,
|
|
||||||
sd->disk.minor, 1);
|
|
||||||
fdlist[d] = dev_open(dn, O_RDWR);
|
|
||||||
offsets[d] = (sd->data_offset + sra->component_size - blocks - 8)*512;
|
|
||||||
if (fdlist[d]<0) {
|
|
||||||
fprintf(stderr, Name ": %s: cannot open component %s\n",
|
|
||||||
devname, dn?dn:"-unknown");
|
|
||||||
rv = 1;
|
|
||||||
goto release;
|
|
||||||
}
|
|
||||||
d++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (backup_file == NULL) {
|
if (backup_file == NULL) {
|
||||||
if (st->ss->external && !st->ss->manage_reshape) {
|
if (st->ss->external && !st->ss->manage_reshape) {
|
||||||
|
|
11
mdadm.h
11
mdadm.h
|
@ -475,6 +475,17 @@ extern int sysfs_disk_to_scsi_id(int fd, __u32 *id);
|
||||||
extern int sysfs_unique_holder(int devnum, long rdev);
|
extern int sysfs_unique_holder(int devnum, long rdev);
|
||||||
extern int sysfs_freeze_array(struct mdinfo *sra);
|
extern int sysfs_freeze_array(struct mdinfo *sra);
|
||||||
extern int load_sys(char *path, char *buf);
|
extern int load_sys(char *path, char *buf);
|
||||||
|
extern int reshape_prepare_fdlist(char *devname,
|
||||||
|
struct mdinfo *sra,
|
||||||
|
int raid_disks,
|
||||||
|
int nrdisks,
|
||||||
|
unsigned long blocks,
|
||||||
|
char *backup_file,
|
||||||
|
int *fdlist,
|
||||||
|
unsigned long long *offsets);
|
||||||
|
extern void reshape_free_fdlist(int *fdlist,
|
||||||
|
unsigned long long *offsets,
|
||||||
|
int size);
|
||||||
|
|
||||||
|
|
||||||
extern int save_stripes(int *source, unsigned long long *offsets,
|
extern int save_stripes(int *source, unsigned long long *offsets,
|
||||||
|
|
Loading…
Reference in New Issue