From: Jeff Liu <jeff.liu@oracle.com>
To: linux-btrfs@vger.kernel.org
Cc: Hugo Mills <hugo@carfax.org.uk>,
dsterba@suse.cz, Chris Mason <chris.mason@oracle.com>,
lizf@cn.fujitsu.com
Subject: [PATCH] Btrfs-progs: added btrfs filesystem label [label] [path] support V3
Date: Mon, 05 Sep 2011 15:32:20 +0800 [thread overview]
Message-ID: <4E647B04.50804@oracle.com> (raw)
In-Reply-To: <4E645F76.5040505@oracle.com>
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
next prev parent reply other threads:[~2011-09-05 7:32 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
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 ` Jeff Liu [this message]
2011-09-05 7:30 ` [PATCH] Btrfs: added new ioctl to set fs label V3 Jeff Liu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4E647B04.50804@oracle.com \
--to=jeff.liu@oracle.com \
--cc=chris.mason@oracle.com \
--cc=dsterba@suse.cz \
--cc=hugo@carfax.org.uk \
--cc=linux-btrfs@vger.kernel.org \
--cc=lizf@cn.fujitsu.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).