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) |
