aboutsummaryrefslogtreecommitdiffstats
path: root/fs/jffs2/super.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/jffs2/super.c')
-rw-r--r--fs/jffs2/super.c49
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
114static struct super_block *jffs2_get_sb_mtd(struct file_system_type *fs_type, 114static 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
172out_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
177static struct super_block *jffs2_get_sb_mtdnr(struct file_system_type *fs_type, 181static 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
192static struct super_block *jffs2_get_sb(struct file_system_type *fs_type, 197static 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
274out: 279out:
275 path_release(&nd); 280 path_release(&nd);
276 return ERR_PTR(err); 281 return err;
277} 282}
278 283
279static void jffs2_put_super (struct super_block *sb) 284static void jffs2_put_super (struct super_block *sb)