Skip to content

Commit 5451f79

Browse files
dhowellsLinus Torvalds
authored andcommitted
iget: stop JFFS2 from using iget() and read_inode()
Stop the JFFS2 filesystem from using iget() and read_inode(). Replace jffs2_read_inode() with jffs2_iget(), and call that instead of iget(). jffs2_iget() then uses iget_locked() directly and returns a proper error code instead of an inode in the event of an error. jffs2_do_fill_super() returns any error incurred when getting the root inode instead of EINVAL. Signed-off-by: David Howells <[email protected]> Cc: David Woodhouse <[email protected]> Acked-by: Christoph Hellwig <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent c4386c8 commit 5451f79

File tree

4 files changed

+39
-26
lines changed

4 files changed

+39
-26
lines changed

fs/jffs2/dir.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,10 @@ static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
101101
ino = fd->ino;
102102
up(&dir_f->sem);
103103
if (ino) {
104-
inode = iget(dir_i->i_sb, ino);
105-
if (!inode) {
104+
inode = jffs2_iget(dir_i->i_sb, ino);
105+
if (IS_ERR(inode)) {
106106
printk(KERN_WARNING "iget() failed for ino #%u\n", ino);
107-
return (ERR_PTR(-EIO));
107+
return ERR_CAST(inode);
108108
}
109109
}
110110

fs/jffs2/fs.c

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -230,16 +230,23 @@ void jffs2_clear_inode (struct inode *inode)
230230
jffs2_do_clear_inode(c, f);
231231
}
232232

233-
void jffs2_read_inode (struct inode *inode)
233+
struct inode *jffs2_iget(struct super_block *sb, unsigned long ino)
234234
{
235235
struct jffs2_inode_info *f;
236236
struct jffs2_sb_info *c;
237237
struct jffs2_raw_inode latest_node;
238238
union jffs2_device_node jdev;
239+
struct inode *inode;
239240
dev_t rdev = 0;
240241
int ret;
241242

242-
D1(printk(KERN_DEBUG "jffs2_read_inode(): inode->i_ino == %lu\n", inode->i_ino));
243+
D1(printk(KERN_DEBUG "jffs2_iget(): ino == %lu\n", ino));
244+
245+
inode = iget_locked(sb, ino);
246+
if (!inode)
247+
return ERR_PTR(-ENOMEM);
248+
if (!(inode->i_state & I_NEW))
249+
return inode;
243250

244251
f = JFFS2_INODE_INFO(inode);
245252
c = JFFS2_SB_INFO(inode->i_sb);
@@ -250,9 +257,9 @@ void jffs2_read_inode (struct inode *inode)
250257
ret = jffs2_do_read_inode(c, f, inode->i_ino, &latest_node);
251258

252259
if (ret) {
253-
make_bad_inode(inode);
254260
up(&f->sem);
255-
return;
261+
iget_failed(inode);
262+
return ERR_PTR(ret);
256263
}
257264
inode->i_mode = jemode_to_cpu(latest_node.mode);
258265
inode->i_uid = je16_to_cpu(latest_node.uid);
@@ -303,19 +310,14 @@ void jffs2_read_inode (struct inode *inode)
303310
if (f->metadata->size != sizeof(jdev.old) &&
304311
f->metadata->size != sizeof(jdev.new)) {
305312
printk(KERN_NOTICE "Device node has strange size %d\n", f->metadata->size);
306-
up(&f->sem);
307-
jffs2_do_clear_inode(c, f);
308-
make_bad_inode(inode);
309-
return;
313+
goto error_io;
310314
}
311315
D1(printk(KERN_DEBUG "Reading device numbers from flash\n"));
312-
if (jffs2_read_dnode(c, f, f->metadata, (char *)&jdev, 0, f->metadata->size) < 0) {
316+
ret = jffs2_read_dnode(c, f, f->metadata, (char *)&jdev, 0, f->metadata->size);
317+
if (ret < 0) {
313318
/* Eep */
314319
printk(KERN_NOTICE "Read device numbers for inode %lu failed\n", (unsigned long)inode->i_ino);
315-
up(&f->sem);
316-
jffs2_do_clear_inode(c, f);
317-
make_bad_inode(inode);
318-
return;
320+
goto error;
319321
}
320322
if (f->metadata->size == sizeof(jdev.old))
321323
rdev = old_decode_dev(je16_to_cpu(jdev.old));
@@ -335,6 +337,16 @@ void jffs2_read_inode (struct inode *inode)
335337
up(&f->sem);
336338

337339
D1(printk(KERN_DEBUG "jffs2_read_inode() returning\n"));
340+
unlock_new_inode(inode);
341+
return inode;
342+
343+
error_io:
344+
ret = -EIO;
345+
error:
346+
up(&f->sem);
347+
jffs2_do_clear_inode(c, f);
348+
iget_failed(inode);
349+
return ERR_PTR(ret);
338350
}
339351

340352
void jffs2_dirty_inode(struct inode *inode)
@@ -522,15 +534,16 @@ int jffs2_do_fill_super(struct super_block *sb, void *data, int silent)
522534
if ((ret = jffs2_do_mount_fs(c)))
523535
goto out_inohash;
524536

525-
ret = -EINVAL;
526-
527537
D1(printk(KERN_DEBUG "jffs2_do_fill_super(): Getting root inode\n"));
528-
root_i = iget(sb, 1);
529-
if (is_bad_inode(root_i)) {
538+
root_i = jffs2_iget(sb, 1);
539+
if (IS_ERR(root_i)) {
530540
D1(printk(KERN_WARNING "get root inode failed\n"));
531-
goto out_root_i;
541+
ret = PTR_ERR(root_i);
542+
goto out_root;
532543
}
533544

545+
ret = -ENOMEM;
546+
534547
D1(printk(KERN_DEBUG "jffs2_do_fill_super(): d_alloc_root()\n"));
535548
sb->s_root = d_alloc_root(root_i);
536549
if (!sb->s_root)
@@ -546,6 +559,7 @@ int jffs2_do_fill_super(struct super_block *sb, void *data, int silent)
546559

547560
out_root_i:
548561
iput(root_i);
562+
out_root:
549563
jffs2_free_ino_caches(c);
550564
jffs2_free_raw_node_refs(c);
551565
if (jffs2_blocks_use_vmalloc(c))
@@ -615,9 +629,9 @@ struct jffs2_inode_info *jffs2_gc_fetch_inode(struct jffs2_sb_info *c,
615629
jffs2_do_unlink() would need the alloc_sem and we have it.
616630
Just iget() it, and if read_inode() is necessary that's OK.
617631
*/
618-
inode = iget(OFNI_BS_2SFFJ(c), inum);
619-
if (!inode)
620-
return ERR_PTR(-ENOMEM);
632+
inode = jffs2_iget(OFNI_BS_2SFFJ(c), inum);
633+
if (IS_ERR(inode))
634+
return ERR_CAST(inode);
621635
}
622636
if (is_bad_inode(inode)) {
623637
printk(KERN_NOTICE "Eep. read_inode() failed for ino #%u. nlink %d\n",

fs/jffs2/os-linux.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ extern const struct inode_operations jffs2_symlink_inode_operations;
175175
/* fs.c */
176176
int jffs2_setattr (struct dentry *, struct iattr *);
177177
int jffs2_do_setattr (struct inode *, struct iattr *);
178-
void jffs2_read_inode (struct inode *);
178+
struct inode *jffs2_iget(struct super_block *, unsigned long);
179179
void jffs2_clear_inode (struct inode *);
180180
void jffs2_dirty_inode(struct inode *inode);
181181
struct inode *jffs2_new_inode (struct inode *dir_i, int mode,

fs/jffs2/super.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ static const struct super_operations jffs2_super_operations =
6565
{
6666
.alloc_inode = jffs2_alloc_inode,
6767
.destroy_inode =jffs2_destroy_inode,
68-
.read_inode = jffs2_read_inode,
6968
.put_super = jffs2_put_super,
7069
.write_super = jffs2_write_super,
7170
.statfs = jffs2_statfs,

0 commit comments

Comments
 (0)