Commit eab1df71a0ef6d333b9b826deaa0d0eb4b4f69dc

Authored by David Howells
Committed by Linus Torvalds
1 parent 5451f79f5f

iget: stop JFS from using iget() and read_inode()

Stop the JFS filesystem from using iget() and read_inode().  Replace
jfs_read_inode() with jfs_iget(), and call that instead of iget().  jfs_iget()
then uses iget_locked() directly and returns a proper error code instead of an
inode in the event of an error.

jfs_fill_super() returns any error incurred when getting the root inode
instead of EINVAL.

Signed-off-by: David Howells <dhowells@redhat.com>
Acked-by: Dave Kleikamp <shaggy@linux.vnet.ibm.com>
Acked-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 4 changed files with 40 additions and 31 deletions Side-by-side Diff

... ... @@ -31,11 +31,21 @@
31 31 #include "jfs_debug.h"
32 32  
33 33  
34   -void jfs_read_inode(struct inode *inode)
  34 +struct inode *jfs_iget(struct super_block *sb, unsigned long ino)
35 35 {
36   - if (diRead(inode)) {
37   - make_bad_inode(inode);
38   - return;
  36 + struct inode *inode;
  37 + int ret;
  38 +
  39 + inode = iget_locked(sb, ino);
  40 + if (!inode)
  41 + return ERR_PTR(-ENOMEM);
  42 + if (!(inode->i_state & I_NEW))
  43 + return inode;
  44 +
  45 + ret = diRead(inode);
  46 + if (ret < 0) {
  47 + iget_failed(inode);
  48 + return ERR_PTR(ret);
39 49 }
40 50  
41 51 if (S_ISREG(inode->i_mode)) {
... ... @@ -55,6 +65,8 @@
55 65 inode->i_op = &jfs_file_inode_operations;
56 66 init_special_inode(inode, inode->i_mode, inode->i_rdev);
57 67 }
  68 + unlock_new_inode(inode);
  69 + return inode;
58 70 }
59 71  
60 72 /*
... ... @@ -24,7 +24,7 @@
24 24 extern int jfs_fsync(struct file *, struct dentry *, int);
25 25 extern int jfs_ioctl(struct inode *, struct file *,
26 26 unsigned int, unsigned long);
27   -extern void jfs_read_inode(struct inode *);
  27 +extern struct inode *jfs_iget(struct super_block *, unsigned long);
28 28 extern int jfs_commit_inode(struct inode *, int);
29 29 extern int jfs_write_inode(struct inode*, int);
30 30 extern void jfs_delete_inode(struct inode *);
... ... @@ -1462,12 +1462,10 @@
1462 1462 }
1463 1463 }
1464 1464  
1465   - ip = iget(dip->i_sb, inum);
1466   - if (ip == NULL || is_bad_inode(ip)) {
  1465 + ip = jfs_iget(dip->i_sb, inum);
  1466 + if (IS_ERR(ip)) {
1467 1467 jfs_err("jfs_lookup: iget failed on inum %d", (uint) inum);
1468   - if (ip)
1469   - iput(ip);
1470   - return ERR_PTR(-EACCES);
  1468 + return ERR_CAST(ip);
1471 1469 }
1472 1470  
1473 1471 dentry = d_splice_alias(ip, dentry);
1474 1472  
... ... @@ -1485,12 +1483,11 @@
1485 1483  
1486 1484 if (ino == 0)
1487 1485 return ERR_PTR(-ESTALE);
1488   - inode = iget(sb, ino);
1489   - if (inode == NULL)
1490   - return ERR_PTR(-ENOMEM);
  1486 + inode = jfs_iget(sb, ino);
  1487 + if (IS_ERR(inode))
  1488 + return ERR_CAST(inode);
1491 1489  
1492   - if (is_bad_inode(inode) ||
1493   - (generation && inode->i_generation != generation)) {
  1490 + if (generation && inode->i_generation != generation) {
1494 1491 iput(inode);
1495 1492 return ERR_PTR(-ESTALE);
1496 1493 }
1497 1494  
... ... @@ -1521,17 +1518,14 @@
1521 1518  
1522 1519 parent_ino =
1523 1520 le32_to_cpu(JFS_IP(dentry->d_inode)->i_dtroot.header.idotdot);
1524   - inode = iget(sb, parent_ino);
1525   - if (inode) {
1526   - if (is_bad_inode(inode)) {
  1521 + inode = jfs_iget(sb, parent_ino);
  1522 + if (IS_ERR(inode)) {
  1523 + parent = ERR_CAST(inode);
  1524 + } else {
  1525 + parent = d_alloc_anon(inode);
  1526 + if (!parent) {
  1527 + parent = ERR_PTR(-ENOMEM);
1527 1528 iput(inode);
1528   - parent = ERR_PTR(-EACCES);
1529   - } else {
1530   - parent = d_alloc_anon(inode);
1531   - if (!parent) {
1532   - parent = ERR_PTR(-ENOMEM);
1533   - iput(inode);
1534   - }
1535 1529 }
1536 1530 }
1537 1531  
... ... @@ -414,7 +414,7 @@
414 414 struct inode *inode;
415 415 int rc;
416 416 s64 newLVSize = 0;
417   - int flag;
  417 + int flag, ret = -EINVAL;
418 418  
419 419 jfs_info("In jfs_read_super: s_flags=0x%lx", sb->s_flags);
420 420  
421 421  
... ... @@ -461,8 +461,10 @@
461 461 * Initialize direct-mapping inode/address-space
462 462 */
463 463 inode = new_inode(sb);
464   - if (inode == NULL)
  464 + if (inode == NULL) {
  465 + ret = -ENOMEM;
465 466 goto out_kfree;
  467 + }
466 468 inode->i_ino = 0;
467 469 inode->i_nlink = 1;
468 470 inode->i_size = sb->s_bdev->bd_inode->i_size;
469 471  
... ... @@ -494,9 +496,11 @@
494 496  
495 497 sb->s_magic = JFS_SUPER_MAGIC;
496 498  
497   - inode = iget(sb, ROOT_I);
498   - if (!inode || is_bad_inode(inode))
  499 + inode = jfs_iget(sb, ROOT_I);
  500 + if (IS_ERR(inode)) {
  501 + ret = PTR_ERR(inode);
499 502 goto out_no_root;
  503 + }
500 504 sb->s_root = d_alloc_root(inode);
501 505 if (!sb->s_root)
502 506 goto out_no_root;
... ... @@ -536,7 +540,7 @@
536 540 if (sbi->nls_tab)
537 541 unload_nls(sbi->nls_tab);
538 542 kfree(sbi);
539   - return -EINVAL;
  543 + return ret;
540 544 }
541 545  
542 546 static void jfs_write_super_lockfs(struct super_block *sb)
... ... @@ -726,7 +730,6 @@
726 730 static const struct super_operations jfs_super_operations = {
727 731 .alloc_inode = jfs_alloc_inode,
728 732 .destroy_inode = jfs_destroy_inode,
729   - .read_inode = jfs_read_inode,
730 733 .dirty_inode = jfs_dirty_inode,
731 734 .write_inode = jfs_write_inode,
732 735 .delete_inode = jfs_delete_inode,