]> git.neil.brown.name Git - lafs-utils.git/commitdiff
lafs: allow some commands to open busy devices with --force master
authorNeilBrown <neilb@suse.de>
Thu, 5 May 2011 06:14:53 +0000 (16:14 +1000)
committerNeilBrown <neilb@suse.de>
Thu, 5 May 2011 06:14:53 +0000 (16:14 +1000)
Useful for looking at the filesystem while the kernel is stuck.

Signed-off-by: NeilBrown <neilb@suse.de>
tools/internal.h
tools/lafs.c
tools/mkfs.lafs.c
tools/open_device.c

index de9a4bdb31375d7004a0b17f8bf4c6245bc2d5c5..50b5d8060f9199f84b3ccf657376391e68ac1eb5 100644 (file)
@@ -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);
index c6d1409549dd97dbf48b848389359552db373920..3ac7578e556fc49377b4e4871a1801148086e6eb 100644 (file)
@@ -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);
index 20a210d83d112b1fac756d296b3d30d5459d2c27..e91e2dbeba8f1bf8056d65e27a366f2b0284fe50 100644 (file)
@@ -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);
index bbdb8c63b1437598e2f95e127f221c1645523e74..b2d715be8805b910a934718f7db49002583fcc79 100644 (file)
@@ -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