Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

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

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

[akpm@linux-foundation.org: coding-style fixes]
Signed-off-by: David Howells <dhowells@redhat.com>
Cc: Roman Zippel <zippel@linux-m68k.org>
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>

authored by

David Howells and committed by
Linus Torvalds
210f8559 69840b0d

+32 -19
+2 -1
fs/affs/affs.h
··· 174 174 extern void affs_drop_inode(struct inode *inode); 175 175 extern void affs_delete_inode(struct inode *inode); 176 176 extern void affs_clear_inode(struct inode *inode); 177 - extern void affs_read_inode(struct inode *inode); 177 + extern struct inode *affs_iget(struct super_block *sb, 178 + unsigned long ino); 178 179 extern int affs_write_inode(struct inode *inode, int); 179 180 extern int affs_add_entry(struct inode *dir, struct inode *inode, struct dentry *dentry, s32 type); 180 181
+4 -2
fs/affs/amigaffs.c
··· 170 170 if (!link_bh) 171 171 goto done; 172 172 173 - dir = iget(sb, be32_to_cpu(AFFS_TAIL(sb, link_bh)->parent)); 174 - if (!dir) 173 + dir = affs_iget(sb, be32_to_cpu(AFFS_TAIL(sb, link_bh)->parent)); 174 + if (IS_ERR(dir)) { 175 + retval = PTR_ERR(dir); 175 176 goto done; 177 + } 176 178 177 179 affs_lock_dir(dir); 178 180 affs_fix_dcache(dentry, link_ino);
+13 -7
fs/affs/inode.c
··· 15 15 extern const struct inode_operations affs_symlink_inode_operations; 16 16 extern struct timezone sys_tz; 17 17 18 - void 19 - affs_read_inode(struct inode *inode) 18 + struct inode *affs_iget(struct super_block *sb, unsigned long ino) 20 19 { 21 - struct super_block *sb = inode->i_sb; 22 20 struct affs_sb_info *sbi = AFFS_SB(sb); 23 21 struct buffer_head *bh; 24 22 struct affs_head *head; 25 23 struct affs_tail *tail; 24 + struct inode *inode; 26 25 u32 block; 27 26 u32 size; 28 27 u32 prot; 29 28 u16 id; 30 29 31 - pr_debug("AFFS: read_inode(%lu)\n",inode->i_ino); 30 + inode = iget_locked(sb, ino); 31 + if (!inode) 32 + return ERR_PTR(-ENOMEM); 33 + if (!(inode->i_state & I_NEW)) 34 + return inode; 35 + 36 + pr_debug("AFFS: affs_iget(%lu)\n", inode->i_ino); 32 37 33 38 block = inode->i_ino; 34 39 bh = affs_bread(sb, block); ··· 159 154 sys_tz.tz_minuteswest * 60; 160 155 inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec = inode->i_atime.tv_nsec = 0; 161 156 affs_brelse(bh); 162 - return; 157 + unlock_new_inode(inode); 158 + return inode; 163 159 164 160 bad_inode: 165 - make_bad_inode(inode); 166 161 affs_brelse(bh); 167 - return; 162 + iget_failed(inode); 163 + return ERR_PTR(-EIO); 168 164 } 169 165 170 166 int
+4 -6
fs/affs/namei.c
··· 208 208 affs_lock_dir(dir); 209 209 bh = affs_find_entry(dir, dentry); 210 210 affs_unlock_dir(dir); 211 - if (IS_ERR(bh)) { 211 + if (IS_ERR(bh)) 212 212 return ERR_CAST(bh); 213 - } 214 213 if (bh) { 215 214 u32 ino = bh->b_blocknr; 216 215 ··· 222 223 ino = be32_to_cpu(AFFS_TAIL(sb, bh)->original); 223 224 } 224 225 affs_brelse(bh); 225 - inode = iget(sb, ino); 226 - if (!inode) { 227 - return ERR_PTR(-EACCES); 228 - } 226 + inode = affs_iget(sb, ino); 227 + if (IS_ERR(inode)) 228 + return ERR_PTR(PTR_ERR(inode)); 229 229 } 230 230 dentry->d_op = AFFS_SB(sb)->s_flags & SF_INTL ? &affs_intl_dentry_operations : &affs_dentry_operations; 231 231 d_add(dentry, inode);
+9 -3
fs/affs/super.c
··· 113 113 static const struct super_operations affs_sops = { 114 114 .alloc_inode = affs_alloc_inode, 115 115 .destroy_inode = affs_destroy_inode, 116 - .read_inode = affs_read_inode, 117 116 .write_inode = affs_write_inode, 118 117 .put_inode = affs_put_inode, 119 118 .drop_inode = affs_drop_inode, ··· 270 271 unsigned long mount_flags; 271 272 int tmp_flags; /* fix remount prototype... */ 272 273 u8 sig[4]; 274 + int ret = -EINVAL; 273 275 274 276 pr_debug("AFFS: read_super(%s)\n",data ? (const char *)data : "no options"); 275 277 ··· 444 444 445 445 /* set up enough so that it can read an inode */ 446 446 447 - root_inode = iget(sb, root_block); 447 + root_inode = affs_iget(sb, root_block); 448 + if (IS_ERR(root_inode)) { 449 + ret = PTR_ERR(root_inode); 450 + goto out_error_noinode; 451 + } 452 + 448 453 sb->s_root = d_alloc_root(root_inode); 449 454 if (!sb->s_root) { 450 455 printk(KERN_ERR "AFFS: Get root inode failed\n"); ··· 466 461 out_error: 467 462 if (root_inode) 468 463 iput(root_inode); 464 + out_error_noinode: 469 465 kfree(sbi->s_bitmap); 470 466 affs_brelse(root_bh); 471 467 kfree(sbi->s_prefix); 472 468 kfree(sbi); 473 469 sb->s_fs_info = NULL; 474 - return -EINVAL; 470 + return ret; 475 471 } 476 472 477 473 static int