diff options
author | Dan Williams <dan.j.williams@intel.com> | 2010-07-01 17:36:05 -0700 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2010-07-01 17:36:05 -0700 |
commit | 8cfc801c72f079618b39d04c2e0fe32adbc2474e (patch) | |
tree | 061c0e2348bd7fab99ca774fbcf758ebf997ae06 /Manage.c | |
parent | 6a0ee6a0770e8b2ae2a2bbe79896d4ecb083e218 (diff) | |
parent | aa534678baad80689a642ba1bd602a00a267ac03 (diff) | |
download | mdadm-8cfc801c72f079618b39d04c2e0fe32adbc2474e.tar.gz mdadm-8cfc801c72f079618b39d04c2e0fe32adbc2474e.tar.xz mdadm-8cfc801c72f079618b39d04c2e0fe32adbc2474e.zip |
Merge branch 'subarray' into for-neil
Conflicts:
mdadm.h
super-intel.c
Diffstat (limited to 'Manage.c')
-rw-r--r-- | Manage.c | 53 |
1 files changed, 53 insertions, 0 deletions
@@ -869,4 +869,57 @@ int autodetect(void) } return rv; } + +int Update_subarray(char *dev, char *subarray, char *update, mddev_ident_t ident, int quiet) +{ + struct supertype supertype, *st = &supertype; + int fd, rv = 2; + + memset(st, 0, sizeof(*st)); + if (snprintf(st->subarray, sizeof(st->subarray), "%s", subarray) >= + sizeof(st->subarray)) { + if (!quiet) + fprintf(stderr, + Name ": Input overflow for subarray '%s' > %zu bytes\n", + subarray, sizeof(st->subarray) - 1); + return 2; + } + + fd = open_subarray(dev, st, quiet); + if (fd < 0) + return 2; + + if (!st->ss->update_subarray) { + if (!quiet) + fprintf(stderr, + Name ": Operation not supported for %s metadata\n", + st->ss->name); + goto free_super; + } + + if (mdmon_running(st->devnum)) + st->update_tail = &st->updates; + + rv = st->ss->update_subarray(st, update, ident); + + if (rv) { + if (!quiet) + fprintf(stderr, Name ": Failed to update %s of subarray-%s in %s\n", + update, subarray, dev); + } else if (st->update_tail) + flush_metadata_updates(st); + else + st->ss->sync_metadata(st); + + if (rv == 0 && strcmp(update, "name") == 0 && !quiet) + fprintf(stderr, + Name ": Updated subarray-%s name from %s, UUIDs may have changed\n", + subarray, dev); + + free_super: + st->ss->free_super(st); + close(fd); + + return rv; +} #endif |