summaryrefslogtreecommitdiff
path: root/cmds-device.c
diff options
context:
space:
mode:
Diffstat (limited to 'cmds-device.c')
-rw-r--r--cmds-device.c104
1 files changed, 70 insertions, 34 deletions
diff --git a/cmds-device.c b/cmds-device.c
index 0fc4c7fa..51089bae 100644
--- a/cmds-device.c
+++ b/cmds-device.c
@@ -28,7 +28,7 @@
#include "ioctl.h"
#include "utils.h"
-#include "btrfs_cmds.h"
+#include "commands.h"
/* FIXME - imported cruft, fix sparse errors and warnings */
#ifdef __CHECKER__
@@ -39,12 +39,24 @@ struct btrfs_ioctl_vol_args { char name[BTRFS_VOL_NAME_MAX]; };
static inline int ioctl(int fd, int define, void *arg) { return 0; }
#endif
-int do_add_volume(int nargs, char **args)
-{
+static const char device_cmd_group_usage[] =
+ "btrfs device <command> [<args>]";
+
+static const char * const cmd_add_dev_usage[] = {
+ "btrfs device add <device> [<device>...] <path>",
+ "Add a device to a filesystem",
+ NULL
+};
- char *mntpnt = args[nargs-1];
+static int cmd_add_dev(int argc, char **argv)
+{
+ char *mntpnt;
int i, fdmnt, ret=0, e;
+ if (check_argc_min(argc, 3))
+ usage(cmd_add_dev_usage);
+
+ mntpnt = argv[argc - 1];
fdmnt = open_file_or_dir(mntpnt);
if (fdmnt < 0) {
@@ -52,62 +64,62 @@ int do_add_volume(int nargs, char **args)
return 12;
}
- for (i = 1; i < (nargs-1); i++ ){
+ for (i = 1; i < argc - 1; i++ ){
struct btrfs_ioctl_vol_args ioctl_args;
int devfd, res;
u64 dev_block_count = 0;
struct stat st;
int mixed = 0;
- res = check_mounted(args[i]);
+ res = check_mounted(argv[i]);
if (res < 0) {
fprintf(stderr, "error checking %s mount status\n",
- args[i]);
+ argv[i]);
ret++;
continue;
}
if (res == 1) {
- fprintf(stderr, "%s is mounted\n", args[i]);
+ fprintf(stderr, "%s is mounted\n", argv[i]);
ret++;
continue;
}
- devfd = open(args[i], O_RDWR);
+ devfd = open(argv[i], O_RDWR);
if (!devfd) {
- fprintf(stderr, "ERROR: Unable to open device '%s'\n", args[i]);
+ fprintf(stderr, "ERROR: Unable to open device '%s'\n", argv[i]);
close(devfd);
ret++;
continue;
}
res = fstat(devfd, &st);
if (res) {
- fprintf(stderr, "ERROR: Unable to stat '%s'\n", args[i]);
+ fprintf(stderr, "ERROR: Unable to stat '%s'\n", argv[i]);
close(devfd);
ret++;
continue;
}
if (!S_ISBLK(st.st_mode)) {
- fprintf(stderr, "ERROR: '%s' is not a block device\n", args[i]);
+ fprintf(stderr, "ERROR: '%s' is not a block device\n", argv[i]);
close(devfd);
ret++;
continue;
}
- res = btrfs_prepare_device(devfd, args[i], 1, &dev_block_count, &mixed);
+ res = btrfs_prepare_device(devfd, argv[i], 1, &dev_block_count, &mixed);
if (res) {
- fprintf(stderr, "ERROR: Unable to init '%s'\n", args[i]);
+ fprintf(stderr, "ERROR: Unable to init '%s'\n", argv[i]);
close(devfd);
ret++;
continue;
}
close(devfd);
- strncpy(ioctl_args.name, args[i], BTRFS_PATH_NAME_MAX);
+ strncpy(ioctl_args.name, argv[i], BTRFS_PATH_NAME_MAX);
res = ioctl(fdmnt, BTRFS_IOC_ADD_DEV, &ioctl_args);
e = errno;
if(res<0){
- fprintf(stderr, "ERROR: error adding the device '%s' - %s\n",
- args[i], strerror(e));
+ fprintf(stderr, "ERROR: error adding the device '%s' - %s\n",
+ argv[i], strerror(e));
ret++;
}
@@ -118,31 +130,40 @@ int do_add_volume(int nargs, char **args)
return ret+20;
else
return 0;
-
}
-int do_remove_volume(int nargs, char **args)
-{
+static const char * const cmd_rm_dev_usage[] = {
+ "btrfs device delete <device> [<device>...] <path>",
+ "Remove a device from a filesystem",
+ NULL
+};
- char *mntpnt = args[nargs-1];
+static int cmd_rm_dev(int argc, char **argv)
+{
+ char *mntpnt;
int i, fdmnt, ret=0, e;
+ if (check_argc_min(argc, 3))
+ usage(cmd_rm_dev_usage);
+
+ mntpnt = argv[argc - 1];
+
fdmnt = open_file_or_dir(mntpnt);
if (fdmnt < 0) {
fprintf(stderr, "ERROR: can't access to '%s'\n", mntpnt);
return 12;
}
- for(i=1 ; i < (nargs-1) ; i++ ){
+ for(i=1 ; i < argc - 1; i++ ){
struct btrfs_ioctl_vol_args arg;
int res;
- strncpy(arg.name, args[i], BTRFS_PATH_NAME_MAX);
+ strncpy(arg.name, argv[i], BTRFS_PATH_NAME_MAX);
res = ioctl(fdmnt, BTRFS_IOC_RM_DEV, &arg);
e = errno;
if(res<0){
- fprintf(stderr, "ERROR: error removing the device '%s' - %s\n",
- args[i], strerror(e));
+ fprintf(stderr, "ERROR: error removing the device '%s' - %s\n",
+ argv[i], strerror(e));
ret++;
}
}
@@ -154,18 +175,21 @@ int do_remove_volume(int nargs, char **args)
return 0;
}
-int do_scan(int argc, char **argv)
+static const char * const cmd_scan_dev_usage[] = {
+ "btrfs device scan [<device>...]",
+ "Scan devices for a btrfs filesystem",
+ NULL
+};
+
+static int cmd_scan_dev(int argc, char **argv)
{
int i, fd, e;
int checklist = 1;
int devstart = 1;
- if( argc >= 2 && !strcmp(argv[1],"--all-devices")){
-
- if( argc >2 ){
- fprintf(stderr, "ERROR: too may arguments\n");
- return 22;
- }
+ if( argc > 1 && !strcmp(argv[1],"--all-devices")){
+ if (check_argc_max(argc, 2))
+ usage(cmd_scan_dev_usage);
checklist = 0;
devstart += 1;
@@ -210,7 +234,7 @@ int do_scan(int argc, char **argv)
if( ret < 0 ){
close(fd);
- fprintf(stderr, "ERROR: unable to scan the device '%s' - %s\n",
+ fprintf(stderr, "ERROR: unable to scan the device '%s' - %s\n",
argv[i], strerror(e));
return 11;
}
@@ -218,6 +242,18 @@ int do_scan(int argc, char **argv)
close(fd);
return 0;
-
}
+const struct cmd_group device_cmd_group = {
+ device_cmd_group_usage, NULL, {
+ { "add", cmd_add_dev, cmd_add_dev_usage, NULL, 0 },
+ { "delete", cmd_rm_dev, cmd_rm_dev_usage, NULL, 0 },
+ { "scan", cmd_scan_dev, cmd_scan_dev_usage, NULL, 0 },
+ { 0, 0, 0, 0, 0 }
+ }
+};
+
+int cmd_device(int argc, char **argv)
+{
+ return handle_command_group(&device_cmd_group, argc, argv);
+}