Skip to content

Commit

Permalink
make d_splice_alias(ERR_PTR(err), dentry) = ERR_PTR(err)
Browse files Browse the repository at this point in the history
... and simplify the living hell out of callers

Signed-off-by: Al Viro <[email protected]>
  • Loading branch information
Al Viro committed Jul 20, 2011
1 parent 0c1aa9a commit a904937
Show file tree
Hide file tree
Showing 15 changed files with 39 additions and 94 deletions.
8 changes: 1 addition & 7 deletions fs/btrfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -4079,13 +4079,7 @@ static int btrfs_dentry_delete(const struct dentry *dentry)
static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry,
struct nameidata *nd)
{
struct inode *inode;

inode = btrfs_lookup_dentry(dir, dentry);
if (IS_ERR(inode))
return ERR_CAST(inode);

return d_splice_alias(inode, dentry);
return d_splice_alias(btrfs_lookup_dentry(dir, dentry), dentry);
}

unsigned char btrfs_filetype_table[] = {
Expand Down
3 changes: 3 additions & 0 deletions fs/dcache.c
Original file line number Diff line number Diff line change
Expand Up @@ -1652,6 +1652,9 @@ struct dentry *d_splice_alias(struct inode *inode, struct dentry *dentry)
{
struct dentry *new = NULL;

if (IS_ERR(inode))
return ERR_CAST(inode);

if (inode && S_ISDIR(inode->i_mode)) {
spin_lock(&inode->i_lock);
new = __d_find_alias(inode, 1);
Expand Down
7 changes: 2 additions & 5 deletions fs/efs/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,14 +60,11 @@ static efs_ino_t efs_find_entry(struct inode *inode, const char *name, int len)

struct dentry *efs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) {
efs_ino_t inodenum;
struct inode * inode = NULL;
struct inode *inode = NULL;

inodenum = efs_find_entry(dir, dentry->d_name.name, dentry->d_name.len);
if (inodenum) {
if (inodenum)
inode = efs_iget(dir->i_sb, inodenum);
if (IS_ERR(inode))
return ERR_CAST(inode);
}

return d_splice_alias(inode, dentry);
}
Expand Down
7 changes: 1 addition & 6 deletions fs/exofs/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,7 @@ static struct dentry *exofs_lookup(struct inode *dir, struct dentry *dentry,
return ERR_PTR(-ENAMETOOLONG);

ino = exofs_inode_by_name(dir, dentry);
inode = NULL;
if (ino) {
inode = exofs_iget(dir->i_sb, ino);
if (IS_ERR(inode))
return ERR_CAST(inode);
}
inode = ino ? exofs_iget(dir->i_sb, ino) : NULL;
return d_splice_alias(inode, dentry);
}

Expand Down
14 changes: 5 additions & 9 deletions fs/ext2/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,15 +67,11 @@ static struct dentry *ext2_lookup(struct inode * dir, struct dentry *dentry, str
inode = NULL;
if (ino) {
inode = ext2_iget(dir->i_sb, ino);
if (IS_ERR(inode)) {
if (PTR_ERR(inode) == -ESTALE) {
ext2_error(dir->i_sb, __func__,
"deleted inode referenced: %lu",
(unsigned long) ino);
return ERR_PTR(-EIO);
} else {
return ERR_CAST(inode);
}
if (inode == ERR_PTR(-ESTALE)) {
ext2_error(dir->i_sb, __func__,
"deleted inode referenced: %lu",
(unsigned long) ino);
return ERR_PTR(-EIO);
}
}
return d_splice_alias(inode, dentry);
Expand Down
14 changes: 5 additions & 9 deletions fs/ext3/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -1038,15 +1038,11 @@ static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry, str
return ERR_PTR(-EIO);
}
inode = ext3_iget(dir->i_sb, ino);
if (IS_ERR(inode)) {
if (PTR_ERR(inode) == -ESTALE) {
ext3_error(dir->i_sb, __func__,
"deleted inode referenced: %lu",
ino);
return ERR_PTR(-EIO);
} else {
return ERR_CAST(inode);
}
if (inode == ERR_PTR(-ESTALE)) {
ext3_error(dir->i_sb, __func__,
"deleted inode referenced: %lu",
ino);
return ERR_PTR(-EIO);
}
}
return d_splice_alias(inode, dentry);
Expand Down
14 changes: 5 additions & 9 deletions fs/ext4/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -1037,15 +1037,11 @@ static struct dentry *ext4_lookup(struct inode *dir, struct dentry *dentry, stru
return ERR_PTR(-EIO);
}
inode = ext4_iget(dir->i_sb, ino);
if (IS_ERR(inode)) {
if (PTR_ERR(inode) == -ESTALE) {
EXT4_ERROR_INODE(dir,
"deleted inode referenced: %u",
ino);
return ERR_PTR(-EIO);
} else {
return ERR_CAST(inode);
}
if (inode == ERR_PTR(-ESTALE)) {
EXT4_ERROR_INODE(dir,
"deleted inode referenced: %u",
ino);
return ERR_PTR(-EIO);
}
}
return d_splice_alias(inode, dentry);
Expand Down
29 changes: 10 additions & 19 deletions fs/fat/namei_msdos.c
Original file line number Diff line number Diff line change
Expand Up @@ -209,29 +209,20 @@ static struct dentry *msdos_lookup(struct inode *dir, struct dentry *dentry,
int err;

lock_super(sb);

err = msdos_find(dir, dentry->d_name.name, dentry->d_name.len, &sinfo);
if (err) {
if (err == -ENOENT) {
inode = NULL;
goto out;
}
goto error;
}

inode = fat_build_inode(sb, sinfo.de, sinfo.i_pos);
brelse(sinfo.bh);
if (IS_ERR(inode)) {
err = PTR_ERR(inode);
goto error;
switch (err) {
case -ENOENT:
inode = NULL;
break;
case 0:
inode = fat_build_inode(sb, sinfo.de, sinfo.i_pos);
brelse(sinfo.bh);
break;
default:
inode = ERR_PTR(err);
}
out:
unlock_super(sb);
return d_splice_alias(inode, dentry);

error:
unlock_super(sb);
return ERR_PTR(err);
}

/***** Creates a directory entry (name is already formatted). */
Expand Down
11 changes: 3 additions & 8 deletions fs/isofs/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -183,14 +183,9 @@ struct dentry *isofs_lookup(struct inode *dir, struct dentry *dentry, struct nam
1024 + page_address(page));
__free_page(page);

inode = NULL;
if (found) {
inode = isofs_iget(dir->i_sb, block, offset);
if (IS_ERR(inode)) {
mutex_unlock(&sbi->s_mutex);
return ERR_CAST(inode);
}
}
inode = found ? isofs_iget(dir->i_sb, block, offset) : NULL;

mutex_unlock(&sbi->s_mutex);

return d_splice_alias(inode, dentry);
}
4 changes: 1 addition & 3 deletions fs/jffs2/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -102,10 +102,8 @@ static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
mutex_unlock(&dir_f->sem);
if (ino) {
inode = jffs2_iget(dir_i->i_sb, ino);
if (IS_ERR(inode)) {
if (IS_ERR(inode))
printk(KERN_WARNING "iget() failed for ino #%u\n", ino);
return ERR_CAST(inode);
}
}

return d_splice_alias(inode, target);
Expand Down
4 changes: 1 addition & 3 deletions fs/jfs/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -1481,10 +1481,8 @@ static struct dentry *jfs_lookup(struct inode *dip, struct dentry *dentry, struc
}

ip = jfs_iget(dip->i_sb, inum);
if (IS_ERR(ip)) {
if (IS_ERR(ip))
jfs_err("jfs_lookup: iget failed on inum %d", (uint) inum);
return ERR_CAST(ip);
}

return d_splice_alias(ip, dentry);
}
Expand Down
4 changes: 1 addition & 3 deletions fs/logfs/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -371,11 +371,9 @@ static struct dentry *logfs_lookup(struct inode *dir, struct dentry *dentry,
page_cache_release(page);

inode = logfs_iget(dir->i_sb, ino);
if (IS_ERR(inode)) {
if (IS_ERR(inode))
printk(KERN_ERR"LogFS: Cannot read inode #%llx for dentry (%lx, %lx)n",
ino, dir->i_ino, index);
return ERR_CAST(inode);
}
return d_splice_alias(inode, dentry);
}

Expand Down
7 changes: 1 addition & 6 deletions fs/nilfs2/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,12 +72,7 @@ nilfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
return ERR_PTR(-ENAMETOOLONG);

ino = nilfs_inode_by_name(dir, &dentry->d_name);
inode = NULL;
if (ino) {
inode = nilfs_iget(dir->i_sb, NILFS_I(dir)->i_root, ino);
if (IS_ERR(inode))
return ERR_CAST(inode);
}
inode = ino ? nilfs_iget(dir->i_sb, NILFS_I(dir)->i_root, ino) : NULL;
return d_splice_alias(inode, dentry);
}

Expand Down
5 changes: 0 additions & 5 deletions fs/squashfs/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -220,11 +220,6 @@ static struct dentry *squashfs_lookup(struct inode *dir, struct dentry *dentry,
blk, off, ino_num);

inode = squashfs_iget(dir->i_sb, ino, ino_num);
if (IS_ERR(inode)) {
err = PTR_ERR(inode);
goto failed;
}

goto exit_lookup;
}
}
Expand Down
2 changes: 0 additions & 2 deletions fs/ufs/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,6 @@ static struct dentry *ufs_lookup(struct inode * dir, struct dentry *dentry, stru
if (ino)
inode = ufs_iget(dir->i_sb, ino);
unlock_ufs(dir->i_sb);
if (IS_ERR(inode))
return ERR_CAST(inode);
return d_splice_alias(inode, dentry);
}

Expand Down

0 comments on commit a904937

Please sign in to comment.