summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2008-10-25 18:20:49 +1100
committerNeilBrown <neilb@suse.de>2008-10-25 18:20:49 +1100
commitb3d3195538e315b3863235731112eee7398d4340 (patch)
tree7decf7dd32fe805c1206efc93e54fea1f23af378
parent11cd8b79c0690bf39b40a25352f86a82a838622a (diff)
downloadmdadm-b3d3195538e315b3863235731112eee7398d4340.tar.gz
mdadm-b3d3195538e315b3863235731112eee7398d4340.tar.xz
mdadm-b3d3195538e315b3863235731112eee7398d4340.zip
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>
-rw-r--r--Build.c2
-rw-r--r--ChangeLog4
-rw-r--r--Create.c2
-rw-r--r--Manage.c8
-rw-r--r--mdadm.811
-rw-r--r--mdadm.c21
-rw-r--r--mdadm.h2
7 files changed, 29 insertions, 21 deletions
diff --git a/Build.c b/Build.c
index d6e20fb..1e213ce 100644
--- a/Build.c
+++ b/Build.c
@@ -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);
diff --git a/ChangeLog b/ChangeLog
index c6bc0f1..adf622c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)
diff --git a/Create.c b/Create.c
index 7b1836a..9e65d0a 100644
--- a/Create.c
+++ b/Create.c
@@ -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 ||
diff --git a/Manage.c b/Manage.c
index 7b3fabe..160778e 100644
--- a/Manage.c
+++ b/Manage.c
@@ -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",
diff --git a/mdadm.8 b/mdadm.8
index d26da80..054adda 100644
--- a/mdadm.8
+++ b/mdadm.8
@@ -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,
diff --git a/mdadm.c b/mdadm.c
index 3aa3b13..af9627d 100644
--- a/mdadm.c
+++ b/mdadm.c
@@ -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'):
diff --git a/mdadm.h b/mdadm.h
index 174ea39..bc4b38e 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -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;