Useful for looking at the filesystem while the kernel is stuck.
Signed-off-by: NeilBrown <neilb@suse.de>
int open_device(char *devname, long long *device_bytes, int regular_file,
int open_device(char *devname, long long *device_bytes, int regular_file,
+ int force, char **error);
long long parse_size(char *arg, char **error);
long long parse_size(char *arg, char **error);
/*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"},
/*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)
TERMINAL_ARG
};
static void c_add_device(struct state *st, void **args)
- 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);
if (fd < 0) {
printf("add_device: %s\n", err);
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"},
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)
TERMINAL_ARG
};
static void c_load_dev(struct state *st, void **args)
- 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);
if (fd < 0) {
printf("load_dev: %s\n", err);
- 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);
if (fd < 0) {
printf("mount: %s\n", err);
free(err);
- 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);
if (fd < 0) {
printf("show device: %s\n", err);
free(err);
if (!devname)
return;
/* Not already loaded, try to load-and-print */
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);
if (fd < 0) {
printf("show device: %s\n", err);
free(err);
- 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);
if (fd < 0) {
printf("show state: %s\n", err);
free(err);
- 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);
if (dev_fd < 0) {
fprintf(stderr, "mkfs.lafs: %s\n", error);
free(error);
#include "internal.h"
int open_device(char *devname, long long *device_bytes, int regular_file,
#include "internal.h"
int open_device(char *devname, long long *device_bytes, int regular_file,
+ int force, char **error)
{
/* must be able to get an exclusive open on the device and its size
* must be non-trivial
{
/* must be able to get an exclusive open on the device and its size
* must be non-trivial
*error = NULL;
if (!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
else if (*device_bytes)
fd = open(devname, O_RDWR|O_CREAT, 0666);
else