Skip to content

Commit bebd699

Browse files
author
J. Bruce Fields
committed
nfsd: initialize i_private before d_add
A process could race in an open and attempt to read one of these files before i_private is initialized, and get a spurious error. Reported-by: Al Viro <[email protected]> Signed-off-by: J. Bruce Fields <[email protected]>
1 parent dc46bba commit bebd699

File tree

1 file changed

+6
-6
lines changed

1 file changed

+6
-6
lines changed

fs/nfsd/nfsctl.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1171,13 +1171,17 @@ static struct inode *nfsd_get_inode(struct super_block *sb, umode_t mode)
11711171
return inode;
11721172
}
11731173

1174-
static int __nfsd_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
1174+
static int __nfsd_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode, struct nfsdfs_client *ncl)
11751175
{
11761176
struct inode *inode;
11771177

11781178
inode = nfsd_get_inode(dir->i_sb, mode);
11791179
if (!inode)
11801180
return -ENOMEM;
1181+
if (ncl) {
1182+
inode->i_private = ncl;
1183+
kref_get(&ncl->cl_ref);
1184+
}
11811185
d_add(dentry, inode);
11821186
inc_nlink(dir);
11831187
fsnotify_mkdir(dir, dentry);
@@ -1194,13 +1198,9 @@ static struct dentry *nfsd_mkdir(struct dentry *parent, struct nfsdfs_client *nc
11941198
dentry = d_alloc_name(parent, name);
11951199
if (!dentry)
11961200
goto out_err;
1197-
ret = __nfsd_mkdir(d_inode(parent), dentry, S_IFDIR | 0600);
1201+
ret = __nfsd_mkdir(d_inode(parent), dentry, S_IFDIR | 0600, ncl);
11981202
if (ret)
11991203
goto out_err;
1200-
if (ncl) {
1201-
d_inode(dentry)->i_private = ncl;
1202-
kref_get(&ncl->cl_ref);
1203-
}
12041204
out:
12051205
inode_unlock(dir);
12061206
return dentry;

0 commit comments

Comments
 (0)