Jeff Liu
2011-Sep-01 08:52 UTC
[PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support
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 -- 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
Jeff Liu
2011-Sep-01 11:52 UTC
[PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support V2
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-- 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
David Sterba
2011-Sep-02 12:52 UTC
Re: [PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support V2
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-- 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
Jeff Liu
2011-Sep-02 13:13 UTC
Re: [PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support V2
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-- 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
David Sterba
2011-Sep-02 15:48 UTC
Re: [PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support V2
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 deadlockswell, 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 -- 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
Jeff liu
2011-Sep-03 03:11 UTC
Re: [PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support V2
在 2011-9-2,下午11:48, David Sterba 写道:> 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? Hi Zefan, What''s your ioctl range for online fsck? Thanks, -Jeff> > > 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
Jeff Liu
2011-Sep-05 05:34 UTC
Re: [PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support V2
On 09/05/2011 01:03 AM, Hugo Mills wrote:> On Sat, Sep 03, 2011 at 11:11:36AM +0800, Jeff liu wrote: >> 在 2011-9-2,下午11:48, David Sterba 写道: >>> 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
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 -- 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
Jeff Liu
2011-Sep-05 07:32 UTC
[PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support V3
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-- 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