* [PATCH 3/4] switch all filesystems over to d_obtain_alias
@ 2008-08-11 13:49 Christoph Hellwig
2008-08-12 12:29 ` steve
2008-09-09 13:28 ` Miklos Szeredi
0 siblings, 2 replies; 4+ messages in thread
From: Christoph Hellwig @ 2008-08-11 13:49 UTC (permalink / raw)
To: viro; +Cc: linux-fsdevel
Switch all users of d_alloc_anon to d_obtain_alias.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Index: linux-2.6/fs/efs/namei.c
===================================================================
--- linux-2.6.orig/fs/efs/namei.c 2008-08-11 10:35:13.000000000 -0300
+++ linux-2.6/fs/efs/namei.c 2008-08-11 10:35:18.000000000 -0300
@@ -113,35 +113,14 @@ struct dentry *efs_fh_to_parent(struct s
struct dentry *efs_get_parent(struct dentry *child)
{
- struct dentry *parent;
- struct inode *inode;
+ struct dentry *parent = ERR_PTR(-ENOENT);
efs_ino_t ino;
- long error;
lock_kernel();
-
- error = -ENOENT;
ino = efs_find_entry(child->d_inode, "..", 2);
- if (!ino)
- goto fail;
-
- inode = efs_iget(child->d_inode->i_sb, ino);
- if (IS_ERR(inode)) {
- error = PTR_ERR(inode);
- goto fail;
- }
-
- error = -ENOMEM;
- parent = d_alloc_anon(inode);
- if (!parent)
- goto fail_iput;
-
+ if (ino)
+ parent = d_obtain_alias(efs_iget(child->d_inode->i_sb, ino));
unlock_kernel();
- return parent;
- fail_iput:
- iput(inode);
- fail:
- unlock_kernel();
- return ERR_PTR(error);
+ return parent;
}
Index: linux-2.6/fs/ext2/namei.c
===================================================================
--- linux-2.6.orig/fs/ext2/namei.c 2008-08-11 10:35:13.000000000 -0300
+++ linux-2.6/fs/ext2/namei.c 2008-08-11 10:35:18.000000000 -0300
@@ -73,8 +73,6 @@ static struct dentry *ext2_lookup(struct
struct dentry *ext2_get_parent(struct dentry *child)
{
unsigned long ino;
- struct dentry *parent;
- struct inode *inode;
struct dentry dotdot;
dotdot.d_name.name = "..";
@@ -83,16 +81,7 @@ struct dentry *ext2_get_parent(struct de
ino = ext2_inode_by_name(child->d_inode, &dotdot);
if (!ino)
return ERR_PTR(-ENOENT);
- inode = ext2_iget(child->d_inode->i_sb, ino);
-
- if (IS_ERR(inode))
- return ERR_CAST(inode);
- parent = d_alloc_anon(inode);
- if (!parent) {
- iput(inode);
- parent = ERR_PTR(-ENOMEM);
- }
- return parent;
+ return d_obtain_alias(ext2_iget(child->d_inode->i_sb, ino));
}
/*
Index: linux-2.6/fs/ext3/namei.c
===================================================================
--- linux-2.6.orig/fs/ext3/namei.c 2008-08-11 10:35:13.000000000 -0300
+++ linux-2.6/fs/ext3/namei.c 2008-08-11 10:35:18.000000000 -0300
@@ -1057,8 +1057,6 @@ static struct dentry *ext3_lookup(struct
struct dentry *ext3_get_parent(struct dentry *child)
{
unsigned long ino;
- struct dentry *parent;
- struct inode *inode;
struct dentry dotdot;
struct ext3_dir_entry_2 * de;
struct buffer_head *bh;
@@ -1068,7 +1066,6 @@ struct dentry *ext3_get_parent(struct de
dotdot.d_parent = child; /* confusing, isn't it! */
bh = ext3_find_entry(&dotdot, &de);
- inode = NULL;
if (!bh)
return ERR_PTR(-ENOENT);
ino = le32_to_cpu(de->inode);
@@ -1080,16 +1077,7 @@ struct dentry *ext3_get_parent(struct de
return ERR_PTR(-EIO);
}
- inode = ext3_iget(child->d_inode->i_sb, ino);
- if (IS_ERR(inode))
- return ERR_CAST(inode);
-
- parent = d_alloc_anon(inode);
- if (!parent) {
- iput(inode);
- parent = ERR_PTR(-ENOMEM);
- }
- return parent;
+ return d_obtain_alias(ext3_iget(child->d_inode->i_sb, ino));
}
#define S_SHIFT 12
Index: linux-2.6/fs/ext4/namei.c
===================================================================
--- linux-2.6.orig/fs/ext4/namei.c 2008-08-11 10:35:13.000000000 -0300
+++ linux-2.6/fs/ext4/namei.c 2008-08-11 10:35:18.000000000 -0300
@@ -1060,8 +1060,6 @@ static struct dentry *ext4_lookup(struct
struct dentry *ext4_get_parent(struct dentry *child)
{
unsigned long ino;
- struct dentry *parent;
- struct inode *inode;
struct dentry dotdot;
struct ext4_dir_entry_2 * de;
struct buffer_head *bh;
@@ -1071,7 +1069,6 @@ struct dentry *ext4_get_parent(struct de
dotdot.d_parent = child; /* confusing, isn't it! */
bh = ext4_find_entry(&dotdot, &de);
- inode = NULL;
if (!bh)
return ERR_PTR(-ENOENT);
ino = le32_to_cpu(de->inode);
@@ -1083,16 +1080,7 @@ struct dentry *ext4_get_parent(struct de
return ERR_PTR(-EIO);
}
- inode = ext4_iget(child->d_inode->i_sb, ino);
- if (IS_ERR(inode))
- return ERR_CAST(inode);
-
- parent = d_alloc_anon(inode);
- if (!parent) {
- iput(inode);
- parent = ERR_PTR(-ENOMEM);
- }
- return parent;
+ return d_obtain_alias(ext4_iget(child->d_inode->i_sb, ino));
}
#define S_SHIFT 12
Index: linux-2.6/fs/isofs/export.c
===================================================================
--- linux-2.6.orig/fs/isofs/export.c 2008-08-11 10:35:13.000000000 -0300
+++ linux-2.6/fs/isofs/export.c 2008-08-11 10:35:18.000000000 -0300
@@ -22,7 +22,7 @@ isofs_export_iget(struct super_block *sb
__u32 generation)
{
struct inode *inode;
- struct dentry *result;
+
if (block == 0)
return ERR_PTR(-ESTALE);
inode = isofs_iget(sb, block, offset);
@@ -32,12 +32,7 @@ isofs_export_iget(struct super_block *sb
iput(inode);
return ERR_PTR(-ESTALE);
}
- result = d_alloc_anon(inode);
- if (!result) {
- iput(inode);
- return ERR_PTR(-ENOMEM);
- }
- return result;
+ return d_obtain_alias(inode);
}
/* This function is surprisingly simple. The trick is understanding
@@ -51,7 +46,6 @@ static struct dentry *isofs_export_get_p
unsigned long parent_offset = 0;
struct inode *child_inode = child->d_inode;
struct iso_inode_info *e_child_inode = ISOFS_I(child_inode);
- struct inode *parent_inode = NULL;
struct iso_directory_record *de = NULL;
struct buffer_head * bh = NULL;
struct dentry *rv = NULL;
@@ -104,28 +98,11 @@ static struct dentry *isofs_export_get_p
/* Normalize */
isofs_normalize_block_and_offset(de, &parent_block, &parent_offset);
- /* Get the inode. */
- parent_inode = isofs_iget(child_inode->i_sb,
- parent_block,
- parent_offset);
- if (IS_ERR(parent_inode)) {
- rv = ERR_CAST(parent_inode);
- if (rv != ERR_PTR(-ENOMEM))
- rv = ERR_PTR(-EACCES);
- goto out;
- }
-
- /* Allocate the dentry. */
- rv = d_alloc_anon(parent_inode);
- if (rv == NULL) {
- rv = ERR_PTR(-ENOMEM);
- goto out;
- }
-
+ rv = d_obtain_alias(isofs_iget(child_inode->i_sb, parent_block,
+ parent_offset));
out:
- if (bh) {
+ if (bh)
brelse(bh);
- }
return rv;
}
Index: linux-2.6/fs/jfs/namei.c
===================================================================
--- linux-2.6.orig/fs/jfs/namei.c 2008-08-11 10:35:13.000000000 -0300
+++ linux-2.6/fs/jfs/namei.c 2008-08-11 10:35:18.000000000 -0300
@@ -1511,25 +1511,12 @@ struct dentry *jfs_fh_to_parent(struct s
struct dentry *jfs_get_parent(struct dentry *dentry)
{
- struct super_block *sb = dentry->d_inode->i_sb;
- struct dentry *parent = ERR_PTR(-ENOENT);
- struct inode *inode;
unsigned long parent_ino;
parent_ino =
le32_to_cpu(JFS_IP(dentry->d_inode)->i_dtroot.header.idotdot);
- inode = jfs_iget(sb, parent_ino);
- if (IS_ERR(inode)) {
- parent = ERR_CAST(inode);
- } else {
- parent = d_alloc_anon(inode);
- if (!parent) {
- parent = ERR_PTR(-ENOMEM);
- iput(inode);
- }
- }
- return parent;
+ return d_obtain_alias(jfs_iget(dentry->d_inode->i_sb, parent_ino));
}
const struct inode_operations jfs_dir_inode_operations = {
Index: linux-2.6/fs/ntfs/namei.c
===================================================================
--- linux-2.6.orig/fs/ntfs/namei.c 2008-08-11 10:35:13.000000000 -0300
+++ linux-2.6/fs/ntfs/namei.c 2008-08-11 10:35:18.000000000 -0300
@@ -304,8 +304,6 @@ static struct dentry *ntfs_get_parent(st
ntfs_attr_search_ctx *ctx;
ATTR_RECORD *attr;
FILE_NAME_ATTR *fn;
- struct inode *parent_vi;
- struct dentry *parent_dent;
unsigned long parent_ino;
int err;
@@ -345,24 +343,8 @@ try_next:
/* Release the search context and the mft record of the child. */
ntfs_attr_put_search_ctx(ctx);
unmap_mft_record(ni);
- /* Get the inode of the parent directory. */
- parent_vi = ntfs_iget(vi->i_sb, parent_ino);
- if (IS_ERR(parent_vi) || unlikely(is_bad_inode(parent_vi))) {
- if (!IS_ERR(parent_vi))
- iput(parent_vi);
- ntfs_error(vi->i_sb, "Failed to get parent directory inode "
- "0x%lx of child inode 0x%lx.", parent_ino,
- vi->i_ino);
- return ERR_PTR(-EACCES);
- }
- /* Finally get a dentry for the parent directory and return it. */
- parent_dent = d_alloc_anon(parent_vi);
- if (unlikely(!parent_dent)) {
- iput(parent_vi);
- return ERR_PTR(-ENOMEM);
- }
- ntfs_debug("Done for inode 0x%lx.", vi->i_ino);
- return parent_dent;
+
+ return d_obtain_alias(ntfs_iget(vi->i_sb, parent_ino));
}
static struct inode *ntfs_nfs_get_inode(struct super_block *sb,
Index: linux-2.6/fs/ocfs2/export.c
===================================================================
--- linux-2.6.orig/fs/ocfs2/export.c 2008-08-11 10:35:13.000000000 -0300
+++ linux-2.6/fs/ocfs2/export.c 2008-08-11 10:35:18.000000000 -0300
@@ -68,14 +68,9 @@ static struct dentry *ocfs2_get_dentry(s
return ERR_PTR(-ESTALE);
}
- result = d_alloc_anon(inode);
-
- if (!result) {
- iput(inode);
- mlog_errno(-ENOMEM);
- return ERR_PTR(-ENOMEM);
- }
- result->d_op = &ocfs2_dentry_ops;
+ result = d_obtain_alias(inode);
+ if (result && !IS_ERR(result))
+ result->d_op = &ocfs2_dentry_ops;
mlog_exit_ptr(result);
return result;
@@ -86,7 +81,6 @@ static struct dentry *ocfs2_get_parent(s
int status;
u64 blkno;
struct dentry *parent;
- struct inode *inode;
struct inode *dir = child->d_inode;
mlog_entry("(0x%p, '%.*s')\n", child,
@@ -109,21 +103,9 @@ static struct dentry *ocfs2_get_parent(s
goto bail_unlock;
}
- inode = ocfs2_iget(OCFS2_SB(dir->i_sb), blkno, 0, 0);
- if (IS_ERR(inode)) {
- mlog(ML_ERROR, "Unable to create inode %llu\n",
- (unsigned long long)blkno);
- parent = ERR_PTR(-EACCES);
- goto bail_unlock;
- }
-
- parent = d_alloc_anon(inode);
- if (!parent) {
- iput(inode);
- parent = ERR_PTR(-ENOMEM);
- }
-
- parent->d_op = &ocfs2_dentry_ops;
+ parent = d_obtain_alias(ocfs2_iget(OCFS2_SB(dir->i_sb), blkno, 0, 0));
+ if (parent && !IS_ERR(parent))
+ parent->d_op = &ocfs2_dentry_ops;
bail_unlock:
ocfs2_inode_unlock(dir, 0);
Index: linux-2.6/fs/reiserfs/inode.c
===================================================================
--- linux-2.6.orig/fs/reiserfs/inode.c 2008-08-11 10:35:13.000000000 -0300
+++ linux-2.6/fs/reiserfs/inode.c 2008-08-11 10:35:18.000000000 -0300
@@ -1522,7 +1522,6 @@ static struct dentry *reiserfs_get_dentr
{
struct cpu_key key;
- struct dentry *result;
struct inode *inode;
key.on_disk_key.k_objectid = objectid;
@@ -1535,16 +1534,8 @@ static struct dentry *reiserfs_get_dentr
inode = NULL;
}
reiserfs_write_unlock(sb);
- if (!inode)
- inode = ERR_PTR(-ESTALE);
- if (IS_ERR(inode))
- return ERR_CAST(inode);
- result = d_alloc_anon(inode);
- if (!result) {
- iput(inode);
- return ERR_PTR(-ENOMEM);
- }
- return result;
+
+ return d_obtain_alias(inode);
}
struct dentry *reiserfs_fh_to_dentry(struct super_block *sb, struct fid *fid,
Index: linux-2.6/fs/reiserfs/namei.c
===================================================================
--- linux-2.6.orig/fs/reiserfs/namei.c 2008-08-11 10:35:13.000000000 -0300
+++ linux-2.6/fs/reiserfs/namei.c 2008-08-11 10:35:18.000000000 -0300
@@ -383,7 +383,6 @@ struct dentry *reiserfs_get_parent(struc
struct inode *inode = NULL;
struct reiserfs_dir_entry de;
INITIALIZE_PATH(path_to_entry);
- struct dentry *parent;
struct inode *dir = child->d_inode;
if (dir->i_nlink == 0) {
@@ -401,15 +400,7 @@ struct dentry *reiserfs_get_parent(struc
inode = reiserfs_iget(dir->i_sb, (struct cpu_key *)&(de.de_dir_id));
reiserfs_write_unlock(dir->i_sb);
- if (!inode || IS_ERR(inode)) {
- return ERR_PTR(-EACCES);
- }
- parent = d_alloc_anon(inode);
- if (!parent) {
- iput(inode);
- parent = ERR_PTR(-ENOMEM);
- }
- return parent;
+ return d_obtain_alias(inode);
}
/* add entry to the directory (entry can be hidden).
Index: linux-2.6/fs/udf/namei.c
===================================================================
--- linux-2.6.orig/fs/udf/namei.c 2008-08-11 10:35:13.000000000 -0300
+++ linux-2.6/fs/udf/namei.c 2008-08-11 10:35:18.000000000 -0300
@@ -1243,7 +1243,6 @@ end_rename:
static struct dentry *udf_get_parent(struct dentry *child)
{
- struct dentry *parent;
struct inode *inode = NULL;
struct dentry dotdot;
struct fileIdentDesc cfi;
@@ -1266,13 +1265,7 @@ static struct dentry *udf_get_parent(str
goto out_unlock;
unlock_kernel();
- parent = d_alloc_anon(inode);
- if (!parent) {
- iput(inode);
- parent = ERR_PTR(-ENOMEM);
- }
-
- return parent;
+ return d_obtain_alias(inode);
out_unlock:
unlock_kernel();
return ERR_PTR(-EACCES);
@@ -1283,7 +1276,6 @@ static struct dentry *udf_nfs_get_inode(
u16 partref, __u32 generation)
{
struct inode *inode;
- struct dentry *result;
kernel_lb_addr loc;
if (block == 0)
@@ -1300,12 +1292,7 @@ static struct dentry *udf_nfs_get_inode(
iput(inode);
return ERR_PTR(-ESTALE);
}
- result = d_alloc_anon(inode);
- if (!result) {
- iput(inode);
- return ERR_PTR(-ENOMEM);
- }
- return result;
+ return d_obtain_alias(inode);
}
static struct dentry *udf_fh_to_dentry(struct super_block *sb,
Index: linux-2.6/fs/fat/inode.c
===================================================================
--- linux-2.6.orig/fs/fat/inode.c 2008-08-11 10:35:13.000000000 -0300
+++ linux-2.6/fs/fat/inode.c 2008-08-11 10:35:18.000000000 -0300
@@ -685,33 +685,24 @@ static struct dentry *fat_fh_to_dentry(s
inode = NULL;
}
}
- if (!inode) {
- /* For now, do nothing
- * What we could do is:
- * follow the file starting at fh[4], and record
- * the ".." entry, and the name of the fh[2] entry.
- * The follow the ".." file finding the next step up.
- * This way we build a path to the root of
- * the tree. If this works, we lookup the path and so
- * get this inode into the cache.
- * Finally try the fat_iget lookup again
- * If that fails, then weare totally out of luck
- * But all that is for another day
- */
- }
- if (!inode)
- return ERR_PTR(-ESTALE);
-
- /* now to find a dentry.
- * If possible, get a well-connected one
+ /*
+ * For now, do nothing if the inode is not found.
+ *
+ * What we could do is:
+ *
+ * - follow the file starting at fh[4], and record the ".." entry,
+ * and the name of the fh[2] entry.
+ * - then follow the ".." file finding the next step up.
+ *
+ * This way we build a path to the root of the tree. If this works, we
+ * lookup the path and so get this inode into the cache. Finally try
+ * the fat_iget lookup again. If that fails, then we are totally out
+ * of luck. But all that is for another day
*/
- result = d_alloc_anon(inode);
- if (result == NULL) {
- iput(inode);
- return ERR_PTR(-ENOMEM);
- }
- result->d_op = sb->s_root->d_op;
+ result = d_obtain_alias(inode);
+ if (result && !IS_ERR(result))
+ result->d_op = sb->s_root->d_op;
return result;
}
@@ -758,15 +749,8 @@ static struct dentry *fat_get_parent(str
}
inode = fat_build_inode(sb, de, i_pos);
brelse(bh);
- if (IS_ERR(inode)) {
- parent = ERR_CAST(inode);
- goto out;
- }
- parent = d_alloc_anon(inode);
- if (!parent) {
- iput(inode);
- parent = ERR_PTR(-ENOMEM);
- }
+
+ parent = d_obtain_alias(inode);
out:
unlock_super(sb);
Index: linux-2.6/fs/fuse/inode.c
===================================================================
--- linux-2.6.orig/fs/fuse/inode.c 2008-08-11 10:35:13.000000000 -0300
+++ linux-2.6/fs/fuse/inode.c 2008-08-11 10:35:18.000000000 -0300
@@ -596,12 +596,8 @@ static struct dentry *fuse_get_dentry(st
if (inode->i_generation != handle->generation)
goto out_iput;
- entry = d_alloc_anon(inode);
- err = -ENOMEM;
- if (!entry)
- goto out_iput;
-
- if (get_node_id(inode) != FUSE_ROOT_ID) {
+ entry = d_obtain_alias(inode);
+ if (entry && !IS_ERR(entry) && get_node_id(inode) != FUSE_ROOT_ID) {
entry->d_op = &fuse_dentry_operations;
fuse_invalidate_entry_cache(entry);
}
@@ -696,17 +692,14 @@ static struct dentry *fuse_get_parent(st
name.name = "..";
err = fuse_lookup_name(child_inode->i_sb, get_node_id(child_inode),
&name, &outarg, &inode);
- if (err && err != -ENOENT)
- return ERR_PTR(err);
- if (err || !inode)
- return ERR_PTR(-ESTALE);
-
- parent = d_alloc_anon(inode);
- if (!parent) {
- iput(inode);
- return ERR_PTR(-ENOMEM);
+ if (err) {
+ if (err == -ENOENT)
+ return -ESTALE;
+ return err;
}
- if (get_node_id(inode) != FUSE_ROOT_ID) {
+
+ parent = d_obtain_alias(inode);
+ if (parent && !IS_ERR(parent) && get_node_id(inode) != FUSE_ROOT_ID) {
parent->d_op = &fuse_dentry_operations;
fuse_invalidate_entry_cache(parent);
}
Index: linux-2.6/fs/gfs2/ops_export.c
===================================================================
--- linux-2.6.orig/fs/gfs2/ops_export.c 2008-08-11 10:35:13.000000000 -0300
+++ linux-2.6/fs/gfs2/ops_export.c 2008-08-11 10:35:18.000000000 -0300
@@ -130,28 +130,17 @@ static int gfs2_get_name(struct dentry *
static struct dentry *gfs2_get_parent(struct dentry *child)
{
struct qstr dotdot;
- struct inode *inode;
struct dentry *dentry;
- gfs2_str2qstr(&dotdot, "..");
- inode = gfs2_lookupi(child->d_inode, &dotdot, 1);
-
- if (!inode)
- return ERR_PTR(-ENOENT);
/*
- * In case of an error, @inode carries the error value, and we
- * have to return that as a(n invalid) pointer to dentry.
+ * XXX(hch): it would be a good idea to keep this around as a
+ * static variable.
*/
- if (IS_ERR(inode))
- return ERR_CAST(inode);
-
- dentry = d_alloc_anon(inode);
- if (!dentry) {
- iput(inode);
- return ERR_PTR(-ENOMEM);
- }
+ gfs2_str2qstr(&dotdot, "..");
- dentry->d_op = &gfs2_dops;
+ dentry = d_obtain_alias(gfs2_lookupi(child->d_inode, &dotdot, 1));
+ if (dentry && !IS_ERR(dentry))
+ dentry->d_op = &gfs2_dops;
return dentry;
}
@@ -233,13 +222,9 @@ static struct dentry *gfs2_get_dentry(st
gfs2_glock_dq_uninit(&i_gh);
out_inode:
- dentry = d_alloc_anon(inode);
- if (!dentry) {
- iput(inode);
- return ERR_PTR(-ENOMEM);
- }
-
- dentry->d_op = &gfs2_dops;
+ dentry = d_obtain_alias(inode);
+ if (dentry && !IS_ERR(dentry))
+ dentry->d_op = &gfs2_dops;
return dentry;
fail_rgd:
Index: linux-2.6/fs/nfs/getroot.c
===================================================================
--- linux-2.6.orig/fs/nfs/getroot.c 2008-08-11 10:35:13.000000000 -0300
+++ linux-2.6/fs/nfs/getroot.c 2008-08-11 10:35:18.000000000 -0300
@@ -107,9 +107,8 @@ struct dentry *nfs_get_root(struct super
* if the dentry tree reaches them; however if the dentry already
* exists, we'll pick it up at this point and use it as the root
*/
- mntroot = d_alloc_anon(inode);
+ mntroot = d_obtain_alias(inode);
if (!mntroot) {
- iput(inode);
dprintk("nfs_get_root: get root dentry failed\n");
return ERR_PTR(-ENOMEM);
}
@@ -277,9 +276,8 @@ struct dentry *nfs4_get_root(struct supe
* if the dentry tree reaches them; however if the dentry already
* exists, we'll pick it up at this point and use it as the root
*/
- mntroot = d_alloc_anon(inode);
+ mntroot = d_obtain_alias(inode);
if (!mntroot) {
- iput(inode);
dprintk("nfs_get_root: get root dentry failed\n");
return ERR_PTR(-ENOMEM);
}
Index: linux-2.6/fs/xfs/linux-2.6/xfs_export.c
===================================================================
--- linux-2.6.orig/fs/xfs/linux-2.6/xfs_export.c 2008-08-11 10:35:13.000000000 -0300
+++ linux-2.6/fs/xfs/linux-2.6/xfs_export.c 2008-08-11 10:35:18.000000000 -0300
@@ -102,18 +102,12 @@ xfs_fs_get_parent(
{
int error;
struct xfs_inode *cip;
- struct dentry *parent;
error = xfs_lookup(XFS_I(child->d_inode), &xfs_name_dotdot, &cip, NULL);
if (unlikely(error))
return ERR_PTR(-error);
- parent = d_alloc_anon(cip->i_vnode);
- if (unlikely(!parent)) {
- iput(cip->i_vnode);
- return ERR_PTR(-ENOMEM);
- }
- return parent;
+ return d_obtain_alias(cip->i_vnode);
}
const struct export_operations xfs_export_operations = {
Index: linux-2.6/fs/xfs/linux-2.6/xfs_ioctl.c
===================================================================
--- linux-2.6.orig/fs/xfs/linux-2.6/xfs_ioctl.c 2008-08-11 10:35:13.000000000 -0300
+++ linux-2.6/fs/xfs/linux-2.6/xfs_ioctl.c 2008-08-11 10:35:18.000000000 -0300
@@ -311,9 +311,8 @@ xfs_open_by_handle(
return new_fd;
}
- dentry = d_alloc_anon(inode);
+ dentry = d_obtain_alias(inode);
if (dentry == NULL) {
- iput(inode);
put_unused_fd(new_fd);
return -XFS_ERROR(ENOMEM);
}
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 3/4] switch all filesystems over to d_obtain_alias
2008-08-11 13:49 [PATCH 3/4] switch all filesystems over to d_obtain_alias Christoph Hellwig
@ 2008-08-12 12:29 ` steve
2008-09-09 13:28 ` Miklos Szeredi
1 sibling, 0 replies; 4+ messages in thread
From: steve @ 2008-08-12 12:29 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: viro, linux-fsdevel
Hi,
The GFS2 bits look ok to me,
Steve.
On Mon, Aug 11, 2008 at 03:49:04PM +0200, Christoph Hellwig wrote:
> Switch all users of d_alloc_anon to d_obtain_alias.
>
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
>
> Index: linux-2.6/fs/efs/namei.c
> ===================================================================
> --- linux-2.6.orig/fs/efs/namei.c 2008-08-11 10:35:13.000000000 -0300
> +++ linux-2.6/fs/efs/namei.c 2008-08-11 10:35:18.000000000 -0300
> @@ -113,35 +113,14 @@ struct dentry *efs_fh_to_parent(struct s
>
> struct dentry *efs_get_parent(struct dentry *child)
> {
> - struct dentry *parent;
> - struct inode *inode;
> + struct dentry *parent = ERR_PTR(-ENOENT);
> efs_ino_t ino;
> - long error;
>
> lock_kernel();
> -
> - error = -ENOENT;
> ino = efs_find_entry(child->d_inode, "..", 2);
> - if (!ino)
> - goto fail;
> -
> - inode = efs_iget(child->d_inode->i_sb, ino);
> - if (IS_ERR(inode)) {
> - error = PTR_ERR(inode);
> - goto fail;
> - }
> -
> - error = -ENOMEM;
> - parent = d_alloc_anon(inode);
> - if (!parent)
> - goto fail_iput;
> -
> + if (ino)
> + parent = d_obtain_alias(efs_iget(child->d_inode->i_sb, ino));
> unlock_kernel();
> - return parent;
>
> - fail_iput:
> - iput(inode);
> - fail:
> - unlock_kernel();
> - return ERR_PTR(error);
> + return parent;
> }
> Index: linux-2.6/fs/ext2/namei.c
> ===================================================================
> --- linux-2.6.orig/fs/ext2/namei.c 2008-08-11 10:35:13.000000000 -0300
> +++ linux-2.6/fs/ext2/namei.c 2008-08-11 10:35:18.000000000 -0300
> @@ -73,8 +73,6 @@ static struct dentry *ext2_lookup(struct
> struct dentry *ext2_get_parent(struct dentry *child)
> {
> unsigned long ino;
> - struct dentry *parent;
> - struct inode *inode;
> struct dentry dotdot;
>
> dotdot.d_name.name = "..";
> @@ -83,16 +81,7 @@ struct dentry *ext2_get_parent(struct de
> ino = ext2_inode_by_name(child->d_inode, &dotdot);
> if (!ino)
> return ERR_PTR(-ENOENT);
> - inode = ext2_iget(child->d_inode->i_sb, ino);
> -
> - if (IS_ERR(inode))
> - return ERR_CAST(inode);
> - parent = d_alloc_anon(inode);
> - if (!parent) {
> - iput(inode);
> - parent = ERR_PTR(-ENOMEM);
> - }
> - return parent;
> + return d_obtain_alias(ext2_iget(child->d_inode->i_sb, ino));
> }
>
> /*
> Index: linux-2.6/fs/ext3/namei.c
> ===================================================================
> --- linux-2.6.orig/fs/ext3/namei.c 2008-08-11 10:35:13.000000000 -0300
> +++ linux-2.6/fs/ext3/namei.c 2008-08-11 10:35:18.000000000 -0300
> @@ -1057,8 +1057,6 @@ static struct dentry *ext3_lookup(struct
> struct dentry *ext3_get_parent(struct dentry *child)
> {
> unsigned long ino;
> - struct dentry *parent;
> - struct inode *inode;
> struct dentry dotdot;
> struct ext3_dir_entry_2 * de;
> struct buffer_head *bh;
> @@ -1068,7 +1066,6 @@ struct dentry *ext3_get_parent(struct de
> dotdot.d_parent = child; /* confusing, isn't it! */
>
> bh = ext3_find_entry(&dotdot, &de);
> - inode = NULL;
> if (!bh)
> return ERR_PTR(-ENOENT);
> ino = le32_to_cpu(de->inode);
> @@ -1080,16 +1077,7 @@ struct dentry *ext3_get_parent(struct de
> return ERR_PTR(-EIO);
> }
>
> - inode = ext3_iget(child->d_inode->i_sb, ino);
> - if (IS_ERR(inode))
> - return ERR_CAST(inode);
> -
> - parent = d_alloc_anon(inode);
> - if (!parent) {
> - iput(inode);
> - parent = ERR_PTR(-ENOMEM);
> - }
> - return parent;
> + return d_obtain_alias(ext3_iget(child->d_inode->i_sb, ino));
> }
>
> #define S_SHIFT 12
> Index: linux-2.6/fs/ext4/namei.c
> ===================================================================
> --- linux-2.6.orig/fs/ext4/namei.c 2008-08-11 10:35:13.000000000 -0300
> +++ linux-2.6/fs/ext4/namei.c 2008-08-11 10:35:18.000000000 -0300
> @@ -1060,8 +1060,6 @@ static struct dentry *ext4_lookup(struct
> struct dentry *ext4_get_parent(struct dentry *child)
> {
> unsigned long ino;
> - struct dentry *parent;
> - struct inode *inode;
> struct dentry dotdot;
> struct ext4_dir_entry_2 * de;
> struct buffer_head *bh;
> @@ -1071,7 +1069,6 @@ struct dentry *ext4_get_parent(struct de
> dotdot.d_parent = child; /* confusing, isn't it! */
>
> bh = ext4_find_entry(&dotdot, &de);
> - inode = NULL;
> if (!bh)
> return ERR_PTR(-ENOENT);
> ino = le32_to_cpu(de->inode);
> @@ -1083,16 +1080,7 @@ struct dentry *ext4_get_parent(struct de
> return ERR_PTR(-EIO);
> }
>
> - inode = ext4_iget(child->d_inode->i_sb, ino);
> - if (IS_ERR(inode))
> - return ERR_CAST(inode);
> -
> - parent = d_alloc_anon(inode);
> - if (!parent) {
> - iput(inode);
> - parent = ERR_PTR(-ENOMEM);
> - }
> - return parent;
> + return d_obtain_alias(ext4_iget(child->d_inode->i_sb, ino));
> }
>
> #define S_SHIFT 12
> Index: linux-2.6/fs/isofs/export.c
> ===================================================================
> --- linux-2.6.orig/fs/isofs/export.c 2008-08-11 10:35:13.000000000 -0300
> +++ linux-2.6/fs/isofs/export.c 2008-08-11 10:35:18.000000000 -0300
> @@ -22,7 +22,7 @@ isofs_export_iget(struct super_block *sb
> __u32 generation)
> {
> struct inode *inode;
> - struct dentry *result;
> +
> if (block == 0)
> return ERR_PTR(-ESTALE);
> inode = isofs_iget(sb, block, offset);
> @@ -32,12 +32,7 @@ isofs_export_iget(struct super_block *sb
> iput(inode);
> return ERR_PTR(-ESTALE);
> }
> - result = d_alloc_anon(inode);
> - if (!result) {
> - iput(inode);
> - return ERR_PTR(-ENOMEM);
> - }
> - return result;
> + return d_obtain_alias(inode);
> }
>
> /* This function is surprisingly simple. The trick is understanding
> @@ -51,7 +46,6 @@ static struct dentry *isofs_export_get_p
> unsigned long parent_offset = 0;
> struct inode *child_inode = child->d_inode;
> struct iso_inode_info *e_child_inode = ISOFS_I(child_inode);
> - struct inode *parent_inode = NULL;
> struct iso_directory_record *de = NULL;
> struct buffer_head * bh = NULL;
> struct dentry *rv = NULL;
> @@ -104,28 +98,11 @@ static struct dentry *isofs_export_get_p
> /* Normalize */
> isofs_normalize_block_and_offset(de, &parent_block, &parent_offset);
>
> - /* Get the inode. */
> - parent_inode = isofs_iget(child_inode->i_sb,
> - parent_block,
> - parent_offset);
> - if (IS_ERR(parent_inode)) {
> - rv = ERR_CAST(parent_inode);
> - if (rv != ERR_PTR(-ENOMEM))
> - rv = ERR_PTR(-EACCES);
> - goto out;
> - }
> -
> - /* Allocate the dentry. */
> - rv = d_alloc_anon(parent_inode);
> - if (rv == NULL) {
> - rv = ERR_PTR(-ENOMEM);
> - goto out;
> - }
> -
> + rv = d_obtain_alias(isofs_iget(child_inode->i_sb, parent_block,
> + parent_offset));
> out:
> - if (bh) {
> + if (bh)
> brelse(bh);
> - }
> return rv;
> }
>
> Index: linux-2.6/fs/jfs/namei.c
> ===================================================================
> --- linux-2.6.orig/fs/jfs/namei.c 2008-08-11 10:35:13.000000000 -0300
> +++ linux-2.6/fs/jfs/namei.c 2008-08-11 10:35:18.000000000 -0300
> @@ -1511,25 +1511,12 @@ struct dentry *jfs_fh_to_parent(struct s
>
> struct dentry *jfs_get_parent(struct dentry *dentry)
> {
> - struct super_block *sb = dentry->d_inode->i_sb;
> - struct dentry *parent = ERR_PTR(-ENOENT);
> - struct inode *inode;
> unsigned long parent_ino;
>
> parent_ino =
> le32_to_cpu(JFS_IP(dentry->d_inode)->i_dtroot.header.idotdot);
> - inode = jfs_iget(sb, parent_ino);
> - if (IS_ERR(inode)) {
> - parent = ERR_CAST(inode);
> - } else {
> - parent = d_alloc_anon(inode);
> - if (!parent) {
> - parent = ERR_PTR(-ENOMEM);
> - iput(inode);
> - }
> - }
>
> - return parent;
> + return d_obtain_alias(jfs_iget(dentry->d_inode->i_sb, parent_ino));
> }
>
> const struct inode_operations jfs_dir_inode_operations = {
> Index: linux-2.6/fs/ntfs/namei.c
> ===================================================================
> --- linux-2.6.orig/fs/ntfs/namei.c 2008-08-11 10:35:13.000000000 -0300
> +++ linux-2.6/fs/ntfs/namei.c 2008-08-11 10:35:18.000000000 -0300
> @@ -304,8 +304,6 @@ static struct dentry *ntfs_get_parent(st
> ntfs_attr_search_ctx *ctx;
> ATTR_RECORD *attr;
> FILE_NAME_ATTR *fn;
> - struct inode *parent_vi;
> - struct dentry *parent_dent;
> unsigned long parent_ino;
> int err;
>
> @@ -345,24 +343,8 @@ try_next:
> /* Release the search context and the mft record of the child. */
> ntfs_attr_put_search_ctx(ctx);
> unmap_mft_record(ni);
> - /* Get the inode of the parent directory. */
> - parent_vi = ntfs_iget(vi->i_sb, parent_ino);
> - if (IS_ERR(parent_vi) || unlikely(is_bad_inode(parent_vi))) {
> - if (!IS_ERR(parent_vi))
> - iput(parent_vi);
> - ntfs_error(vi->i_sb, "Failed to get parent directory inode "
> - "0x%lx of child inode 0x%lx.", parent_ino,
> - vi->i_ino);
> - return ERR_PTR(-EACCES);
> - }
> - /* Finally get a dentry for the parent directory and return it. */
> - parent_dent = d_alloc_anon(parent_vi);
> - if (unlikely(!parent_dent)) {
> - iput(parent_vi);
> - return ERR_PTR(-ENOMEM);
> - }
> - ntfs_debug("Done for inode 0x%lx.", vi->i_ino);
> - return parent_dent;
> +
> + return d_obtain_alias(ntfs_iget(vi->i_sb, parent_ino));
> }
>
> static struct inode *ntfs_nfs_get_inode(struct super_block *sb,
> Index: linux-2.6/fs/ocfs2/export.c
> ===================================================================
> --- linux-2.6.orig/fs/ocfs2/export.c 2008-08-11 10:35:13.000000000 -0300
> +++ linux-2.6/fs/ocfs2/export.c 2008-08-11 10:35:18.000000000 -0300
> @@ -68,14 +68,9 @@ static struct dentry *ocfs2_get_dentry(s
> return ERR_PTR(-ESTALE);
> }
>
> - result = d_alloc_anon(inode);
> -
> - if (!result) {
> - iput(inode);
> - mlog_errno(-ENOMEM);
> - return ERR_PTR(-ENOMEM);
> - }
> - result->d_op = &ocfs2_dentry_ops;
> + result = d_obtain_alias(inode);
> + if (result && !IS_ERR(result))
> + result->d_op = &ocfs2_dentry_ops;
>
> mlog_exit_ptr(result);
> return result;
> @@ -86,7 +81,6 @@ static struct dentry *ocfs2_get_parent(s
> int status;
> u64 blkno;
> struct dentry *parent;
> - struct inode *inode;
> struct inode *dir = child->d_inode;
>
> mlog_entry("(0x%p, '%.*s')\n", child,
> @@ -109,21 +103,9 @@ static struct dentry *ocfs2_get_parent(s
> goto bail_unlock;
> }
>
> - inode = ocfs2_iget(OCFS2_SB(dir->i_sb), blkno, 0, 0);
> - if (IS_ERR(inode)) {
> - mlog(ML_ERROR, "Unable to create inode %llu\n",
> - (unsigned long long)blkno);
> - parent = ERR_PTR(-EACCES);
> - goto bail_unlock;
> - }
> -
> - parent = d_alloc_anon(inode);
> - if (!parent) {
> - iput(inode);
> - parent = ERR_PTR(-ENOMEM);
> - }
> -
> - parent->d_op = &ocfs2_dentry_ops;
> + parent = d_obtain_alias(ocfs2_iget(OCFS2_SB(dir->i_sb), blkno, 0, 0));
> + if (parent && !IS_ERR(parent))
> + parent->d_op = &ocfs2_dentry_ops;
>
> bail_unlock:
> ocfs2_inode_unlock(dir, 0);
> Index: linux-2.6/fs/reiserfs/inode.c
> ===================================================================
> --- linux-2.6.orig/fs/reiserfs/inode.c 2008-08-11 10:35:13.000000000 -0300
> +++ linux-2.6/fs/reiserfs/inode.c 2008-08-11 10:35:18.000000000 -0300
> @@ -1522,7 +1522,6 @@ static struct dentry *reiserfs_get_dentr
>
> {
> struct cpu_key key;
> - struct dentry *result;
> struct inode *inode;
>
> key.on_disk_key.k_objectid = objectid;
> @@ -1535,16 +1534,8 @@ static struct dentry *reiserfs_get_dentr
> inode = NULL;
> }
> reiserfs_write_unlock(sb);
> - if (!inode)
> - inode = ERR_PTR(-ESTALE);
> - if (IS_ERR(inode))
> - return ERR_CAST(inode);
> - result = d_alloc_anon(inode);
> - if (!result) {
> - iput(inode);
> - return ERR_PTR(-ENOMEM);
> - }
> - return result;
> +
> + return d_obtain_alias(inode);
> }
>
> struct dentry *reiserfs_fh_to_dentry(struct super_block *sb, struct fid *fid,
> Index: linux-2.6/fs/reiserfs/namei.c
> ===================================================================
> --- linux-2.6.orig/fs/reiserfs/namei.c 2008-08-11 10:35:13.000000000 -0300
> +++ linux-2.6/fs/reiserfs/namei.c 2008-08-11 10:35:18.000000000 -0300
> @@ -383,7 +383,6 @@ struct dentry *reiserfs_get_parent(struc
> struct inode *inode = NULL;
> struct reiserfs_dir_entry de;
> INITIALIZE_PATH(path_to_entry);
> - struct dentry *parent;
> struct inode *dir = child->d_inode;
>
> if (dir->i_nlink == 0) {
> @@ -401,15 +400,7 @@ struct dentry *reiserfs_get_parent(struc
> inode = reiserfs_iget(dir->i_sb, (struct cpu_key *)&(de.de_dir_id));
> reiserfs_write_unlock(dir->i_sb);
>
> - if (!inode || IS_ERR(inode)) {
> - return ERR_PTR(-EACCES);
> - }
> - parent = d_alloc_anon(inode);
> - if (!parent) {
> - iput(inode);
> - parent = ERR_PTR(-ENOMEM);
> - }
> - return parent;
> + return d_obtain_alias(inode);
> }
>
> /* add entry to the directory (entry can be hidden).
> Index: linux-2.6/fs/udf/namei.c
> ===================================================================
> --- linux-2.6.orig/fs/udf/namei.c 2008-08-11 10:35:13.000000000 -0300
> +++ linux-2.6/fs/udf/namei.c 2008-08-11 10:35:18.000000000 -0300
> @@ -1243,7 +1243,6 @@ end_rename:
>
> static struct dentry *udf_get_parent(struct dentry *child)
> {
> - struct dentry *parent;
> struct inode *inode = NULL;
> struct dentry dotdot;
> struct fileIdentDesc cfi;
> @@ -1266,13 +1265,7 @@ static struct dentry *udf_get_parent(str
> goto out_unlock;
> unlock_kernel();
>
> - parent = d_alloc_anon(inode);
> - if (!parent) {
> - iput(inode);
> - parent = ERR_PTR(-ENOMEM);
> - }
> -
> - return parent;
> + return d_obtain_alias(inode);
> out_unlock:
> unlock_kernel();
> return ERR_PTR(-EACCES);
> @@ -1283,7 +1276,6 @@ static struct dentry *udf_nfs_get_inode(
> u16 partref, __u32 generation)
> {
> struct inode *inode;
> - struct dentry *result;
> kernel_lb_addr loc;
>
> if (block == 0)
> @@ -1300,12 +1292,7 @@ static struct dentry *udf_nfs_get_inode(
> iput(inode);
> return ERR_PTR(-ESTALE);
> }
> - result = d_alloc_anon(inode);
> - if (!result) {
> - iput(inode);
> - return ERR_PTR(-ENOMEM);
> - }
> - return result;
> + return d_obtain_alias(inode);
> }
>
> static struct dentry *udf_fh_to_dentry(struct super_block *sb,
> Index: linux-2.6/fs/fat/inode.c
> ===================================================================
> --- linux-2.6.orig/fs/fat/inode.c 2008-08-11 10:35:13.000000000 -0300
> +++ linux-2.6/fs/fat/inode.c 2008-08-11 10:35:18.000000000 -0300
> @@ -685,33 +685,24 @@ static struct dentry *fat_fh_to_dentry(s
> inode = NULL;
> }
> }
> - if (!inode) {
> - /* For now, do nothing
> - * What we could do is:
> - * follow the file starting at fh[4], and record
> - * the ".." entry, and the name of the fh[2] entry.
> - * The follow the ".." file finding the next step up.
> - * This way we build a path to the root of
> - * the tree. If this works, we lookup the path and so
> - * get this inode into the cache.
> - * Finally try the fat_iget lookup again
> - * If that fails, then weare totally out of luck
> - * But all that is for another day
> - */
> - }
> - if (!inode)
> - return ERR_PTR(-ESTALE);
> -
>
> - /* now to find a dentry.
> - * If possible, get a well-connected one
> + /*
> + * For now, do nothing if the inode is not found.
> + *
> + * What we could do is:
> + *
> + * - follow the file starting at fh[4], and record the ".." entry,
> + * and the name of the fh[2] entry.
> + * - then follow the ".." file finding the next step up.
> + *
> + * This way we build a path to the root of the tree. If this works, we
> + * lookup the path and so get this inode into the cache. Finally try
> + * the fat_iget lookup again. If that fails, then we are totally out
> + * of luck. But all that is for another day
> */
> - result = d_alloc_anon(inode);
> - if (result == NULL) {
> - iput(inode);
> - return ERR_PTR(-ENOMEM);
> - }
> - result->d_op = sb->s_root->d_op;
> + result = d_obtain_alias(inode);
> + if (result && !IS_ERR(result))
> + result->d_op = sb->s_root->d_op;
> return result;
> }
>
> @@ -758,15 +749,8 @@ static struct dentry *fat_get_parent(str
> }
> inode = fat_build_inode(sb, de, i_pos);
> brelse(bh);
> - if (IS_ERR(inode)) {
> - parent = ERR_CAST(inode);
> - goto out;
> - }
> - parent = d_alloc_anon(inode);
> - if (!parent) {
> - iput(inode);
> - parent = ERR_PTR(-ENOMEM);
> - }
> +
> + parent = d_obtain_alias(inode);
> out:
> unlock_super(sb);
>
> Index: linux-2.6/fs/fuse/inode.c
> ===================================================================
> --- linux-2.6.orig/fs/fuse/inode.c 2008-08-11 10:35:13.000000000 -0300
> +++ linux-2.6/fs/fuse/inode.c 2008-08-11 10:35:18.000000000 -0300
> @@ -596,12 +596,8 @@ static struct dentry *fuse_get_dentry(st
> if (inode->i_generation != handle->generation)
> goto out_iput;
>
> - entry = d_alloc_anon(inode);
> - err = -ENOMEM;
> - if (!entry)
> - goto out_iput;
> -
> - if (get_node_id(inode) != FUSE_ROOT_ID) {
> + entry = d_obtain_alias(inode);
> + if (entry && !IS_ERR(entry) && get_node_id(inode) != FUSE_ROOT_ID) {
> entry->d_op = &fuse_dentry_operations;
> fuse_invalidate_entry_cache(entry);
> }
> @@ -696,17 +692,14 @@ static struct dentry *fuse_get_parent(st
> name.name = "..";
> err = fuse_lookup_name(child_inode->i_sb, get_node_id(child_inode),
> &name, &outarg, &inode);
> - if (err && err != -ENOENT)
> - return ERR_PTR(err);
> - if (err || !inode)
> - return ERR_PTR(-ESTALE);
> -
> - parent = d_alloc_anon(inode);
> - if (!parent) {
> - iput(inode);
> - return ERR_PTR(-ENOMEM);
> + if (err) {
> + if (err == -ENOENT)
> + return -ESTALE;
> + return err;
> }
> - if (get_node_id(inode) != FUSE_ROOT_ID) {
> +
> + parent = d_obtain_alias(inode);
> + if (parent && !IS_ERR(parent) && get_node_id(inode) != FUSE_ROOT_ID) {
> parent->d_op = &fuse_dentry_operations;
> fuse_invalidate_entry_cache(parent);
> }
> Index: linux-2.6/fs/gfs2/ops_export.c
> ===================================================================
> --- linux-2.6.orig/fs/gfs2/ops_export.c 2008-08-11 10:35:13.000000000 -0300
> +++ linux-2.6/fs/gfs2/ops_export.c 2008-08-11 10:35:18.000000000 -0300
> @@ -130,28 +130,17 @@ static int gfs2_get_name(struct dentry *
> static struct dentry *gfs2_get_parent(struct dentry *child)
> {
> struct qstr dotdot;
> - struct inode *inode;
> struct dentry *dentry;
>
> - gfs2_str2qstr(&dotdot, "..");
> - inode = gfs2_lookupi(child->d_inode, &dotdot, 1);
> -
> - if (!inode)
> - return ERR_PTR(-ENOENT);
> /*
> - * In case of an error, @inode carries the error value, and we
> - * have to return that as a(n invalid) pointer to dentry.
> + * XXX(hch): it would be a good idea to keep this around as a
> + * static variable.
> */
> - if (IS_ERR(inode))
> - return ERR_CAST(inode);
> -
> - dentry = d_alloc_anon(inode);
> - if (!dentry) {
> - iput(inode);
> - return ERR_PTR(-ENOMEM);
> - }
> + gfs2_str2qstr(&dotdot, "..");
>
> - dentry->d_op = &gfs2_dops;
> + dentry = d_obtain_alias(gfs2_lookupi(child->d_inode, &dotdot, 1));
> + if (dentry && !IS_ERR(dentry))
> + dentry->d_op = &gfs2_dops;
> return dentry;
> }
>
> @@ -233,13 +222,9 @@ static struct dentry *gfs2_get_dentry(st
> gfs2_glock_dq_uninit(&i_gh);
>
> out_inode:
> - dentry = d_alloc_anon(inode);
> - if (!dentry) {
> - iput(inode);
> - return ERR_PTR(-ENOMEM);
> - }
> -
> - dentry->d_op = &gfs2_dops;
> + dentry = d_obtain_alias(inode);
> + if (dentry && !IS_ERR(dentry))
> + dentry->d_op = &gfs2_dops;
> return dentry;
>
> fail_rgd:
> Index: linux-2.6/fs/nfs/getroot.c
> ===================================================================
> --- linux-2.6.orig/fs/nfs/getroot.c 2008-08-11 10:35:13.000000000 -0300
> +++ linux-2.6/fs/nfs/getroot.c 2008-08-11 10:35:18.000000000 -0300
> @@ -107,9 +107,8 @@ struct dentry *nfs_get_root(struct super
> * if the dentry tree reaches them; however if the dentry already
> * exists, we'll pick it up at this point and use it as the root
> */
> - mntroot = d_alloc_anon(inode);
> + mntroot = d_obtain_alias(inode);
> if (!mntroot) {
> - iput(inode);
> dprintk("nfs_get_root: get root dentry failed\n");
> return ERR_PTR(-ENOMEM);
> }
> @@ -277,9 +276,8 @@ struct dentry *nfs4_get_root(struct supe
> * if the dentry tree reaches them; however if the dentry already
> * exists, we'll pick it up at this point and use it as the root
> */
> - mntroot = d_alloc_anon(inode);
> + mntroot = d_obtain_alias(inode);
> if (!mntroot) {
> - iput(inode);
> dprintk("nfs_get_root: get root dentry failed\n");
> return ERR_PTR(-ENOMEM);
> }
> Index: linux-2.6/fs/xfs/linux-2.6/xfs_export.c
> ===================================================================
> --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_export.c 2008-08-11 10:35:13.000000000 -0300
> +++ linux-2.6/fs/xfs/linux-2.6/xfs_export.c 2008-08-11 10:35:18.000000000 -0300
> @@ -102,18 +102,12 @@ xfs_fs_get_parent(
> {
> int error;
> struct xfs_inode *cip;
> - struct dentry *parent;
>
> error = xfs_lookup(XFS_I(child->d_inode), &xfs_name_dotdot, &cip, NULL);
> if (unlikely(error))
> return ERR_PTR(-error);
>
> - parent = d_alloc_anon(cip->i_vnode);
> - if (unlikely(!parent)) {
> - iput(cip->i_vnode);
> - return ERR_PTR(-ENOMEM);
> - }
> - return parent;
> + return d_obtain_alias(cip->i_vnode);
> }
>
> const struct export_operations xfs_export_operations = {
> Index: linux-2.6/fs/xfs/linux-2.6/xfs_ioctl.c
> ===================================================================
> --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_ioctl.c 2008-08-11 10:35:13.000000000 -0300
> +++ linux-2.6/fs/xfs/linux-2.6/xfs_ioctl.c 2008-08-11 10:35:18.000000000 -0300
> @@ -311,9 +311,8 @@ xfs_open_by_handle(
> return new_fd;
> }
>
> - dentry = d_alloc_anon(inode);
> + dentry = d_obtain_alias(inode);
> if (dentry == NULL) {
> - iput(inode);
> put_unused_fd(new_fd);
> return -XFS_ERROR(ENOMEM);
> }
> --
> To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 3/4] switch all filesystems over to d_obtain_alias
2008-08-11 13:49 [PATCH 3/4] switch all filesystems over to d_obtain_alias Christoph Hellwig
2008-08-12 12:29 ` steve
@ 2008-09-09 13:28 ` Miklos Szeredi
2008-09-09 15:31 ` Christoph Hellwig
1 sibling, 1 reply; 4+ messages in thread
From: Miklos Szeredi @ 2008-09-09 13:28 UTC (permalink / raw)
To: hch; +Cc: viro, linux-fsdevel
On Mon, 11 Aug 2008, Christoph Hellwig wrote:
> Index: linux-2.6/fs/fuse/inode.c
> ===================================================================
> --- linux-2.6.orig/fs/fuse/inode.c 2008-08-11 10:35:13.000000000 -0300
> +++ linux-2.6/fs/fuse/inode.c 2008-08-11 10:35:18.000000000 -0300
> @@ -596,12 +596,8 @@ static struct dentry *fuse_get_dentry(st
> if (inode->i_generation != handle->generation)
> goto out_iput;
>
> - entry = d_alloc_anon(inode);
> - err = -ENOMEM;
> - if (!entry)
> - goto out_iput;
> -
> - if (get_node_id(inode) != FUSE_ROOT_ID) {
> + entry = d_obtain_alias(inode);
> + if (entry && !IS_ERR(entry) && get_node_id(inode) != FUSE_ROOT_ID) {
checking for entry != NULL superfluous here.
> entry->d_op = &fuse_dentry_operations;
> fuse_invalidate_entry_cache(entry);
> }
> @@ -696,17 +692,14 @@ static struct dentry *fuse_get_parent(st
> name.name = "..";
> err = fuse_lookup_name(child_inode->i_sb, get_node_id(child_inode),
> &name, &outarg, &inode);
> - if (err && err != -ENOENT)
> - return ERR_PTR(err);
> - if (err || !inode)
> - return ERR_PTR(-ESTALE);
> -
> - parent = d_alloc_anon(inode);
> - if (!parent) {
> - iput(inode);
> - return ERR_PTR(-ENOMEM);
> + if (err) {
> + if (err == -ENOENT)
> + return -ESTALE;
> + return err;
> }
> - if (get_node_id(inode) != FUSE_ROOT_ID) {
> +
> + parent = d_obtain_alias(inode);
> + if (parent && !IS_ERR(parent) && get_node_id(inode) != FUSE_ROOT_ID) {
This is buggy: we want to return ERR_PTR(-ESTALE) for !inode, not
NULL. So again, either d_obtain_alias() should turn !inode into
-ENOENT, (which would gain nothing in this case) or it should simply
expect inode to be not NULL.
Doing the !inode check in d_obtain_alias() seems only to confuse
things, instead of simplifying them.
Miklos
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 3/4] switch all filesystems over to d_obtain_alias
2008-09-09 13:28 ` Miklos Szeredi
@ 2008-09-09 15:31 ` Christoph Hellwig
0 siblings, 0 replies; 4+ messages in thread
From: Christoph Hellwig @ 2008-09-09 15:31 UTC (permalink / raw)
To: Miklos Szeredi; +Cc: hch, viro, linux-fsdevel
On Tue, Sep 09, 2008 at 03:28:14PM +0200, Miklos Szeredi wrote:
> > - if (get_node_id(inode) != FUSE_ROOT_ID) {
> > + entry = d_obtain_alias(inode);
> > + if (entry && !IS_ERR(entry) && get_node_id(inode) != FUSE_ROOT_ID) {
>
> checking for entry != NULL superfluous here.
True.
> > }
> > @@ -696,17 +692,14 @@ static struct dentry *fuse_get_parent(st
> > name.name = "..";
> > err = fuse_lookup_name(child_inode->i_sb, get_node_id(child_inode),
> > &name, &outarg, &inode);
> > - if (err && err != -ENOENT)
> > - return ERR_PTR(err);
> > - if (err || !inode)
> > - return ERR_PTR(-ESTALE);
> > -
> > - parent = d_alloc_anon(inode);
> > - if (!parent) {
> > - iput(inode);
> > - return ERR_PTR(-ENOMEM);
> > + if (err) {
> > + if (err == -ENOENT)
> > + return -ESTALE;
> > + return err;
> > }
> > - if (get_node_id(inode) != FUSE_ROOT_ID) {
> > +
> > + parent = d_obtain_alias(inode);
> > + if (parent && !IS_ERR(parent) && get_node_id(inode) != FUSE_ROOT_ID) {
>
> This is buggy: we want to return ERR_PTR(-ESTALE) for !inode, not
> NULL. So again, either d_obtain_alias() should turn !inode into
> -ENOENT, (which would gain nothing in this case) or it should simply
> expect inode to be not NULL.
ESTALE doesn't really help us here, but I agree that we want an error
return.
> Doing the !inode check in d_obtain_alias() seems only to confuse
> things, instead of simplifying them.
Doing the !inode check here means we can do a return
d_obtain_alias(foo_iget())) tailcall which is quite useful to reduce the
mess in the export operations.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2008-09-09 15:31 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-08-11 13:49 [PATCH 3/4] switch all filesystems over to d_obtain_alias Christoph Hellwig
2008-08-12 12:29 ` steve
2008-09-09 13:28 ` Miklos Szeredi
2008-09-09 15:31 ` Christoph Hellwig
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).