Commit 4f375483 authored by J. Bruce Fields's avatar J. Bruce Fields

Merge nfsd bugfixes

These are some nfsd bugfixes that I also want in the main branch that
will be submitted for the 5.4 merge window.
parents 64a38e84 78e70e78
...@@ -571,7 +571,7 @@ nfsd_cache_append(struct svc_rqst *rqstp, struct kvec *data) ...@@ -571,7 +571,7 @@ nfsd_cache_append(struct svc_rqst *rqstp, struct kvec *data)
*/ */
static int nfsd_reply_cache_stats_show(struct seq_file *m, void *v) static int nfsd_reply_cache_stats_show(struct seq_file *m, void *v)
{ {
struct nfsd_net *nn = v; struct nfsd_net *nn = m->private;
seq_printf(m, "max entries: %u\n", nn->max_drc_entries); seq_printf(m, "max entries: %u\n", nn->max_drc_entries);
seq_printf(m, "num entries: %u\n", seq_printf(m, "num entries: %u\n",
......
...@@ -1171,13 +1171,17 @@ static struct inode *nfsd_get_inode(struct super_block *sb, umode_t mode) ...@@ -1171,13 +1171,17 @@ static struct inode *nfsd_get_inode(struct super_block *sb, umode_t mode)
return inode; return inode;
} }
static int __nfsd_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) static int __nfsd_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode, struct nfsdfs_client *ncl)
{ {
struct inode *inode; struct inode *inode;
inode = nfsd_get_inode(dir->i_sb, mode); inode = nfsd_get_inode(dir->i_sb, mode);
if (!inode) if (!inode)
return -ENOMEM; return -ENOMEM;
if (ncl) {
inode->i_private = ncl;
kref_get(&ncl->cl_ref);
}
d_add(dentry, inode); d_add(dentry, inode);
inc_nlink(dir); inc_nlink(dir);
fsnotify_mkdir(dir, dentry); fsnotify_mkdir(dir, dentry);
...@@ -1194,17 +1198,14 @@ static struct dentry *nfsd_mkdir(struct dentry *parent, struct nfsdfs_client *nc ...@@ -1194,17 +1198,14 @@ static struct dentry *nfsd_mkdir(struct dentry *parent, struct nfsdfs_client *nc
dentry = d_alloc_name(parent, name); dentry = d_alloc_name(parent, name);
if (!dentry) if (!dentry)
goto out_err; goto out_err;
ret = __nfsd_mkdir(d_inode(parent), dentry, S_IFDIR | 0600); ret = __nfsd_mkdir(d_inode(parent), dentry, S_IFDIR | 0600, ncl);
if (ret) if (ret)
goto out_err; goto out_err;
if (ncl) {
d_inode(dentry)->i_private = ncl;
kref_get(&ncl->cl_ref);
}
out: out:
inode_unlock(dir); inode_unlock(dir);
return dentry; return dentry;
out_err: out_err:
dput(dentry);
dentry = ERR_PTR(ret); dentry = ERR_PTR(ret);
goto out; goto out;
} }
...@@ -1214,11 +1215,9 @@ static void clear_ncl(struct inode *inode) ...@@ -1214,11 +1215,9 @@ static void clear_ncl(struct inode *inode)
struct nfsdfs_client *ncl = inode->i_private; struct nfsdfs_client *ncl = inode->i_private;
inode->i_private = NULL; inode->i_private = NULL;
synchronize_rcu();
kref_put(&ncl->cl_ref, ncl->cl_release); kref_put(&ncl->cl_ref, ncl->cl_release);
} }
static struct nfsdfs_client *__get_nfsdfs_client(struct inode *inode) static struct nfsdfs_client *__get_nfsdfs_client(struct inode *inode)
{ {
struct nfsdfs_client *nc = inode->i_private; struct nfsdfs_client *nc = inode->i_private;
...@@ -1232,9 +1231,9 @@ struct nfsdfs_client *get_nfsdfs_client(struct inode *inode) ...@@ -1232,9 +1231,9 @@ struct nfsdfs_client *get_nfsdfs_client(struct inode *inode)
{ {
struct nfsdfs_client *nc; struct nfsdfs_client *nc;
rcu_read_lock(); inode_lock_shared(inode);
nc = __get_nfsdfs_client(inode); nc = __get_nfsdfs_client(inode);
rcu_read_unlock(); inode_unlock_shared(inode);
return nc; return nc;
} }
/* from __rpc_unlink */ /* from __rpc_unlink */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment