diff options
Diffstat (limited to 'fs/jffs2/super.c')
-rw-r--r-- | fs/jffs2/super.c | 49 |
1 files changed, 27 insertions, 22 deletions
diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c index 9d0521451f59..2378a662c256 100644 --- a/fs/jffs2/super.c +++ b/fs/jffs2/super.c | |||
@@ -111,9 +111,10 @@ static int jffs2_sb_set(struct super_block *sb, void *data) | |||
111 | return 0; | 111 | return 0; |
112 | } | 112 | } |
113 | 113 | ||
114 | static struct super_block *jffs2_get_sb_mtd(struct file_system_type *fs_type, | 114 | static int jffs2_get_sb_mtd(struct file_system_type *fs_type, |
115 | int flags, const char *dev_name, | 115 | int flags, const char *dev_name, |
116 | void *data, struct mtd_info *mtd) | 116 | void *data, struct mtd_info *mtd, |
117 | struct vfsmount *mnt) | ||
117 | { | 118 | { |
118 | struct super_block *sb; | 119 | struct super_block *sb; |
119 | struct jffs2_sb_info *c; | 120 | struct jffs2_sb_info *c; |
@@ -121,19 +122,20 @@ static struct super_block *jffs2_get_sb_mtd(struct file_system_type *fs_type, | |||
121 | 122 | ||
122 | c = kmalloc(sizeof(*c), GFP_KERNEL); | 123 | c = kmalloc(sizeof(*c), GFP_KERNEL); |
123 | if (!c) | 124 | if (!c) |
124 | return ERR_PTR(-ENOMEM); | 125 | return -ENOMEM; |
125 | memset(c, 0, sizeof(*c)); | 126 | memset(c, 0, sizeof(*c)); |
126 | c->mtd = mtd; | 127 | c->mtd = mtd; |
127 | 128 | ||
128 | sb = sget(fs_type, jffs2_sb_compare, jffs2_sb_set, c); | 129 | sb = sget(fs_type, jffs2_sb_compare, jffs2_sb_set, c); |
129 | 130 | ||
130 | if (IS_ERR(sb)) | 131 | if (IS_ERR(sb)) |
131 | goto out_put; | 132 | goto out_error; |
132 | 133 | ||
133 | if (sb->s_root) { | 134 | if (sb->s_root) { |
134 | /* New mountpoint for JFFS2 which is already mounted */ | 135 | /* New mountpoint for JFFS2 which is already mounted */ |
135 | D1(printk(KERN_DEBUG "jffs2_get_sb_mtd(): Device %d (\"%s\") is already mounted\n", | 136 | D1(printk(KERN_DEBUG "jffs2_get_sb_mtd(): Device %d (\"%s\") is already mounted\n", |
136 | mtd->index, mtd->name)); | 137 | mtd->index, mtd->name)); |
138 | ret = simple_set_mnt(mnt, sb); | ||
137 | goto out_put; | 139 | goto out_put; |
138 | } | 140 | } |
139 | 141 | ||
@@ -161,44 +163,47 @@ static struct super_block *jffs2_get_sb_mtd(struct file_system_type *fs_type, | |||
161 | /* Failure case... */ | 163 | /* Failure case... */ |
162 | up_write(&sb->s_umount); | 164 | up_write(&sb->s_umount); |
163 | deactivate_super(sb); | 165 | deactivate_super(sb); |
164 | return ERR_PTR(ret); | 166 | return ret; |
165 | } | 167 | } |
166 | 168 | ||
167 | sb->s_flags |= MS_ACTIVE; | 169 | sb->s_flags |= MS_ACTIVE; |
168 | return sb; | 170 | return simple_set_mnt(mnt, sb); |
169 | 171 | ||
172 | out_error: | ||
173 | ret = PTR_ERR(sb); | ||
170 | out_put: | 174 | out_put: |
171 | kfree(c); | 175 | kfree(c); |
172 | put_mtd_device(mtd); | 176 | put_mtd_device(mtd); |
173 | 177 | ||
174 | return sb; | 178 | return ret; |
175 | } | 179 | } |
176 | 180 | ||
177 | static struct super_block *jffs2_get_sb_mtdnr(struct file_system_type *fs_type, | 181 | static int jffs2_get_sb_mtdnr(struct file_system_type *fs_type, |
178 | int flags, const char *dev_name, | 182 | int flags, const char *dev_name, |
179 | void *data, int mtdnr) | 183 | void *data, int mtdnr, |
184 | struct vfsmount *mnt) | ||
180 | { | 185 | { |
181 | struct mtd_info *mtd; | 186 | struct mtd_info *mtd; |
182 | 187 | ||
183 | mtd = get_mtd_device(NULL, mtdnr); | 188 | mtd = get_mtd_device(NULL, mtdnr); |
184 | if (!mtd) { | 189 | if (!mtd) { |
185 | D1(printk(KERN_DEBUG "jffs2: MTD device #%u doesn't appear to exist\n", mtdnr)); | 190 | D1(printk(KERN_DEBUG "jffs2: MTD device #%u doesn't appear to exist\n", mtdnr)); |
186 | return ERR_PTR(-EINVAL); | 191 | return -EINVAL; |
187 | } | 192 | } |
188 | 193 | ||
189 | return jffs2_get_sb_mtd(fs_type, flags, dev_name, data, mtd); | 194 | return jffs2_get_sb_mtd(fs_type, flags, dev_name, data, mtd, mnt); |
190 | } | 195 | } |
191 | 196 | ||
192 | static struct super_block *jffs2_get_sb(struct file_system_type *fs_type, | 197 | static int jffs2_get_sb(struct file_system_type *fs_type, |
193 | int flags, const char *dev_name, | 198 | int flags, const char *dev_name, |
194 | void *data) | 199 | void *data, struct vfsmount *mnt) |
195 | { | 200 | { |
196 | int err; | 201 | int err; |
197 | struct nameidata nd; | 202 | struct nameidata nd; |
198 | int mtdnr; | 203 | int mtdnr; |
199 | 204 | ||
200 | if (!dev_name) | 205 | if (!dev_name) |
201 | return ERR_PTR(-EINVAL); | 206 | return -EINVAL; |
202 | 207 | ||
203 | D1(printk(KERN_DEBUG "jffs2_get_sb(): dev_name \"%s\"\n", dev_name)); | 208 | D1(printk(KERN_DEBUG "jffs2_get_sb(): dev_name \"%s\"\n", dev_name)); |
204 | 209 | ||
@@ -220,7 +225,7 @@ static struct super_block *jffs2_get_sb(struct file_system_type *fs_type, | |||
220 | mtd = get_mtd_device(NULL, mtdnr); | 225 | mtd = get_mtd_device(NULL, mtdnr); |
221 | if (mtd) { | 226 | if (mtd) { |
222 | if (!strcmp(mtd->name, dev_name+4)) | 227 | if (!strcmp(mtd->name, dev_name+4)) |
223 | return jffs2_get_sb_mtd(fs_type, flags, dev_name, data, mtd); | 228 | return jffs2_get_sb_mtd(fs_type, flags, dev_name, data, mtd, mnt); |
224 | put_mtd_device(mtd); | 229 | put_mtd_device(mtd); |
225 | } | 230 | } |
226 | } | 231 | } |
@@ -233,7 +238,7 @@ static struct super_block *jffs2_get_sb(struct file_system_type *fs_type, | |||
233 | if (!*endptr) { | 238 | if (!*endptr) { |
234 | /* It was a valid number */ | 239 | /* It was a valid number */ |
235 | D1(printk(KERN_DEBUG "jffs2_get_sb(): mtd%%d, mtdnr %d\n", mtdnr)); | 240 | D1(printk(KERN_DEBUG "jffs2_get_sb(): mtd%%d, mtdnr %d\n", mtdnr)); |
236 | return jffs2_get_sb_mtdnr(fs_type, flags, dev_name, data, mtdnr); | 241 | return jffs2_get_sb_mtdnr(fs_type, flags, dev_name, data, mtdnr, mnt); |
237 | } | 242 | } |
238 | } | 243 | } |
239 | } | 244 | } |
@@ -247,7 +252,7 @@ static struct super_block *jffs2_get_sb(struct file_system_type *fs_type, | |||
247 | err, nd.dentry->d_inode)); | 252 | err, nd.dentry->d_inode)); |
248 | 253 | ||
249 | if (err) | 254 | if (err) |
250 | return ERR_PTR(err); | 255 | return err; |
251 | 256 | ||
252 | err = -EINVAL; | 257 | err = -EINVAL; |
253 | 258 | ||
@@ -269,11 +274,11 @@ static struct super_block *jffs2_get_sb(struct file_system_type *fs_type, | |||
269 | mtdnr = iminor(nd.dentry->d_inode); | 274 | mtdnr = iminor(nd.dentry->d_inode); |
270 | path_release(&nd); | 275 | path_release(&nd); |
271 | 276 | ||
272 | return jffs2_get_sb_mtdnr(fs_type, flags, dev_name, data, mtdnr); | 277 | return jffs2_get_sb_mtdnr(fs_type, flags, dev_name, data, mtdnr, mnt); |
273 | 278 | ||
274 | out: | 279 | out: |
275 | path_release(&nd); | 280 | path_release(&nd); |
276 | return ERR_PTR(err); | 281 | return err; |
277 | } | 282 | } |
278 | 283 | ||
279 | static void jffs2_put_super (struct super_block *sb) | 284 | static void jffs2_put_super (struct super_block *sb) |