From: NeilBrown Date: Thu, 5 May 2011 06:14:53 +0000 (+1000) Subject: lafs: allow some commands to open busy devices with --force X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;p=lafs-utils.git lafs: allow some commands to open busy devices with --force Useful for looking at the filesystem while the kernel is stuck. Signed-off-by: NeilBrown --- diff --git a/tools/internal.h b/tools/internal.h index de9a4bd..50b5d80 100644 --- a/tools/internal.h +++ b/tools/internal.h @@ -1,4 +1,4 @@ int open_device(char *devname, long long *device_bytes, int regular_file, - char **error); + int force, char **error); long long parse_size(char *arg, char **error); diff --git a/tools/lafs.c b/tools/lafs.c index c6d1409..3ac7578 100644 --- a/tools/lafs.c +++ b/tools/lafs.c @@ -948,6 +948,7 @@ static struct args args_add_device[] = { /*5*/ { "-stride", opaque, -1, {NULL}, "Stride (from one member device to next)"}, /*6*/ { "-width", opaque, -1, {NULL}, "Width of array in data-devices"}, /*7*/ { "-usage_inum", opaque, -1, {NULL}, "Inode number for segment-usage file"}, +/*8*/ { "-force", flag, -1, {NULL}, "Open device even if in-use"}, TERMINAL_ARG }; static void c_add_device(struct state *st, void **args) @@ -1018,7 +1019,8 @@ static void c_add_device(struct state *st, void **args) return; } - fd = open_device(devname, &device_bytes, args[2] != NULL, &err); + fd = open_device(devname, &device_bytes, args[2] != NULL, + args[8] != NULL, &err); if (fd < 0) { printf("add_device: %s\n", err); @@ -1178,6 +1180,7 @@ static char help_load_dev[] = "Allow access to LaFS filesystem stored on given d static struct args args_load_dev[] = { { "DEVNAME", external, -1, {NULL}, "Device to load filesystem info from"}, { "-file", external, 0, {NULL}, "Regular file to load filesystem info from"}, + { "-force", flag, -1, {NULL}, "Open device even if currently in use"}, TERMINAL_ARG }; static void c_load_dev(struct state *st, void **args) @@ -1193,7 +1196,8 @@ static void c_load_dev(struct state *st, void **args) return; } - fd = open_device(devname, &device_bytes, args[2] != NULL, &err); + fd = open_device(devname, &device_bytes, args[2] != NULL, + args[3] != NULL, &err); if (fd < 0) { printf("load_dev: %s\n", err); @@ -1246,7 +1250,8 @@ static void c_mount(struct state *st, void **args) devname); return; } - fd = open_device(devname, &device_bytes, args[2] != NULL, &err); + fd = open_device(devname, &device_bytes, args[2] != NULL, + args[3] != NULL, &err); if (fd < 0) { printf("mount: %s\n", err); free(err); @@ -1354,7 +1359,7 @@ static void c_show_device(struct state *st, void **args) addrstr); return; } - fd = open_device(devname, &device_bytes, args[3] != NULL, &err); + fd = open_device(devname, &device_bytes, args[3] != NULL, 1, &err); if (fd < 0) { printf("show device: %s\n", err); free(err); @@ -1382,7 +1387,7 @@ static void c_show_device(struct state *st, void **args) if (!devname) return; /* Not already loaded, try to load-and-print */ - fd = open_device(devname, &device_bytes, args[3] != NULL, &err); + fd = open_device(devname, &device_bytes, args[3] != NULL, 1, &err); if (fd < 0) { printf("show device: %s\n", err); free(err); @@ -1448,7 +1453,7 @@ static void c_show_state(struct state *st, void **args) return; } dv = NULL; - fd = open_device(devname, &device_bytes, args[3] != NULL, &err); + fd = open_device(devname, &device_bytes, args[3] != NULL, 1, &err); if (fd < 0) { printf("show state: %s\n", err); free(err); diff --git a/tools/mkfs.lafs.c b/tools/mkfs.lafs.c index 20a210d..e91e2db 100644 --- a/tools/mkfs.lafs.c +++ b/tools/mkfs.lafs.c @@ -214,7 +214,7 @@ int main(int argc, char *argv[]) } /* Validate device */ - dev_fd = open_device(devname, &device_bytes, regular_file, &error); + dev_fd = open_device(devname, &device_bytes, regular_file, 0, &error); if (dev_fd < 0) { fprintf(stderr, "mkfs.lafs: %s\n", error); free(error); diff --git a/tools/open_device.c b/tools/open_device.c index bbdb8c6..b2d715b 100644 --- a/tools/open_device.c +++ b/tools/open_device.c @@ -14,7 +14,7 @@ #include "internal.h" int open_device(char *devname, long long *device_bytes, int regular_file, - char **error) + int force, char **error) { /* must be able to get an exclusive open on the device and its size * must be non-trivial @@ -29,7 +29,7 @@ int open_device(char *devname, long long *device_bytes, int regular_file, *error = NULL; if (!regular_file) - fd = open(devname, O_RDWR|O_EXCL); + fd = open(devname, O_RDWR|(force?0:O_EXCL)); else if (*device_bytes) fd = open(devname, O_RDWR|O_CREAT, 0666); else