Allow WRITEMOSTLY to be cleared on --readd using --readwrite.

Previously it was possible to set the WRITEMOSTLY flag when
adding a device to an array, but not to clear the flag when re-adding.
This is now possible with --readwrite.

Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
NeilBrown 2008-10-25 18:20:49 +11:00
parent 11cd8b79c0
commit b3d3195538
7 changed files with 29 additions and 21 deletions

View File

@ -183,7 +183,7 @@ int Build(char *mddev, int mdfd, int chunk, int level, int layout,
disk.number = i;
disk.raid_disk = i;
disk.state = (1<<MD_DISK_SYNC) | (1<<MD_DISK_ACTIVE);
if (dv->writemostly)
if (dv->writemostly == 1)
disk.state |= 1<<MD_DISK_WRITEMOSTLY;
disk.major = major(stb.st_rdev);
disk.minor = minor(stb.st_rdev);

View File

@ -1,3 +1,7 @@
Changed Prior to this release
- --readwrite can be used with --re-add to clear the writemostly
flag.
Changes Prior to 2.6.7 release
- Avoid NULL reference calling free_super and elsewhere.
- Remove stray semicolon (Causes compile error with gcc-2.95)

View File

@ -534,7 +534,7 @@ int Create(struct supertype *st, char *mddev, int mdfd,
(1<<MD_DISK_SYNC);
else
info.disk.state = 0;
if (dv->writemostly)
if (dv->writemostly == 1)
info.disk.state |= (1<<MD_DISK_WRITEMOSTLY);
if (dnum == insert_point ||

View File

@ -413,8 +413,10 @@ int Manage_subdevs(char *devname, int fd,
disc.number = mdi.disk.number;
disc.raid_disk = mdi.disk.raid_disk;
disc.state = mdi.disk.state;
if (dv->writemostly)
if (dv->writemostly == 1)
disc.state |= 1 << MD_DISK_WRITEMOSTLY;
if (dv->writemostly == 2)
disc.state &= ~(1 << MD_DISK_WRITEMOSTLY);
if (ioctl(fd, ADD_NEW_DISK, &disc) == 0) {
if (verbose >= 0)
fprintf(stderr, Name ": re-added %s\n", dv->devname);
@ -452,7 +454,7 @@ int Manage_subdevs(char *devname, int fd,
disc.number =j;
disc.state = 0;
if (array.not_persistent==0) {
if (dv->writemostly)
if (dv->writemostly == 1)
disc.state |= 1 << MD_DISK_WRITEMOSTLY;
tst->ss->add_to_super(tst, &disc);
if (tst->ss->write_init_super(tst, &disc,
@ -487,7 +489,7 @@ int Manage_subdevs(char *devname, int fd,
break;
}
}
if (dv->writemostly)
if (dv->writemostly == 1)
disc.state |= (1 << MD_DISK_WRITEMOSTLY);
if (ioctl(fd,ADD_NEW_DISK, &disc)) {
fprintf(stderr, Name ": add new device failed for %s as %d: %s\n",

11
mdadm.8
View File

@ -905,6 +905,17 @@ the system to be marked as failed. It can then be removed.
same as
.BR \-\-fail .
.TP
.BR \-\-write\-mostly
Subsequent devices that are added or re-added will have the 'write-mostly'
flag set. This is only valid for RAID! and means that the 'md' driver
will avoid reading from these devices if possible.
.TP
.BR \-\-readwrite
Subsequent devices that are added or re-added will have the 'write-mostly'
flag cleared.
.P
Each of these options require that the first device listed is the array
to be acted upon, and the remainder are component devices to be added,

21
mdadm.c
View File

@ -360,6 +360,12 @@ int main(int argc, char *argv[])
writemostly = 1;
continue;
case O(MANAGE,'w'):
/* clear write-mostly for following devices */
writemostly = 2;
continue;
case O(GROW,'z'):
case O(CREATE,'z'): /* size */
if (size >= 0) {
@ -745,21 +751,6 @@ int main(int argc, char *argv[])
runstop = -1;
continue;
case O(MANAGE,'o'):
if (readonly < 0) {
fprintf(stderr, Name ": Cannot have both readonly and readwrite\n");
exit(2);
}
readonly = 1;
continue;
case O(MANAGE,'w'):
if (readonly > 0) {
fprintf(stderr, Name ": Cannot have both readwrite and readonly.\n");
exit(2);
}
readonly = -1;
continue;
case O(MISC,'Q'):
case O(MISC,'D'):
case O(MISC,'E'):

View File

@ -232,7 +232,7 @@ typedef struct mddev_dev_s {
char disposition; /* 'a' for add, 'r' for remove, 'f' for fail.
* Not set for names read from .config
*/
char writemostly;
char writemostly; /* 1 for 'set writemostly', 2 for 'clear writemostly' */
char re_add;
char used; /* set when used */
struct mddev_dev_s *next;