All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support
@ 2011-09-01  8:52 Jeff Liu
  2011-09-01 11:52 ` [PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support V2 Jeff Liu
  0 siblings, 1 reply; 9+ messages in thread
From: Jeff Liu @ 2011-09-01  8:52 UTC (permalink / raw)
  To: linux-btrfs; +Cc: chris.mason

Hello,

This patch make use of the new ioctl(2) to set Btrfs label via `btrfs 
filesystem label` command.

  Signed-off-by: Jie Liu <jeff.liu@oracle.com>

---
  btrfs.c      |    7 +++----
  btrfs_cmds.c |   27 +++++++++++++++++++++++++++
  btrfs_cmds.h |    1 +
  ctree.h      |    6 ++++++
  ioctl.h      |    2 ++
  mkfs.c       |   19 -------------------
  utils.c      |   18 ++++++++++++++++++
  utils.h      |    1 +
  8 files changed, 58 insertions(+), 23 deletions(-)

diff --git a/btrfs.c b/btrfs.c
index 46314cf..6d414f1 100644
--- a/btrfs.c
+++ b/btrfs.c
@@ -108,11 +108,10 @@ static struct Command commands[] = {
        "device delete", "<dev> [<dev>..] <path>\n"
          "Remove a device from a filesystem."
      },
-    /* coming soon
-    { 2, "filesystem label", "<label> <path>\n"
+    { do_set_label, 2,
+      "filesystem label", "<label> <path>\n"
          "Set the label of a filesystem"
-    }
-    */
+    },
      { 0, 0 , 0 }
  };

diff --git a/btrfs_cmds.c b/btrfs_cmds.c
index 8031c58..8d2b8e1 100644
--- a/btrfs_cmds.c
+++ b/btrfs_cmds.c
@@ -834,6 +834,33 @@ int do_set_default_subvol(int nargs, char **argv)
      return 0;
  }

+int do_set_label(int nargs, char **argv)
+{
+    int    fd, ret = 0;
+    char    *path = argv[2];
+    char    *label = parse_label(argv[1]);
+    size_t    len = strlen(label);
+    struct    btrfs_ioctl_fs_label_args label_args;
+
+    fd = open_file_or_dir(path);
+    if (fd < 0) {
+        fprintf(stderr, "ERROR: can't access to '%s'\n", path);
+        return 12;
+    }
+
+    label_args.len = len;
+    snprintf(label_args.label, BTRFS_LABEL_SIZE, "%s", label);
+    ret = ioctl(fd, BTRFS_IOC_FS_SETLABEL, &label_args);
+    close(fd);
+    free(label);
+    if(ret < 0) {
+        fprintf(stderr, "ERROR: unable to set a new label\n");
+        return 30;
+    }
+
+    return 0;
+}
+
  int do_df_filesystem(int nargs, char **argv)
  {
      struct btrfs_ioctl_space_args *sargs;
diff --git a/btrfs_cmds.h b/btrfs_cmds.h
index 7bde191..29ded22 100644
--- a/btrfs_cmds.h
+++ b/btrfs_cmds.h
@@ -32,3 +32,4 @@ int list_subvols(int fd);
  int do_df_filesystem(int nargs, char **argv);
  int find_updated_files(int fd, u64 root_id, u64 oldest_gen);
  int do_find_newer(int argc, char **argv);
+int do_set_label(int argc, char **argv);
diff --git a/ctree.h b/ctree.h
index b79e238..4924b88 100644
--- a/ctree.h
+++ b/ctree.h
@@ -345,6 +345,12 @@ struct btrfs_super_block {
      u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
  } __attribute__ ((__packed__));

+struct btrfs_ioctl_fs_label_args {
+    /* label length in bytes */
+    __u32 len;
+    char label[BTRFS_LABEL_SIZE];
+};
+
  /*
   * Compat flags that we support.  If any incompat flags are set other 
than the
   * ones specified below then we will fail to mount
diff --git a/ioctl.h b/ioctl.h
index 776d7a9..5750f3a 100644
--- a/ioctl.h
+++ b/ioctl.h
@@ -169,4 +169,6 @@ struct btrfs_ioctl_space_args {
  #define BTRFS_IOC_DEFAULT_SUBVOL _IOW(BTRFS_IOCTL_MAGIC, 19, u64)
  #define BTRFS_IOC_SPACE_INFO _IOWR(BTRFS_IOCTL_MAGIC, 20, \
                      struct btrfs_ioctl_space_args)
+#define BTRFS_IOC_FS_SETLABEL _IOW(BTRFS_IOCTL_MAGIC, 32, \
+                   struct btrfs_ioctl_fs_label_args)
  #endif
diff --git a/mkfs.c b/mkfs.c
index 1598aae..93c1636 100644
--- a/mkfs.c
+++ b/mkfs.c
@@ -303,25 +303,6 @@ static u64 parse_profile(char *s)
      return 0;
  }

-static char *parse_label(char *input)
-{
-    int i;
-    int len = strlen(input);
-
-    if (len >= BTRFS_LABEL_SIZE) {
-        fprintf(stderr, "Label %s is too long (max %d)\n", input,
-            BTRFS_LABEL_SIZE - 1);
-        exit(1);
-    }
-    for (i = 0; i < len; i++) {
-        if (input[i] == '/' || input[i] == '\\') {
-            fprintf(stderr, "invalid label %s\n", input);
-            exit(1);
-        }
-    }
-    return strdup(input);
-}
-
  static struct option long_options[] = {
      { "alloc-start", 1, NULL, 'A'},
      { "byte-count", 1, NULL, 'b' },
diff --git a/utils.c b/utils.c
index fd894f3..5d77503 100644
--- a/utils.c
+++ b/utils.c
@@ -993,3 +993,21 @@ char *pretty_sizes(u64 size)
      return pretty;
  }

+char *parse_label(const char *input)
+{
+    int i;
+    int len = strlen(input);
+
+    if (len >= BTRFS_LABEL_SIZE) {
+        fprintf(stderr, "Label %s is too long (max %d)\n", input,
+            BTRFS_LABEL_SIZE - 1);
+        exit(1);
+    }
+    for (i = 0; i < len; i++) {
+        if (input[i] == '/' || input[i] == '\\') {
+            fprintf(stderr, "invalid label %s\n", input);
+            exit(1);
+        }
+    }
+    return strdup(input);
+}
diff --git a/utils.h b/utils.h
index 9dce5b0..9212a75 100644
--- a/utils.h
+++ b/utils.h
@@ -40,4 +40,5 @@ int check_mounted(const char *devicename);
  int btrfs_device_already_in_root(struct btrfs_root *root, int fd,
                   int super_offset);
  char *pretty_sizes(u64 size);
+char *parse_label(const char *);
  #endif
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support V2
  2011-09-01  8:52 [PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support Jeff Liu
@ 2011-09-01 11:52 ` Jeff Liu
  2011-09-02 12:52   ` David Sterba
  0 siblings, 1 reply; 9+ messages in thread
From: Jeff Liu @ 2011-09-01 11:52 UTC (permalink / raw)
  To: linux-btrfs; +Cc: Hugo Mills, chris.mason

Revise the patch according to kernel side change.

  Signed-off-by: Jie Liu <jeff.liu@oracle.com>

---
  btrfs.c      |    7 +++----
  btrfs_cmds.c |   34 ++++++++++++++++++++++++++++++++++
  btrfs_cmds.h |    1 +
  ctree.h      |    4 ++++
  ioctl.h      |    2 ++
  mkfs.c       |   19 -------------------
  utils.c      |   18 ++++++++++++++++++
  utils.h      |    1 +
  8 files changed, 63 insertions(+), 23 deletions(-)

diff --git a/btrfs.c b/btrfs.c
index 46314cf..6d414f1 100644
--- a/btrfs.c
+++ b/btrfs.c
@@ -108,11 +108,10 @@ static struct Command commands[] = {
        "device delete", "<dev> [<dev>..] <path>\n"
          "Remove a device from a filesystem."
      },
-    /* coming soon
-    { 2, "filesystem label", "<label> <path>\n"
+    { do_set_label, 2,
+      "filesystem label", "<label> <path>\n"
          "Set the label of a filesystem"
-    }
-    */
+    },
      { 0, 0 , 0 }
  };

diff --git a/btrfs_cmds.c b/btrfs_cmds.c
index 8031c58..2a879c0 100644
--- a/btrfs_cmds.c
+++ b/btrfs_cmds.c
@@ -834,6 +834,40 @@ int do_set_default_subvol(int nargs, char **argv)
      return 0;
  }

+int do_set_label(int nargs, char **argv)
+{
+    int    fd, ret;
+    char    *path = argv[2];
+    char    *label = parse_label(argv[1]);
+    size_t    len = strlen(label);
+    struct    btrfs_ioctl_fs_label_args label_args;
+
+    if (len == 0 || len >= BTRFS_LABEL_SIZE) {
+        fprintf(stderr, "ERROR: label length too long ('%s')\n",
+            label);
+        free(label);
+        return 14;
+    }
+
+    fd = open_file_or_dir(path);
+    if (fd < 0) {
+        free(label);
+        fprintf(stderr, "ERROR: can't access to '%s'\n", path);
+        return 12;
+    }
+
+    strcpy(label_args.label, label);
+    ret = ioctl(fd, BTRFS_IOC_FS_SETLABEL, &label_args);
+    close(fd);
+    free(label);
+    if(ret < 0) {
+        fprintf(stderr, "ERROR: unable to set a new label\n");
+        return 30;
+    }
+
+    return 0;
+}
+
  int do_df_filesystem(int nargs, char **argv)
  {
      struct btrfs_ioctl_space_args *sargs;
diff --git a/btrfs_cmds.h b/btrfs_cmds.h
index 7bde191..29ded22 100644
--- a/btrfs_cmds.h
+++ b/btrfs_cmds.h
@@ -32,3 +32,4 @@ int list_subvols(int fd);
  int do_df_filesystem(int nargs, char **argv);
  int find_updated_files(int fd, u64 root_id, u64 oldest_gen);
  int do_find_newer(int argc, char **argv);
+int do_set_label(int argc, char **argv);
diff --git a/ctree.h b/ctree.h
index b79e238..745879b 100644
--- a/ctree.h
+++ b/ctree.h
@@ -345,6 +345,10 @@ struct btrfs_super_block {
      u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
  } __attribute__ ((__packed__));

+struct btrfs_ioctl_fs_label_args {
+    char label[BTRFS_LABEL_SIZE];
+};
+
  /*
   * Compat flags that we support.  If any incompat flags are set other 
than the
   * ones specified below then we will fail to mount
diff --git a/ioctl.h b/ioctl.h
index 776d7a9..98acd63 100644
--- a/ioctl.h
+++ b/ioctl.h
@@ -140,6 +140,8 @@ struct btrfs_ioctl_space_args {
                     struct btrfs_ioctl_vol_args)
  #define BTRFS_IOC_SCAN_DEV _IOW(BTRFS_IOCTL_MAGIC, 4, \
                     struct btrfs_ioctl_vol_args)
+#define BTRFS_IOC_FS_SETLABEL _IOW(BTRFS_IOCTL_MAGIC, 5, \
+                   struct btrfs_ioctl_fs_label_args)
  /* trans start and trans end are dangerous, and only for
   * use by applications that know how to avoid the
   * resulting deadlocks
diff --git a/mkfs.c b/mkfs.c
index 1598aae..93c1636 100644
--- a/mkfs.c
+++ b/mkfs.c
@@ -303,25 +303,6 @@ static u64 parse_profile(char *s)
      return 0;
  }

-static char *parse_label(char *input)
-{
-    int i;
-    int len = strlen(input);
-
-    if (len >= BTRFS_LABEL_SIZE) {
-        fprintf(stderr, "Label %s is too long (max %d)\n", input,
-            BTRFS_LABEL_SIZE - 1);
-        exit(1);
-    }
-    for (i = 0; i < len; i++) {
-        if (input[i] == '/' || input[i] == '\\') {
-            fprintf(stderr, "invalid label %s\n", input);
-            exit(1);
-        }
-    }
-    return strdup(input);
-}
-
  static struct option long_options[] = {
      { "alloc-start", 1, NULL, 'A'},
      { "byte-count", 1, NULL, 'b' },
diff --git a/utils.c b/utils.c
index fd894f3..5d77503 100644
--- a/utils.c
+++ b/utils.c
@@ -993,3 +993,21 @@ char *pretty_sizes(u64 size)
      return pretty;
  }

+char *parse_label(const char *input)
+{
+    int i;
+    int len = strlen(input);
+
+    if (len >= BTRFS_LABEL_SIZE) {
+        fprintf(stderr, "Label %s is too long (max %d)\n", input,
+            BTRFS_LABEL_SIZE - 1);
+        exit(1);
+    }
+    for (i = 0; i < len; i++) {
+        if (input[i] == '/' || input[i] == '\\') {
+            fprintf(stderr, "invalid label %s\n", input);
+            exit(1);
+        }
+    }
+    return strdup(input);
+}
diff --git a/utils.h b/utils.h
index 9dce5b0..9212a75 100644
--- a/utils.h
+++ b/utils.h
@@ -40,4 +40,5 @@ int check_mounted(const char *devicename);
  int btrfs_device_already_in_root(struct btrfs_root *root, int fd,
                   int super_offset);
  char *pretty_sizes(u64 size);
+char *parse_label(const char *);
  #endif
-- 
1.7.4.1

On 09/01/2011 04:52 PM, Jeff Liu wrote:
> Hello,
>
> This patch make use of the new ioctl(2) to set Btrfs label via `btrfs 
> filesystem label` command.
>
>  Signed-off-by: Jie Liu <jeff.liu@oracle.com>
>
> ---
>  btrfs.c      |    7 +++----
>  btrfs_cmds.c |   27 +++++++++++++++++++++++++++
>  btrfs_cmds.h |    1 +
>  ctree.h      |    6 ++++++
>  ioctl.h      |    2 ++
>  mkfs.c       |   19 -------------------
>  utils.c      |   18 ++++++++++++++++++
>  utils.h      |    1 +
>  8 files changed, 58 insertions(+), 23 deletions(-)
>
> diff --git a/btrfs.c b/btrfs.c
> index 46314cf..6d414f1 100644
> --- a/btrfs.c
> +++ b/btrfs.c
> @@ -108,11 +108,10 @@ static struct Command commands[] = {
>        "device delete", "<dev> [<dev>..] <path>\n"
>          "Remove a device from a filesystem."
>      },
> -    /* coming soon
> -    { 2, "filesystem label", "<label> <path>\n"
> +    { do_set_label, 2,
> +      "filesystem label", "<label> <path>\n"
>          "Set the label of a filesystem"
> -    }
> -    */
> +    },
>      { 0, 0 , 0 }
>  };
>
> diff --git a/btrfs_cmds.c b/btrfs_cmds.c
> index 8031c58..8d2b8e1 100644
> --- a/btrfs_cmds.c
> +++ b/btrfs_cmds.c
> @@ -834,6 +834,33 @@ int do_set_default_subvol(int nargs, char **argv)
>      return 0;
>  }
>
> +int do_set_label(int nargs, char **argv)
> +{
> +    int    fd, ret = 0;
> +    char    *path = argv[2];
> +    char    *label = parse_label(argv[1]);
> +    size_t    len = strlen(label);
> +    struct    btrfs_ioctl_fs_label_args label_args;
> +
> +    fd = open_file_or_dir(path);
> +    if (fd < 0) {
> +        fprintf(stderr, "ERROR: can't access to '%s'\n", path);
> +        return 12;
> +    }
> +
> +    label_args.len = len;
> +    snprintf(label_args.label, BTRFS_LABEL_SIZE, "%s", label);
> +    ret = ioctl(fd, BTRFS_IOC_FS_SETLABEL, &label_args);
> +    close(fd);
> +    free(label);
> +    if(ret < 0) {
> +        fprintf(stderr, "ERROR: unable to set a new label\n");
> +        return 30;
> +    }
> +
> +    return 0;
> +}
> +
>  int do_df_filesystem(int nargs, char **argv)
>  {
>      struct btrfs_ioctl_space_args *sargs;
> diff --git a/btrfs_cmds.h b/btrfs_cmds.h
> index 7bde191..29ded22 100644
> --- a/btrfs_cmds.h
> +++ b/btrfs_cmds.h
> @@ -32,3 +32,4 @@ int list_subvols(int fd);
>  int do_df_filesystem(int nargs, char **argv);
>  int find_updated_files(int fd, u64 root_id, u64 oldest_gen);
>  int do_find_newer(int argc, char **argv);
> +int do_set_label(int argc, char **argv);
> diff --git a/ctree.h b/ctree.h
> index b79e238..4924b88 100644
> --- a/ctree.h
> +++ b/ctree.h
> @@ -345,6 +345,12 @@ struct btrfs_super_block {
>      u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
>  } __attribute__ ((__packed__));
>
> +struct btrfs_ioctl_fs_label_args {
> +    /* label length in bytes */
> +    __u32 len;
> +    char label[BTRFS_LABEL_SIZE];
> +};
> +
>  /*
>   * Compat flags that we support.  If any incompat flags are set other 
> than the
>   * ones specified below then we will fail to mount
> diff --git a/ioctl.h b/ioctl.h
> index 776d7a9..5750f3a 100644
> --- a/ioctl.h
> +++ b/ioctl.h
> @@ -169,4 +169,6 @@ struct btrfs_ioctl_space_args {
>  #define BTRFS_IOC_DEFAULT_SUBVOL _IOW(BTRFS_IOCTL_MAGIC, 19, u64)
>  #define BTRFS_IOC_SPACE_INFO _IOWR(BTRFS_IOCTL_MAGIC, 20, \
>                      struct btrfs_ioctl_space_args)
> +#define BTRFS_IOC_FS_SETLABEL _IOW(BTRFS_IOCTL_MAGIC, 32, \
> +                   struct btrfs_ioctl_fs_label_args)
>  #endif
> diff --git a/mkfs.c b/mkfs.c
> index 1598aae..93c1636 100644
> --- a/mkfs.c
> +++ b/mkfs.c
> @@ -303,25 +303,6 @@ static u64 parse_profile(char *s)
>      return 0;
>  }
>
> -static char *parse_label(char *input)
> -{
> -    int i;
> -    int len = strlen(input);
> -
> -    if (len >= BTRFS_LABEL_SIZE) {
> -        fprintf(stderr, "Label %s is too long (max %d)\n", input,
> -            BTRFS_LABEL_SIZE - 1);
> -        exit(1);
> -    }
> -    for (i = 0; i < len; i++) {
> -        if (input[i] == '/' || input[i] == '\\') {
> -            fprintf(stderr, "invalid label %s\n", input);
> -            exit(1);
> -        }
> -    }
> -    return strdup(input);
> -}
> -
>  static struct option long_options[] = {
>      { "alloc-start", 1, NULL, 'A'},
>      { "byte-count", 1, NULL, 'b' },
> diff --git a/utils.c b/utils.c
> index fd894f3..5d77503 100644
> --- a/utils.c
> +++ b/utils.c
> @@ -993,3 +993,21 @@ char *pretty_sizes(u64 size)
>      return pretty;
>  }
>
> +char *parse_label(const char *input)
> +{
> +    int i;
> +    int len = strlen(input);
> +
> +    if (len >= BTRFS_LABEL_SIZE) {
> +        fprintf(stderr, "Label %s is too long (max %d)\n", input,
> +            BTRFS_LABEL_SIZE - 1);
> +        exit(1);
> +    }
> +    for (i = 0; i < len; i++) {
> +        if (input[i] == '/' || input[i] == '\\') {
> +            fprintf(stderr, "invalid label %s\n", input);
> +            exit(1);
> +        }
> +    }
> +    return strdup(input);
> +}
> diff --git a/utils.h b/utils.h
> index 9dce5b0..9212a75 100644
> --- a/utils.h
> +++ b/utils.h
> @@ -40,4 +40,5 @@ int check_mounted(const char *devicename);
>  int btrfs_device_already_in_root(struct btrfs_root *root, int fd,
>                   int super_offset);
>  char *pretty_sizes(u64 size);
> +char *parse_label(const char *);
>  #endif


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support V2
  2011-09-01 11:52 ` [PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support V2 Jeff Liu
@ 2011-09-02 12:52   ` David Sterba
  2011-09-02 13:13     ` Jeff Liu
  0 siblings, 1 reply; 9+ messages in thread
From: David Sterba @ 2011-09-02 12:52 UTC (permalink / raw)
  To: Jeff Liu; +Cc: linux-btrfs, Hugo Mills, chris.mason

Hi,

are you aware that there is a label support already? Though only for
unmounted system, but please have a look at these patches:

https://patchwork.kernel.org/patch/381141/
https://patchwork.kernel.org/patch/842602/

and the patches are part of Hugo's integration for a long time, rather
check latest versions so you do not duplicate work.

On Thu, Sep 01, 2011 at 07:52:54PM +0800, Jeff Liu wrote:
> Revise the patch according to kernel side change.

Leave original commit message. If you want to document changes between
revised patch version put them ...

> 
>  Signed-off-by: Jie Liu <jeff.liu@oracle.com>
> 
> ---

... here. Git will ignore them when applying the message.


HTH,
david

>  btrfs.c      |    7 +++----
>  btrfs_cmds.c |   34 ++++++++++++++++++++++++++++++++++
>  btrfs_cmds.h |    1 +
>  ctree.h      |    4 ++++
>  ioctl.h      |    2 ++
>  mkfs.c       |   19 -------------------
>  utils.c      |   18 ++++++++++++++++++
>  utils.h      |    1 +
>  8 files changed, 63 insertions(+), 23 deletions(-)
> 
> diff --git a/btrfs.c b/btrfs.c
> index 46314cf..6d414f1 100644
> --- a/btrfs.c
> +++ b/btrfs.c
> @@ -108,11 +108,10 @@ static struct Command commands[] = {
>        "device delete", "<dev> [<dev>..] <path>\n"
>          "Remove a device from a filesystem."
>      },
> -    /* coming soon
> -    { 2, "filesystem label", "<label> <path>\n"
> +    { do_set_label, 2,
> +      "filesystem label", "<label> <path>\n"
>          "Set the label of a filesystem"
> -    }
> -    */
> +    },
>      { 0, 0 , 0 }
>  };
> 
> diff --git a/btrfs_cmds.c b/btrfs_cmds.c
> index 8031c58..2a879c0 100644
> --- a/btrfs_cmds.c
> +++ b/btrfs_cmds.c
> @@ -834,6 +834,40 @@ int do_set_default_subvol(int nargs, char **argv)
>      return 0;
>  }
> 
> +int do_set_label(int nargs, char **argv)
> +{
> +    int    fd, ret;
> +    char    *path = argv[2];
> +    char    *label = parse_label(argv[1]);
> +    size_t    len = strlen(label);
> +    struct    btrfs_ioctl_fs_label_args label_args;
> +
> +    if (len == 0 || len >= BTRFS_LABEL_SIZE) {
> +        fprintf(stderr, "ERROR: label length too long ('%s')\n",
> +            label);
> +        free(label);
> +        return 14;
> +    }
> +
> +    fd = open_file_or_dir(path);
> +    if (fd < 0) {
> +        free(label);
> +        fprintf(stderr, "ERROR: can't access to '%s'\n", path);
> +        return 12;
> +    }
> +
> +    strcpy(label_args.label, label);
> +    ret = ioctl(fd, BTRFS_IOC_FS_SETLABEL, &label_args);
> +    close(fd);
> +    free(label);
> +    if(ret < 0) {
> +        fprintf(stderr, "ERROR: unable to set a new label\n");
> +        return 30;
> +    }
> +
> +    return 0;
> +}
> +
>  int do_df_filesystem(int nargs, char **argv)
>  {
>      struct btrfs_ioctl_space_args *sargs;
> diff --git a/btrfs_cmds.h b/btrfs_cmds.h
> index 7bde191..29ded22 100644
> --- a/btrfs_cmds.h
> +++ b/btrfs_cmds.h
> @@ -32,3 +32,4 @@ int list_subvols(int fd);
>  int do_df_filesystem(int nargs, char **argv);
>  int find_updated_files(int fd, u64 root_id, u64 oldest_gen);
>  int do_find_newer(int argc, char **argv);
> +int do_set_label(int argc, char **argv);
> diff --git a/ctree.h b/ctree.h
> index b79e238..745879b 100644
> --- a/ctree.h
> +++ b/ctree.h
> @@ -345,6 +345,10 @@ struct btrfs_super_block {
>      u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
>  } __attribute__ ((__packed__));
> 
> +struct btrfs_ioctl_fs_label_args {
> +    char label[BTRFS_LABEL_SIZE];
> +};
> +
>  /*
>   * Compat flags that we support.  If any incompat flags are set
> other than the
>   * ones specified below then we will fail to mount
> diff --git a/ioctl.h b/ioctl.h
> index 776d7a9..98acd63 100644
> --- a/ioctl.h
> +++ b/ioctl.h
> @@ -140,6 +140,8 @@ struct btrfs_ioctl_space_args {
>                     struct btrfs_ioctl_vol_args)
>  #define BTRFS_IOC_SCAN_DEV _IOW(BTRFS_IOCTL_MAGIC, 4, \
>                     struct btrfs_ioctl_vol_args)
> +#define BTRFS_IOC_FS_SETLABEL _IOW(BTRFS_IOCTL_MAGIC, 5, \
> +                   struct btrfs_ioctl_fs_label_args)
>  /* trans start and trans end are dangerous, and only for
>   * use by applications that know how to avoid the
>   * resulting deadlocks
> diff --git a/mkfs.c b/mkfs.c
> index 1598aae..93c1636 100644
> --- a/mkfs.c
> +++ b/mkfs.c
> @@ -303,25 +303,6 @@ static u64 parse_profile(char *s)
>      return 0;
>  }
> 
> -static char *parse_label(char *input)
> -{
> -    int i;
> -    int len = strlen(input);
> -
> -    if (len >= BTRFS_LABEL_SIZE) {
> -        fprintf(stderr, "Label %s is too long (max %d)\n", input,
> -            BTRFS_LABEL_SIZE - 1);
> -        exit(1);
> -    }
> -    for (i = 0; i < len; i++) {
> -        if (input[i] == '/' || input[i] == '\\') {
> -            fprintf(stderr, "invalid label %s\n", input);
> -            exit(1);
> -        }
> -    }
> -    return strdup(input);
> -}
> -
>  static struct option long_options[] = {
>      { "alloc-start", 1, NULL, 'A'},
>      { "byte-count", 1, NULL, 'b' },
> diff --git a/utils.c b/utils.c
> index fd894f3..5d77503 100644
> --- a/utils.c
> +++ b/utils.c
> @@ -993,3 +993,21 @@ char *pretty_sizes(u64 size)
>      return pretty;
>  }
> 
> +char *parse_label(const char *input)
> +{
> +    int i;
> +    int len = strlen(input);
> +
> +    if (len >= BTRFS_LABEL_SIZE) {
> +        fprintf(stderr, "Label %s is too long (max %d)\n", input,
> +            BTRFS_LABEL_SIZE - 1);
> +        exit(1);
> +    }
> +    for (i = 0; i < len; i++) {
> +        if (input[i] == '/' || input[i] == '\\') {
> +            fprintf(stderr, "invalid label %s\n", input);
> +            exit(1);
> +        }
> +    }
> +    return strdup(input);
> +}
> diff --git a/utils.h b/utils.h
> index 9dce5b0..9212a75 100644
> --- a/utils.h
> +++ b/utils.h
> @@ -40,4 +40,5 @@ int check_mounted(const char *devicename);
>  int btrfs_device_already_in_root(struct btrfs_root *root, int fd,
>                   int super_offset);
>  char *pretty_sizes(u64 size);
> +char *parse_label(const char *);
>  #endif
> -- 
> 1.7.4.1
> 
> On 09/01/2011 04:52 PM, Jeff Liu wrote:
> >Hello,
> >
> >This patch make use of the new ioctl(2) to set Btrfs label via
> >`btrfs filesystem label` command.
> >
> > Signed-off-by: Jie Liu <jeff.liu@oracle.com>
> >
> >---
> > btrfs.c      |    7 +++----
> > btrfs_cmds.c |   27 +++++++++++++++++++++++++++
> > btrfs_cmds.h |    1 +
> > ctree.h      |    6 ++++++
> > ioctl.h      |    2 ++
> > mkfs.c       |   19 -------------------
> > utils.c      |   18 ++++++++++++++++++
> > utils.h      |    1 +
> > 8 files changed, 58 insertions(+), 23 deletions(-)
> >
> >diff --git a/btrfs.c b/btrfs.c
> >index 46314cf..6d414f1 100644
> >--- a/btrfs.c
> >+++ b/btrfs.c
> >@@ -108,11 +108,10 @@ static struct Command commands[] = {
> >       "device delete", "<dev> [<dev>..] <path>\n"
> >         "Remove a device from a filesystem."
> >     },
> >-    /* coming soon
> >-    { 2, "filesystem label", "<label> <path>\n"
> >+    { do_set_label, 2,
> >+      "filesystem label", "<label> <path>\n"
> >         "Set the label of a filesystem"
> >-    }
> >-    */
> >+    },
> >     { 0, 0 , 0 }
> > };
> >
> >diff --git a/btrfs_cmds.c b/btrfs_cmds.c
> >index 8031c58..8d2b8e1 100644
> >--- a/btrfs_cmds.c
> >+++ b/btrfs_cmds.c
> >@@ -834,6 +834,33 @@ int do_set_default_subvol(int nargs, char **argv)
> >     return 0;
> > }
> >
> >+int do_set_label(int nargs, char **argv)
> >+{
> >+    int    fd, ret = 0;
> >+    char    *path = argv[2];
> >+    char    *label = parse_label(argv[1]);
> >+    size_t    len = strlen(label);
> >+    struct    btrfs_ioctl_fs_label_args label_args;
> >+
> >+    fd = open_file_or_dir(path);
> >+    if (fd < 0) {
> >+        fprintf(stderr, "ERROR: can't access to '%s'\n", path);
> >+        return 12;
> >+    }
> >+
> >+    label_args.len = len;
> >+    snprintf(label_args.label, BTRFS_LABEL_SIZE, "%s", label);
> >+    ret = ioctl(fd, BTRFS_IOC_FS_SETLABEL, &label_args);
> >+    close(fd);
> >+    free(label);
> >+    if(ret < 0) {
> >+        fprintf(stderr, "ERROR: unable to set a new label\n");
> >+        return 30;
> >+    }
> >+
> >+    return 0;
> >+}
> >+
> > int do_df_filesystem(int nargs, char **argv)
> > {
> >     struct btrfs_ioctl_space_args *sargs;
> >diff --git a/btrfs_cmds.h b/btrfs_cmds.h
> >index 7bde191..29ded22 100644
> >--- a/btrfs_cmds.h
> >+++ b/btrfs_cmds.h
> >@@ -32,3 +32,4 @@ int list_subvols(int fd);
> > int do_df_filesystem(int nargs, char **argv);
> > int find_updated_files(int fd, u64 root_id, u64 oldest_gen);
> > int do_find_newer(int argc, char **argv);
> >+int do_set_label(int argc, char **argv);
> >diff --git a/ctree.h b/ctree.h
> >index b79e238..4924b88 100644
> >--- a/ctree.h
> >+++ b/ctree.h
> >@@ -345,6 +345,12 @@ struct btrfs_super_block {
> >     u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
> > } __attribute__ ((__packed__));
> >
> >+struct btrfs_ioctl_fs_label_args {
> >+    /* label length in bytes */
> >+    __u32 len;
> >+    char label[BTRFS_LABEL_SIZE];
> >+};
> >+
> > /*
> >  * Compat flags that we support.  If any incompat flags are set
> >other than the
> >  * ones specified below then we will fail to mount
> >diff --git a/ioctl.h b/ioctl.h
> >index 776d7a9..5750f3a 100644
> >--- a/ioctl.h
> >+++ b/ioctl.h
> >@@ -169,4 +169,6 @@ struct btrfs_ioctl_space_args {
> > #define BTRFS_IOC_DEFAULT_SUBVOL _IOW(BTRFS_IOCTL_MAGIC, 19, u64)
> > #define BTRFS_IOC_SPACE_INFO _IOWR(BTRFS_IOCTL_MAGIC, 20, \
> >                     struct btrfs_ioctl_space_args)
> >+#define BTRFS_IOC_FS_SETLABEL _IOW(BTRFS_IOCTL_MAGIC, 32, \
> >+                   struct btrfs_ioctl_fs_label_args)
> > #endif
> >diff --git a/mkfs.c b/mkfs.c
> >index 1598aae..93c1636 100644
> >--- a/mkfs.c
> >+++ b/mkfs.c
> >@@ -303,25 +303,6 @@ static u64 parse_profile(char *s)
> >     return 0;
> > }
> >
> >-static char *parse_label(char *input)
> >-{
> >-    int i;
> >-    int len = strlen(input);
> >-
> >-    if (len >= BTRFS_LABEL_SIZE) {
> >-        fprintf(stderr, "Label %s is too long (max %d)\n", input,
> >-            BTRFS_LABEL_SIZE - 1);
> >-        exit(1);
> >-    }
> >-    for (i = 0; i < len; i++) {
> >-        if (input[i] == '/' || input[i] == '\\') {
> >-            fprintf(stderr, "invalid label %s\n", input);
> >-            exit(1);
> >-        }
> >-    }
> >-    return strdup(input);
> >-}
> >-
> > static struct option long_options[] = {
> >     { "alloc-start", 1, NULL, 'A'},
> >     { "byte-count", 1, NULL, 'b' },
> >diff --git a/utils.c b/utils.c
> >index fd894f3..5d77503 100644
> >--- a/utils.c
> >+++ b/utils.c
> >@@ -993,3 +993,21 @@ char *pretty_sizes(u64 size)
> >     return pretty;
> > }
> >
> >+char *parse_label(const char *input)
> >+{
> >+    int i;
> >+    int len = strlen(input);
> >+
> >+    if (len >= BTRFS_LABEL_SIZE) {
> >+        fprintf(stderr, "Label %s is too long (max %d)\n", input,
> >+            BTRFS_LABEL_SIZE - 1);
> >+        exit(1);
> >+    }
> >+    for (i = 0; i < len; i++) {
> >+        if (input[i] == '/' || input[i] == '\\') {
> >+            fprintf(stderr, "invalid label %s\n", input);
> >+            exit(1);
> >+        }
> >+    }
> >+    return strdup(input);
> >+}
> >diff --git a/utils.h b/utils.h
> >index 9dce5b0..9212a75 100644
> >--- a/utils.h
> >+++ b/utils.h
> >@@ -40,4 +40,5 @@ int check_mounted(const char *devicename);
> > int btrfs_device_already_in_root(struct btrfs_root *root, int fd,
> >                  int super_offset);
> > char *pretty_sizes(u64 size);
> >+char *parse_label(const char *);
> > #endif
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support V2
  2011-09-02 12:52   ` David Sterba
@ 2011-09-02 13:13     ` Jeff Liu
  2011-09-02 15:48       ` David Sterba
  0 siblings, 1 reply; 9+ messages in thread
From: Jeff Liu @ 2011-09-02 13:13 UTC (permalink / raw)
  To: dsterba; +Cc: linux-btrfs, Hugo Mills, chris.mason

Hi David,

On 09/02/2011 08:52 PM, David Sterba wrote:
> Hi,
>
> are you aware that there is a label support already? Though only for
> unmounted system, but please have a look at these patches:
>
> https://patchwork.kernel.org/patch/381141/
> https://patchwork.kernel.org/patch/842602/
>
> and the patches are part of Hugo's integration for a long time, rather
> check latest versions so you do not duplicate work.
Thanks for your info! I was not aware of that at that time. :(
I am definitely a newbie to Btrfs and the kernel world, just started to 
explore it at last week. :-)
> On Thu, Sep 01, 2011 at 07:52:54PM +0800, Jeff Liu wrote:
>> Revise the patch according to kernel side change.
> Leave original commit message. If you want to document changes between
> revised patch version put them ...
ok, fixed as below:

 From e2990b69ecd3bac8da8023a64c866d16c81a1679 Mon Sep 17 00:00:00 2001
From: Jie Liu <jeff.liu@oracle.com>
Date: Fri, 2 Sep 2011 21:07:35 +0800
Subject: [PATCH 1/1] Add btrfs filesystem label [label] [path] support 
through ioctl.
  Signed-off-by: Jie Liu <jeff.liu@oracle.com>

---
  btrfs.c      |    7 +++----
  btrfs_cmds.c |   34 ++++++++++++++++++++++++++++++++++
  btrfs_cmds.h |    1 +
  ctree.h      |    4 ++++
  ioctl.h      |    2 ++
  mkfs.c       |   19 -------------------
  utils.c      |   18 ++++++++++++++++++
  utils.h      |    1 +
  8 files changed, 63 insertions(+), 23 deletions(-)

diff --git a/btrfs.c b/btrfs.c
index 46314cf..6d414f1 100644
--- a/btrfs.c
+++ b/btrfs.c
@@ -108,11 +108,10 @@ static struct Command commands[] = {
        "device delete", "<dev> [<dev>..] <path>\n"
          "Remove a device from a filesystem."
      },
-    /* coming soon
-    { 2, "filesystem label", "<label> <path>\n"
+    { do_set_label, 2,
+      "filesystem label", "<label> <path>\n"
          "Set the label of a filesystem"
-    }
-    */
+    },
      { 0, 0 , 0 }
  };

diff --git a/btrfs_cmds.c b/btrfs_cmds.c
index 8031c58..2a879c0 100644
--- a/btrfs_cmds.c
+++ b/btrfs_cmds.c
@@ -834,6 +834,40 @@ int do_set_default_subvol(int nargs, char **argv)
      return 0;
  }

+int do_set_label(int nargs, char **argv)
+{
+    int    fd, ret;
+    char    *path = argv[2];
+    char    *label = parse_label(argv[1]);
+    size_t    len = strlen(label);
+    struct    btrfs_ioctl_fs_label_args label_args;
+
+    if (len == 0 || len >= BTRFS_LABEL_SIZE) {
+        fprintf(stderr, "ERROR: label length too long ('%s')\n",
+            label);
+        free(label);
+        return 14;
+    }
+
+    fd = open_file_or_dir(path);
+    if (fd < 0) {
+        free(label);
+        fprintf(stderr, "ERROR: can't access to '%s'\n", path);
+        return 12;
+    }
+
+    strcpy(label_args.label, label);
+    ret = ioctl(fd, BTRFS_IOC_FS_SETLABEL, &label_args);
+    close(fd);
+    free(label);
+    if(ret < 0) {
+        fprintf(stderr, "ERROR: unable to set a new label\n");
+        return 30;
+    }
+
+    return 0;
+}
+
  int do_df_filesystem(int nargs, char **argv)
  {
      struct btrfs_ioctl_space_args *sargs;
diff --git a/btrfs_cmds.h b/btrfs_cmds.h
index 7bde191..29ded22 100644
--- a/btrfs_cmds.h
+++ b/btrfs_cmds.h
@@ -32,3 +32,4 @@ int list_subvols(int fd);
  int do_df_filesystem(int nargs, char **argv);
  int find_updated_files(int fd, u64 root_id, u64 oldest_gen);
  int do_find_newer(int argc, char **argv);
+int do_set_label(int argc, char **argv);
diff --git a/ctree.h b/ctree.h
index b79e238..745879b 100644
--- a/ctree.h
+++ b/ctree.h
@@ -345,6 +345,10 @@ struct btrfs_super_block {
      u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
  } __attribute__ ((__packed__));

+struct btrfs_ioctl_fs_label_args {
+    char label[BTRFS_LABEL_SIZE];
+};
+
  /*
   * Compat flags that we support.  If any incompat flags are set other 
than the
   * ones specified below then we will fail to mount
diff --git a/ioctl.h b/ioctl.h
index 776d7a9..98acd63 100644
--- a/ioctl.h
+++ b/ioctl.h
@@ -140,6 +140,8 @@ struct btrfs_ioctl_space_args {
                     struct btrfs_ioctl_vol_args)
  #define BTRFS_IOC_SCAN_DEV _IOW(BTRFS_IOCTL_MAGIC, 4, \
                     struct btrfs_ioctl_vol_args)
+#define BTRFS_IOC_FS_SETLABEL _IOW(BTRFS_IOCTL_MAGIC, 5, \
+                   struct btrfs_ioctl_fs_label_args)
  /* trans start and trans end are dangerous, and only for
   * use by applications that know how to avoid the
   * resulting deadlocks
diff --git a/mkfs.c b/mkfs.c
index 1598aae..93c1636 100644
--- a/mkfs.c
+++ b/mkfs.c
@@ -303,25 +303,6 @@ static u64 parse_profile(char *s)
      return 0;
  }

-static char *parse_label(char *input)
-{
-    int i;
-    int len = strlen(input);
-
-    if (len >= BTRFS_LABEL_SIZE) {
-        fprintf(stderr, "Label %s is too long (max %d)\n", input,
-            BTRFS_LABEL_SIZE - 1);
-        exit(1);
-    }
-    for (i = 0; i < len; i++) {
-        if (input[i] == '/' || input[i] == '\\') {
-            fprintf(stderr, "invalid label %s\n", input);
-            exit(1);
-        }
-    }
-    return strdup(input);
-}
-
  static struct option long_options[] = {
      { "alloc-start", 1, NULL, 'A'},
      { "byte-count", 1, NULL, 'b' },
diff --git a/utils.c b/utils.c
index fd894f3..5d77503 100644
--- a/utils.c
+++ b/utils.c
@@ -993,3 +993,21 @@ char *pretty_sizes(u64 size)
      return pretty;
  }

+char *parse_label(const char *input)
+{
+    int i;
+    int len = strlen(input);
+
+    if (len >= BTRFS_LABEL_SIZE) {
+        fprintf(stderr, "Label %s is too long (max %d)\n", input,
+            BTRFS_LABEL_SIZE - 1);
+        exit(1);
+    }
+    for (i = 0; i < len; i++) {
+        if (input[i] == '/' || input[i] == '\\') {
+            fprintf(stderr, "invalid label %s\n", input);
+            exit(1);
+        }
+    }
+    return strdup(input);
+}
diff --git a/utils.h b/utils.h
index 9dce5b0..9212a75 100644
--- a/utils.h
+++ b/utils.h
@@ -40,4 +40,5 @@ int check_mounted(const char *devicename);
  int btrfs_device_already_in_root(struct btrfs_root *root, int fd,
                   int super_offset);
  char *pretty_sizes(u64 size);
+char *parse_label(const char *);
  #endif
-- 
1.7.4.1

>>   Signed-off-by: Jie Liu<jeff.liu@oracle.com>
>>
>> ---
> ... here. Git will ignore them when applying the message.
>
>
> HTH,
> david
>
>>   btrfs.c      |    7 +++----
>>   btrfs_cmds.c |   34 ++++++++++++++++++++++++++++++++++
>>   btrfs_cmds.h |    1 +
>>   ctree.h      |    4 ++++
>>   ioctl.h      |    2 ++
>>   mkfs.c       |   19 -------------------
>>   utils.c      |   18 ++++++++++++++++++
>>   utils.h      |    1 +
>>   8 files changed, 63 insertions(+), 23 deletions(-)
>>
>> diff --git a/btrfs.c b/btrfs.c
>> index 46314cf..6d414f1 100644
>> --- a/btrfs.c
>> +++ b/btrfs.c
>> @@ -108,11 +108,10 @@ static struct Command commands[] = {
>>         "device delete", "<dev>  [<dev>..]<path>\n"
>>           "Remove a device from a filesystem."
>>       },
>> -    /* coming soon
>> -    { 2, "filesystem label", "<label>  <path>\n"
>> +    { do_set_label, 2,
>> +      "filesystem label", "<label>  <path>\n"
>>           "Set the label of a filesystem"
>> -    }
>> -    */
>> +    },
>>       { 0, 0 , 0 }
>>   };
>>
>> diff --git a/btrfs_cmds.c b/btrfs_cmds.c
>> index 8031c58..2a879c0 100644
>> --- a/btrfs_cmds.c
>> +++ b/btrfs_cmds.c
>> @@ -834,6 +834,40 @@ int do_set_default_subvol(int nargs, char **argv)
>>       return 0;
>>   }
>>
>> +int do_set_label(int nargs, char **argv)
>> +{
>> +    int    fd, ret;
>> +    char    *path = argv[2];
>> +    char    *label = parse_label(argv[1]);
>> +    size_t    len = strlen(label);
>> +    struct    btrfs_ioctl_fs_label_args label_args;
>> +
>> +    if (len == 0 || len>= BTRFS_LABEL_SIZE) {
>> +        fprintf(stderr, "ERROR: label length too long ('%s')\n",
>> +            label);
>> +        free(label);
>> +        return 14;
>> +    }
>> +
>> +    fd = open_file_or_dir(path);
>> +    if (fd<  0) {
>> +        free(label);
>> +        fprintf(stderr, "ERROR: can't access to '%s'\n", path);
>> +        return 12;
>> +    }
>> +
>> +    strcpy(label_args.label, label);
>> +    ret = ioctl(fd, BTRFS_IOC_FS_SETLABEL,&label_args);
>> +    close(fd);
>> +    free(label);
>> +    if(ret<  0) {
>> +        fprintf(stderr, "ERROR: unable to set a new label\n");
>> +        return 30;
>> +    }
>> +
>> +    return 0;
>> +}
>> +
>>   int do_df_filesystem(int nargs, char **argv)
>>   {
>>       struct btrfs_ioctl_space_args *sargs;
>> diff --git a/btrfs_cmds.h b/btrfs_cmds.h
>> index 7bde191..29ded22 100644
>> --- a/btrfs_cmds.h
>> +++ b/btrfs_cmds.h
>> @@ -32,3 +32,4 @@ int list_subvols(int fd);
>>   int do_df_filesystem(int nargs, char **argv);
>>   int find_updated_files(int fd, u64 root_id, u64 oldest_gen);
>>   int do_find_newer(int argc, char **argv);
>> +int do_set_label(int argc, char **argv);
>> diff --git a/ctree.h b/ctree.h
>> index b79e238..745879b 100644
>> --- a/ctree.h
>> +++ b/ctree.h
>> @@ -345,6 +345,10 @@ struct btrfs_super_block {
>>       u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
>>   } __attribute__ ((__packed__));
>>
>> +struct btrfs_ioctl_fs_label_args {
>> +    char label[BTRFS_LABEL_SIZE];
>> +};
>> +
>>   /*
>>    * Compat flags that we support.  If any incompat flags are set
>> other than the
>>    * ones specified below then we will fail to mount
>> diff --git a/ioctl.h b/ioctl.h
>> index 776d7a9..98acd63 100644
>> --- a/ioctl.h
>> +++ b/ioctl.h
>> @@ -140,6 +140,8 @@ struct btrfs_ioctl_space_args {
>>                      struct btrfs_ioctl_vol_args)
>>   #define BTRFS_IOC_SCAN_DEV _IOW(BTRFS_IOCTL_MAGIC, 4, \
>>                      struct btrfs_ioctl_vol_args)
>> +#define BTRFS_IOC_FS_SETLABEL _IOW(BTRFS_IOCTL_MAGIC, 5, \
>> +                   struct btrfs_ioctl_fs_label_args)
>>   /* trans start and trans end are dangerous, and only for
>>    * use by applications that know how to avoid the
>>    * resulting deadlocks
>> diff --git a/mkfs.c b/mkfs.c
>> index 1598aae..93c1636 100644
>> --- a/mkfs.c
>> +++ b/mkfs.c
>> @@ -303,25 +303,6 @@ static u64 parse_profile(char *s)
>>       return 0;
>>   }
>>
>> -static char *parse_label(char *input)
>> -{
>> -    int i;
>> -    int len = strlen(input);
>> -
>> -    if (len>= BTRFS_LABEL_SIZE) {
>> -        fprintf(stderr, "Label %s is too long (max %d)\n", input,
>> -            BTRFS_LABEL_SIZE - 1);
>> -        exit(1);
>> -    }
>> -    for (i = 0; i<  len; i++) {
>> -        if (input[i] == '/' || input[i] == '\\') {
>> -            fprintf(stderr, "invalid label %s\n", input);
>> -            exit(1);
>> -        }
>> -    }
>> -    return strdup(input);
>> -}
>> -
>>   static struct option long_options[] = {
>>       { "alloc-start", 1, NULL, 'A'},
>>       { "byte-count", 1, NULL, 'b' },
>> diff --git a/utils.c b/utils.c
>> index fd894f3..5d77503 100644
>> --- a/utils.c
>> +++ b/utils.c
>> @@ -993,3 +993,21 @@ char *pretty_sizes(u64 size)
>>       return pretty;
>>   }
>>
>> +char *parse_label(const char *input)
>> +{
>> +    int i;
>> +    int len = strlen(input);
>> +
>> +    if (len>= BTRFS_LABEL_SIZE) {
>> +        fprintf(stderr, "Label %s is too long (max %d)\n", input,
>> +            BTRFS_LABEL_SIZE - 1);
>> +        exit(1);
>> +    }
>> +    for (i = 0; i<  len; i++) {
>> +        if (input[i] == '/' || input[i] == '\\') {
>> +            fprintf(stderr, "invalid label %s\n", input);
>> +            exit(1);
>> +        }
>> +    }
>> +    return strdup(input);
>> +}
>> diff --git a/utils.h b/utils.h
>> index 9dce5b0..9212a75 100644
>> --- a/utils.h
>> +++ b/utils.h
>> @@ -40,4 +40,5 @@ int check_mounted(const char *devicename);
>>   int btrfs_device_already_in_root(struct btrfs_root *root, int fd,
>>                    int super_offset);
>>   char *pretty_sizes(u64 size);
>> +char *parse_label(const char *);
>>   #endif
>> -- 
>> 1.7.4.1
>>
>> On 09/01/2011 04:52 PM, Jeff Liu wrote:
>>> Hello,
>>>
>>> This patch make use of the new ioctl(2) to set Btrfs label via
>>> `btrfs filesystem label` command.
>>>
>>> Signed-off-by: Jie Liu<jeff.liu@oracle.com>
>>>
>>> ---
>>> btrfs.c      |    7 +++----
>>> btrfs_cmds.c |   27 +++++++++++++++++++++++++++
>>> btrfs_cmds.h |    1 +
>>> ctree.h      |    6 ++++++
>>> ioctl.h      |    2 ++
>>> mkfs.c       |   19 -------------------
>>> utils.c      |   18 ++++++++++++++++++
>>> utils.h      |    1 +
>>> 8 files changed, 58 insertions(+), 23 deletions(-)
>>>
>>> diff --git a/btrfs.c b/btrfs.c
>>> index 46314cf..6d414f1 100644
>>> --- a/btrfs.c
>>> +++ b/btrfs.c
>>> @@ -108,11 +108,10 @@ static struct Command commands[] = {
>>>        "device delete", "<dev>  [<dev>..]<path>\n"
>>>          "Remove a device from a filesystem."
>>>      },
>>> -    /* coming soon
>>> -    { 2, "filesystem label", "<label>  <path>\n"
>>> +    { do_set_label, 2,
>>> +      "filesystem label", "<label>  <path>\n"
>>>          "Set the label of a filesystem"
>>> -    }
>>> -    */
>>> +    },
>>>      { 0, 0 , 0 }
>>> };
>>>
>>> diff --git a/btrfs_cmds.c b/btrfs_cmds.c
>>> index 8031c58..8d2b8e1 100644
>>> --- a/btrfs_cmds.c
>>> +++ b/btrfs_cmds.c
>>> @@ -834,6 +834,33 @@ int do_set_default_subvol(int nargs, char **argv)
>>>      return 0;
>>> }
>>>
>>> +int do_set_label(int nargs, char **argv)
>>> +{
>>> +    int    fd, ret = 0;
>>> +    char    *path = argv[2];
>>> +    char    *label = parse_label(argv[1]);
>>> +    size_t    len = strlen(label);
>>> +    struct    btrfs_ioctl_fs_label_args label_args;
>>> +
>>> +    fd = open_file_or_dir(path);
>>> +    if (fd<  0) {
>>> +        fprintf(stderr, "ERROR: can't access to '%s'\n", path);
>>> +        return 12;
>>> +    }
>>> +
>>> +    label_args.len = len;
>>> +    snprintf(label_args.label, BTRFS_LABEL_SIZE, "%s", label);
>>> +    ret = ioctl(fd, BTRFS_IOC_FS_SETLABEL,&label_args);
>>> +    close(fd);
>>> +    free(label);
>>> +    if(ret<  0) {
>>> +        fprintf(stderr, "ERROR: unable to set a new label\n");
>>> +        return 30;
>>> +    }
>>> +
>>> +    return 0;
>>> +}
>>> +
>>> int do_df_filesystem(int nargs, char **argv)
>>> {
>>>      struct btrfs_ioctl_space_args *sargs;
>>> diff --git a/btrfs_cmds.h b/btrfs_cmds.h
>>> index 7bde191..29ded22 100644
>>> --- a/btrfs_cmds.h
>>> +++ b/btrfs_cmds.h
>>> @@ -32,3 +32,4 @@ int list_subvols(int fd);
>>> int do_df_filesystem(int nargs, char **argv);
>>> int find_updated_files(int fd, u64 root_id, u64 oldest_gen);
>>> int do_find_newer(int argc, char **argv);
>>> +int do_set_label(int argc, char **argv);
>>> diff --git a/ctree.h b/ctree.h
>>> index b79e238..4924b88 100644
>>> --- a/ctree.h
>>> +++ b/ctree.h
>>> @@ -345,6 +345,12 @@ struct btrfs_super_block {
>>>      u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
>>> } __attribute__ ((__packed__));
>>>
>>> +struct btrfs_ioctl_fs_label_args {
>>> +    /* label length in bytes */
>>> +    __u32 len;
>>> +    char label[BTRFS_LABEL_SIZE];
>>> +};
>>> +
>>> /*
>>>   * Compat flags that we support.  If any incompat flags are set
>>> other than the
>>>   * ones specified below then we will fail to mount
>>> diff --git a/ioctl.h b/ioctl.h
>>> index 776d7a9..5750f3a 100644
>>> --- a/ioctl.h
>>> +++ b/ioctl.h
>>> @@ -169,4 +169,6 @@ struct btrfs_ioctl_space_args {
>>> #define BTRFS_IOC_DEFAULT_SUBVOL _IOW(BTRFS_IOCTL_MAGIC, 19, u64)
>>> #define BTRFS_IOC_SPACE_INFO _IOWR(BTRFS_IOCTL_MAGIC, 20, \
>>>                      struct btrfs_ioctl_space_args)
>>> +#define BTRFS_IOC_FS_SETLABEL _IOW(BTRFS_IOCTL_MAGIC, 32, \
>>> +                   struct btrfs_ioctl_fs_label_args)
>>> #endif
>>> diff --git a/mkfs.c b/mkfs.c
>>> index 1598aae..93c1636 100644
>>> --- a/mkfs.c
>>> +++ b/mkfs.c
>>> @@ -303,25 +303,6 @@ static u64 parse_profile(char *s)
>>>      return 0;
>>> }
>>>
>>> -static char *parse_label(char *input)
>>> -{
>>> -    int i;
>>> -    int len = strlen(input);
>>> -
>>> -    if (len>= BTRFS_LABEL_SIZE) {
>>> -        fprintf(stderr, "Label %s is too long (max %d)\n", input,
>>> -            BTRFS_LABEL_SIZE - 1);
>>> -        exit(1);
>>> -    }
>>> -    for (i = 0; i<  len; i++) {
>>> -        if (input[i] == '/' || input[i] == '\\') {
>>> -            fprintf(stderr, "invalid label %s\n", input);
>>> -            exit(1);
>>> -        }
>>> -    }
>>> -    return strdup(input);
>>> -}
>>> -
>>> static struct option long_options[] = {
>>>      { "alloc-start", 1, NULL, 'A'},
>>>      { "byte-count", 1, NULL, 'b' },
>>> diff --git a/utils.c b/utils.c
>>> index fd894f3..5d77503 100644
>>> --- a/utils.c
>>> +++ b/utils.c
>>> @@ -993,3 +993,21 @@ char *pretty_sizes(u64 size)
>>>      return pretty;
>>> }
>>>
>>> +char *parse_label(const char *input)
>>> +{
>>> +    int i;
>>> +    int len = strlen(input);
>>> +
>>> +    if (len>= BTRFS_LABEL_SIZE) {
>>> +        fprintf(stderr, "Label %s is too long (max %d)\n", input,
>>> +            BTRFS_LABEL_SIZE - 1);
>>> +        exit(1);
>>> +    }
>>> +    for (i = 0; i<  len; i++) {
>>> +        if (input[i] == '/' || input[i] == '\\') {
>>> +            fprintf(stderr, "invalid label %s\n", input);
>>> +            exit(1);
>>> +        }
>>> +    }
>>> +    return strdup(input);
>>> +}
>>> diff --git a/utils.h b/utils.h
>>> index 9dce5b0..9212a75 100644
>>> --- a/utils.h
>>> +++ b/utils.h
>>> @@ -40,4 +40,5 @@ int check_mounted(const char *devicename);
>>> int btrfs_device_already_in_root(struct btrfs_root *root, int fd,
>>>                   int super_offset);
>>> char *pretty_sizes(u64 size);
>>> +char *parse_label(const char *);
>>> #endif
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support V2
  2011-09-02 13:13     ` Jeff Liu
@ 2011-09-02 15:48       ` David Sterba
  2011-09-03  3:11         ` Jeff liu
  0 siblings, 1 reply; 9+ messages in thread
From: David Sterba @ 2011-09-02 15:48 UTC (permalink / raw)
  To: Jeff Liu; +Cc: dsterba, linux-btrfs, Hugo Mills, chris.mason

On Fri, Sep 02, 2011 at 09:13:34PM +0800, Jeff Liu wrote:
> --- a/ioctl.h
> +++ b/ioctl.h
> @@ -140,6 +140,8 @@ struct btrfs_ioctl_space_args {
>                     struct btrfs_ioctl_vol_args)
>  #define BTRFS_IOC_SCAN_DEV _IOW(BTRFS_IOCTL_MAGIC, 4, \
>                     struct btrfs_ioctl_vol_args)
> +#define BTRFS_IOC_FS_SETLABEL _IOW(BTRFS_IOCTL_MAGIC, 5, \
> +                   struct btrfs_ioctl_fs_label_args)
>  /* trans start and trans end are dangerous, and only for
>   * use by applications that know how to avoid the
>   * resulting deadlocks

well, it is an unassigned number, but a newly added features should IMHO
allocate greater than current max value, ie over 31 in coordination with

https://btrfs.wiki.kernel.org/index.php/Project_ideas#Development_notes.2C_please_read

table.


david

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support V2
  2011-09-02 15:48       ` David Sterba
@ 2011-09-03  3:11         ` Jeff liu
       [not found]           ` <20110904170301.GE9907@carfax.org.uk>
  0 siblings, 1 reply; 9+ messages in thread
From: Jeff liu @ 2011-09-03  3:11 UTC (permalink / raw)
  To: dsterba; +Cc: linux-btrfs, Hugo Mills, Chris Mason, lizf


=D4=DA 2011-9-2=A3=AC=CF=C2=CE=E711:48=A3=AC David Sterba =D0=B4=B5=C0=A3=
=BA

> On Fri, Sep 02, 2011 at 09:13:34PM +0800, Jeff Liu wrote:
>> --- a/ioctl.h
>> +++ b/ioctl.h
>> @@ -140,6 +140,8 @@ struct btrfs_ioctl_space_args {
>>                    struct btrfs_ioctl_vol_args)
>> #define BTRFS_IOC_SCAN_DEV _IOW(BTRFS_IOCTL_MAGIC, 4, \
>>                    struct btrfs_ioctl_vol_args)
>> +#define BTRFS_IOC_FS_SETLABEL _IOW(BTRFS_IOCTL_MAGIC, 5, \
>> +                   struct btrfs_ioctl_fs_label_args)
>> /* trans start and trans end are dangerous, and only for
>>  * use by applications that know how to avoid the
>>  * resulting deadlocks
>=20
> well, it is an unassigned number, but a newly added features should I=
MHO
> allocate greater than current max value, ie over 31 in coordination w=
ith
>=20
> https://btrfs.wiki.kernel.org/index.php/Project_ideas#Development_not=
es.2C_please_read
>=20
> table.

It sounds reasonable to allocate a greater value, could anyone please c=
onfirm it?

Hi Zefan,

What's your ioctl range for online fsck?


Thanks,
-Jeff

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

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

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support V2
       [not found]           ` <20110904170301.GE9907@carfax.org.uk>
@ 2011-09-05  5:34             ` Jeff Liu
  2011-09-05  7:32               ` [PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support V3 Jeff Liu
  2011-09-05  7:30             ` [PATCH] Btrfs: added new ioctl to set fs label V3 Jeff Liu
  1 sibling, 1 reply; 9+ messages in thread
From: Jeff Liu @ 2011-09-05  5:34 UTC (permalink / raw)
  To: Hugo Mills; +Cc: dsterba, linux-btrfs, Chris Mason, lizf

On 09/05/2011 01:03 AM, Hugo Mills wrote:
> On Sat, Sep 03, 2011 at 11:11:36AM +0800, Jeff liu wrote:
>> =E5=9C=A8 2011-9-2=EF=BC=8C=E4=B8=8B=E5=8D=8811:48=EF=BC=8C David St=
erba =E5=86=99=E9=81=93=EF=BC=9A
>>> On Fri, Sep 02, 2011 at 09:13:34PM +0800, Jeff Liu wrote:
>>>> --- a/ioctl.h
>>>> +++ b/ioctl.h
>>>> @@ -140,6 +140,8 @@ struct btrfs_ioctl_space_args {
>>>>                     struct btrfs_ioctl_vol_args)
>>>> #define BTRFS_IOC_SCAN_DEV _IOW(BTRFS_IOCTL_MAGIC, 4, \
>>>>                     struct btrfs_ioctl_vol_args)
>>>> +#define BTRFS_IOC_FS_SETLABEL _IOW(BTRFS_IOCTL_MAGIC, 5, \
>>>> +                   struct btrfs_ioctl_fs_label_args)
>>>> /* trans start and trans end are dangerous, and only for
>>>>   * use by applications that know how to avoid the
>>>>   * resulting deadlocks
>>> well, it is an unassigned number, but a newly added features should=
 IMHO
>>> allocate greater than current max value, ie over 31 in coordination=
 with
>>>
>>> https://btrfs.wiki.kernel.org/index.php/Project_ideas#Development_n=
otes.2C_please_read
>>>
>>> table.
>> It sounds reasonable to allocate a greater value, could anyone pleas=
e confirm it?
>     I'd just take number 50 for yours -- Li can update his patches
> later.
Thank you, I'll post a patch for this change later.

-Jeff
>     Hugo.
>
>> What's your ioctl range for online fsck?

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

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH] Btrfs: added new ioctl to set fs label V3
       [not found]           ` <20110904170301.GE9907@carfax.org.uk>
  2011-09-05  5:34             ` Jeff Liu
@ 2011-09-05  7:30             ` Jeff Liu
  1 sibling, 0 replies; 9+ messages in thread
From: Jeff Liu @ 2011-09-05  7:30 UTC (permalink / raw)
  To: linux-btrfs, lizf; +Cc: Hugo Mills, dsterba, Chris Mason

Hello,

According to Hugo and David's advise, the ioctl number of 
BTRFS_IOC_FS_SETLABEL ioctl was changed to 50 now.

Signed-off-by: Jie Liu <jeff.liu@oracle.com>

---
  fs/btrfs/ctree.h |    4 ++++
  fs/btrfs/ioctl.c |   36 ++++++++++++++++++++++++++++++++++++
  fs/btrfs/ioctl.h |    2 ++
  3 files changed, 42 insertions(+), 0 deletions(-)

diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index 03912c5..a4669f0 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -1259,6 +1259,10 @@ struct btrfs_ioctl_defrag_range_args {
  };


+struct btrfs_ioctl_fs_label_args {
+    char label[BTRFS_LABEL_SIZE];
+};
+
  /*
   * inode items have the data typically returned from stat and store other
   * info about object characteristics.  There is one for every file and 
dir in
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 970977a..c872e88 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -268,6 +268,40 @@ static int btrfs_ioctl_getversion(struct file 
*file, int __user *arg)
      return put_user(inode->i_generation, arg);
  }

+static int btrfs_ioctl_fs_setlabel(struct btrfs_root *root, void __user 
*arg)
+{
+    struct btrfs_super_block *super_block = &(root->fs_info->super_copy);
+    struct btrfs_ioctl_fs_label_args *label_args;
+    struct btrfs_trans_handle *trans;
+    int ret;
+
+    if (!capable(CAP_SYS_ADMIN))
+        return -EPERM;
+
+    if (btrfs_root_readonly(root))
+        return -EROFS;
+
+    label_args = memdup_user(arg, sizeof(*label_args));
+    if (IS_ERR(label_args))
+        return PTR_ERR(label_args);
+
+    label_args->label[BTRFS_LABEL_SIZE - 1] = '\0';
+
+    mutex_lock(&root->fs_info->volume_mutex);
+    trans = btrfs_start_transaction(root, 0);
+    if (IS_ERR(trans)) {
+        ret = PTR_ERR(trans);
+        goto out_unlock;
+    }
+    strcpy(super_block->label, label_args->label);
+    btrfs_end_transaction(trans, root);
+
+out_unlock:
+    mutex_unlock(&root->fs_info->volume_mutex);
+    kfree(label_args);
+    return 0;
+}
+
  static noinline int btrfs_ioctl_fitrim(struct file *file, void __user 
*arg)
  {
      struct btrfs_root *root = fdentry(file)->d_sb->s_fs_info;
@@ -2876,6 +2910,8 @@ long btrfs_ioctl(struct file *file, unsigned int
          return btrfs_ioctl_fs_info(root, argp);
      case BTRFS_IOC_DEV_INFO:
          return btrfs_ioctl_dev_info(root, argp);
+    case BTRFS_IOC_FS_SETLABEL:
+        return btrfs_ioctl_fs_setlabel(root, argp);
      case BTRFS_IOC_BALANCE:
          return btrfs_balance(root->fs_info->dev_root);
      case BTRFS_IOC_CLONE:
diff --git a/fs/btrfs/ioctl.h b/fs/btrfs/ioctl.h
index ad1ea78..1117fe8 100644
--- a/fs/btrfs/ioctl.h
+++ b/fs/btrfs/ioctl.h
@@ -248,4 +248,6 @@ struct btrfs_ioctl_space_args {
                   struct btrfs_ioctl_dev_info_args)
  #define BTRFS_IOC_FS_INFO _IOR(BTRFS_IOCTL_MAGIC, 31, \
                     struct btrfs_ioctl_fs_info_args)
+#define BTRFS_IOC_FS_SETLABEL _IOW(BTRFS_IOCTL_MAGIC, 50, \
+                   struct btrfs_ioctl_fs_label_args)
  #endif
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support V3
  2011-09-05  5:34             ` Jeff Liu
@ 2011-09-05  7:32               ` Jeff Liu
  0 siblings, 0 replies; 9+ messages in thread
From: Jeff Liu @ 2011-09-05  7:32 UTC (permalink / raw)
  To: linux-btrfs; +Cc: Hugo Mills, dsterba, Chris Mason, lizf

Fix the ioctl number of BTRFS_IOC_FS_SETLABEL to 50.

Signed-off-by: Jie Liu <jeff.liu@oracle.com>

---
  btrfs.c      |    7 +++----
  btrfs_cmds.c |   34 ++++++++++++++++++++++++++++++++++
  btrfs_cmds.h |    1 +
  ctree.h      |    4 ++++
  ioctl.h      |    2 ++
  mkfs.c       |   19 -------------------
  utils.c      |   18 ++++++++++++++++++
  utils.h      |    1 +
  8 files changed, 63 insertions(+), 23 deletions(-)

diff --git a/btrfs.c b/btrfs.c
index 46314cf..6d414f1 100644
--- a/btrfs.c
+++ b/btrfs.c
@@ -108,11 +108,10 @@ static struct Command commands[] = {
        "device delete", "<dev> [<dev>..] <path>\n"
          "Remove a device from a filesystem."
      },
-    /* coming soon
-    { 2, "filesystem label", "<label> <path>\n"
+    { do_set_label, 2,
+      "filesystem label", "<label> <path>\n"
          "Set the label of a filesystem"
-    }
-    */
+    },
      { 0, 0 , 0 }
  };

diff --git a/btrfs_cmds.c b/btrfs_cmds.c
index 8031c58..2a879c0 100644
--- a/btrfs_cmds.c
+++ b/btrfs_cmds.c
@@ -834,6 +834,40 @@ int do_set_default_subvol(int nargs, char **argv)
      return 0;
  }

+int do_set_label(int nargs, char **argv)
+{
+    int    fd, ret;
+    char    *path = argv[2];
+    char    *label = parse_label(argv[1]);
+    size_t    len = strlen(label);
+    struct    btrfs_ioctl_fs_label_args label_args;
+
+    if (len == 0 || len >= BTRFS_LABEL_SIZE) {
+        fprintf(stderr, "ERROR: label length too long ('%s')\n",
+            label);
+        free(label);
+        return 14;
+    }
+
+    fd = open_file_or_dir(path);
+    if (fd < 0) {
+        free(label);
+        fprintf(stderr, "ERROR: can't access to '%s'\n", path);
+        return 12;
+    }
+
+    strcpy(label_args.label, label);
+    ret = ioctl(fd, BTRFS_IOC_FS_SETLABEL, &label_args);
+    close(fd);
+    free(label);
+    if(ret < 0) {
+        fprintf(stderr, "ERROR: unable to set a new label\n");
+        return 30;
+    }
+
+    return 0;
+}
+
  int do_df_filesystem(int nargs, char **argv)
  {
      struct btrfs_ioctl_space_args *sargs;
diff --git a/btrfs_cmds.h b/btrfs_cmds.h
index 7bde191..29ded22 100644
--- a/btrfs_cmds.h
+++ b/btrfs_cmds.h
@@ -32,3 +32,4 @@ int list_subvols(int fd);
  int do_df_filesystem(int nargs, char **argv);
  int find_updated_files(int fd, u64 root_id, u64 oldest_gen);
  int do_find_newer(int argc, char **argv);
+int do_set_label(int argc, char **argv);
diff --git a/ctree.h b/ctree.h
index b79e238..745879b 100644
--- a/ctree.h
+++ b/ctree.h
@@ -345,6 +345,10 @@ struct btrfs_super_block {
      u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
  } __attribute__ ((__packed__));

+struct btrfs_ioctl_fs_label_args {
+    char label[BTRFS_LABEL_SIZE];
+};
+
  /*
   * Compat flags that we support.  If any incompat flags are set other 
than the
   * ones specified below then we will fail to mount
diff --git a/ioctl.h b/ioctl.h
index 776d7a9..9126ce8 100644
--- a/ioctl.h
+++ b/ioctl.h
@@ -169,4 +169,6 @@ struct btrfs_ioctl_space_args {
  #define BTRFS_IOC_DEFAULT_SUBVOL _IOW(BTRFS_IOCTL_MAGIC, 19, u64)
  #define BTRFS_IOC_SPACE_INFO _IOWR(BTRFS_IOCTL_MAGIC, 20, \
                      struct btrfs_ioctl_space_args)
+#define BTRFS_IOC_FS_SETLABEL _IOW(BTRFS_IOCTL_MAGIC, 50, \
+                   struct btrfs_ioctl_fs_label_args)
  #endif
diff --git a/mkfs.c b/mkfs.c
index 1598aae..93c1636 100644
--- a/mkfs.c
+++ b/mkfs.c
@@ -303,25 +303,6 @@ static u64 parse_profile(char *s)
      return 0;
  }

-static char *parse_label(char *input)
-{
-    int i;
-    int len = strlen(input);
-
-    if (len >= BTRFS_LABEL_SIZE) {
-        fprintf(stderr, "Label %s is too long (max %d)\n", input,
-            BTRFS_LABEL_SIZE - 1);
-        exit(1);
-    }
-    for (i = 0; i < len; i++) {
-        if (input[i] == '/' || input[i] == '\\') {
-            fprintf(stderr, "invalid label %s\n", input);
-            exit(1);
-        }
-    }
-    return strdup(input);
-}
-
  static struct option long_options[] = {
      { "alloc-start", 1, NULL, 'A'},
      { "byte-count", 1, NULL, 'b' },
diff --git a/utils.c b/utils.c
index fd894f3..5d77503 100644
--- a/utils.c
+++ b/utils.c
@@ -993,3 +993,21 @@ char *pretty_sizes(u64 size)
      return pretty;
  }

+char *parse_label(const char *input)
+{
+    int i;
+    int len = strlen(input);
+
+    if (len >= BTRFS_LABEL_SIZE) {
+        fprintf(stderr, "Label %s is too long (max %d)\n", input,
+            BTRFS_LABEL_SIZE - 1);
+        exit(1);
+    }
+    for (i = 0; i < len; i++) {
+        if (input[i] == '/' || input[i] == '\\') {
+            fprintf(stderr, "invalid label %s\n", input);
+            exit(1);
+        }
+    }
+    return strdup(input);
+}
diff --git a/utils.h b/utils.h
index 9dce5b0..9212a75 100644
--- a/utils.h
+++ b/utils.h
@@ -40,4 +40,5 @@ int check_mounted(const char *devicename);
  int btrfs_device_already_in_root(struct btrfs_root *root, int fd,
                   int super_offset);
  char *pretty_sizes(u64 size);
+char *parse_label(const char *);
  #endif
-- 
1.7.4.1


On 09/05/2011 01:34 PM, Jeff Liu wrote:
> On 09/05/2011 01:03 AM, Hugo Mills wrote:
>> On Sat, Sep 03, 2011 at 11:11:36AM +0800, Jeff liu wrote:
>>>
>>>> On Fri, Sep 02, 2011 at 09:13:34PM +0800, Jeff Liu wrote:
>>>>> --- a/ioctl.h
>>>>> +++ b/ioctl.h
>>>>> @@ -140,6 +140,8 @@ struct btrfs_ioctl_space_args {
>>>>>                     struct btrfs_ioctl_vol_args)
>>>>> #define BTRFS_IOC_SCAN_DEV _IOW(BTRFS_IOCTL_MAGIC, 4, \
>>>>>                     struct btrfs_ioctl_vol_args)
>>>>> +#define BTRFS_IOC_FS_SETLABEL _IOW(BTRFS_IOCTL_MAGIC, 5, \
>>>>> +                   struct btrfs_ioctl_fs_label_args)
>>>>> /* trans start and trans end are dangerous, and only for
>>>>>   * use by applications that know how to avoid the
>>>>>   * resulting deadlocks
>>>> well, it is an unassigned number, but a newly added features should 
>>>> IMHO
>>>> allocate greater than current max value, ie over 31 in coordination 
>>>> with
>>>>
>>>> https://btrfs.wiki.kernel.org/index.php/Project_ideas#Development_notes.2C_please_read 
>>>>
>>>>
>>>> table.
>>> It sounds reasonable to allocate a greater value, could anyone 
>>> please confirm it?
>>     I'd just take number 50 for yours -- Li can update his patches
>> later.
> Thank you, I'll post a patch for this change later.
>
> -Jeff
>>     Hugo.
>>
>>> What's your ioctl range for online fsck?
>
> -- 
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2011-09-05  7:32 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-09-01  8:52 [PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support Jeff Liu
2011-09-01 11:52 ` [PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support V2 Jeff Liu
2011-09-02 12:52   ` David Sterba
2011-09-02 13:13     ` Jeff Liu
2011-09-02 15:48       ` David Sterba
2011-09-03  3:11         ` Jeff liu
     [not found]           ` <20110904170301.GE9907@carfax.org.uk>
2011-09-05  5:34             ` Jeff Liu
2011-09-05  7:32               ` [PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support V3 Jeff Liu
2011-09-05  7:30             ` [PATCH] Btrfs: added new ioctl to set fs label V3 Jeff Liu

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.