Add the -R switch to allow to delete recursively a subvolume.

Signed-off-by: Goffredo Baroncelli <kreij...@inwind.it>
---
 cmds-subvolume.c | 107 +++++++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 89 insertions(+), 18 deletions(-)

diff --git a/cmds-subvolume.c b/cmds-subvolume.c
index 477919c..422e1fc 100644
--- a/cmds-subvolume.c
+++ b/cmds-subvolume.c
@@ -201,28 +201,15 @@ int test_issubvolume(char *path)
        return (st.st_ino == 256) && S_ISDIR(st.st_mode);
 }
 
-static const char * const cmd_subvol_delete_usage[] = {
-       "btrfs subvolume delete <subvolume> [<subvolume>...]",
-       "Delete subvolume(s)",
-       NULL
-};
-
-static int cmd_subvol_delete(int argc, char **argv)
+static int do_subvol_delete(char *path)
 {
-       int     res, fd, len, e, cnt = 1, ret = 0;
+       int     res, fd, len, e, ret = 0;
        struct btrfs_ioctl_vol_args     args;
        char    *dname, *vname, *cpath;
        char    *dupdname = NULL;
        char    *dupvname = NULL;
-       char    *path;
        DIR     *dirstream = NULL;
 
-       if (argc < 2)
-               usage(cmd_subvol_delete_usage);
-
-again:
-       path = argv[cnt];
-
        res = test_issubvolume(path);
        if (res < 0) {
                fprintf(stderr, "ERROR: error accessing '%s'\n", path);
@@ -290,9 +277,93 @@ out:
        free(dupvname);
        dupdname = NULL;
        dupvname = NULL;
-       cnt++;
-       if (cnt < argc)
-               goto again;
+
+       return ret;
+}
+
+static int do_subvol_delete_func(char *real_root, char *relative_root,
+                                char *path, void *data)
+{
+       char *dpath, *real_path;
+       int ret;
+       (void)data;             /* ignore the parameter */
+       (void)real_root;        /* ignore the parameter */
+
+       dpath = pathjoin(relative_root, path, NULL);
+       if (!dpath) {
+               fprintf(stderr, "ERROR: not enough memory\n");
+               return -1;
+       }
+       real_path = realpath(dpath, NULL);
+       if (!real_path) {
+               free(dpath);
+               fprintf(stderr, "ERROR: not enough memory\n");
+               return -1;
+       }
+
+       ret = do_subvol_delete(real_path);
+       free(real_path);
+       free(dpath);
+
+       return ret;
+}
+
+static inline int do_subvol_delete_rec(char *path)
+{
+       return traverse_list_subvol_rec(path, /* filesystem subvolume  */
+                               0,    /* false = only below this path */
+                               1,    /* ascending order */
+                               do_subvol_delete_func, /* func to call */
+                               NULL);  /* parameter to pass to func */
+}
+
+static const char * const cmd_subvol_delete_usage[] = {
+       "btrfs subvolume delete [-R] <subvolume> [<subvolume>...]",
+       "Delete subvolume(s)",
+       "",
+       "-R        delete recursively",
+       NULL
+};
+
+static int cmd_subvol_delete(int argc, char **argv)
+{
+       int     rec = 0, ret = 0, i;
+
+       optind = 1;
+       while(1) {
+               int c;
+               c = getopt_long(argc, argv, "R", NULL, NULL);
+               if (c < 0)
+                       break;
+
+               switch(c) {
+               case 'R':
+                       rec = 1;
+                       break;
+               default:
+                       ret = 2;
+                       goto out;
+               }
+       }
+
+       if (check_argc_min(argc - optind, 1)) {
+               usage(cmd_subvol_delete_usage);
+               ret = 1;
+               goto out;
+       }
+
+       for ( i = optind ; i < argc ; i++ ) {
+
+               if (rec)
+                       ret = do_subvol_delete_rec(argv[i]);
+               else
+                       ret = do_subvol_delete(argv[i]);
+
+               if (ret)
+                       break;
+
+       }
+out:
 
        return ret;
 }
-- 
1.8.4.3

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to