diff options
Diffstat (limited to 'fs/btrfs/super.c')
-rw-r--r-- | fs/btrfs/super.c | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index ad4f280ec77..2116728d1f9 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -61,12 +61,13 @@ static void btrfs_put_super (struct super_block * sb) | |||
61 | } | 61 | } |
62 | 62 | ||
63 | enum { | 63 | enum { |
64 | Opt_subvol, Opt_nodatasum, Opt_err, | 64 | Opt_subvol, Opt_nodatasum, Opt_nodatacow, Opt_err, |
65 | }; | 65 | }; |
66 | 66 | ||
67 | static match_table_t tokens = { | 67 | static match_table_t tokens = { |
68 | {Opt_subvol, "subvol=%s"}, | 68 | {Opt_subvol, "subvol=%s"}, |
69 | {Opt_nodatasum, "nodatasum"}, | 69 | {Opt_nodatasum, "nodatasum"}, |
70 | {Opt_nodatacow, "nodatacow"}, | ||
70 | {Opt_err, NULL} | 71 | {Opt_err, NULL} |
71 | }; | 72 | }; |
72 | 73 | ||
@@ -78,12 +79,20 @@ static int parse_options (char * options, | |||
78 | struct btrfs_fs_info *info = NULL; | 79 | struct btrfs_fs_info *info = NULL; |
79 | substring_t args[MAX_OPT_ARGS]; | 80 | substring_t args[MAX_OPT_ARGS]; |
80 | 81 | ||
81 | if (root) | ||
82 | info = root->fs_info; | ||
83 | |||
84 | if (!options) | 82 | if (!options) |
85 | return 1; | 83 | return 1; |
86 | 84 | ||
85 | /* | ||
86 | * strsep changes the string, duplicate it because parse_options | ||
87 | * gets called twice | ||
88 | */ | ||
89 | options = kstrdup(options, GFP_NOFS); | ||
90 | if (!options) | ||
91 | return -ENOMEM; | ||
92 | |||
93 | if (root) | ||
94 | info = root->fs_info; | ||
95 | |||
87 | while ((p = strsep (&options, ",")) != NULL) { | 96 | while ((p = strsep (&options, ",")) != NULL) { |
88 | int token; | 97 | int token; |
89 | if (!*p) | 98 | if (!*p) |
@@ -92,17 +101,28 @@ static int parse_options (char * options, | |||
92 | token = match_token(p, tokens, args); | 101 | token = match_token(p, tokens, args); |
93 | switch (token) { | 102 | switch (token) { |
94 | case Opt_subvol: | 103 | case Opt_subvol: |
95 | if (subvol_name) | 104 | if (subvol_name) { |
96 | *subvol_name = match_strdup(&args[0]); | 105 | *subvol_name = match_strdup(&args[0]); |
106 | } | ||
97 | break; | 107 | break; |
98 | case Opt_nodatasum: | 108 | case Opt_nodatasum: |
99 | if (root) | 109 | if (info) { |
110 | printk("btrfs: setting nodatacsum\n"); | ||
100 | btrfs_set_opt(info->mount_opt, NODATASUM); | 111 | btrfs_set_opt(info->mount_opt, NODATASUM); |
112 | } | ||
113 | break; | ||
114 | case Opt_nodatacow: | ||
115 | if (info) { | ||
116 | printk("btrfs: setting nodatacow\n"); | ||
117 | btrfs_set_opt(info->mount_opt, NODATACOW); | ||
118 | btrfs_set_opt(info->mount_opt, NODATASUM); | ||
119 | } | ||
101 | break; | 120 | break; |
102 | default: | 121 | default: |
103 | return 0; | 122 | break; |
104 | } | 123 | } |
105 | } | 124 | } |
125 | kfree(options); | ||
106 | return 1; | 126 | return 1; |
107 | } | 127 | } |
108 | 128 | ||