forked from Minki/linux
NFS: Move the delegation return down into nfs4_proc_remove()
Move the delegation return out of generic code and down into the NFSv4 specific unlink code. Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
9f76827287
commit
912678dbc5
@ -1798,12 +1798,11 @@ static int nfs_safe_remove(struct dentry *dentry)
|
||||
|
||||
trace_nfs_remove_enter(dir, dentry);
|
||||
if (inode != NULL) {
|
||||
NFS_PROTO(inode)->return_delegation(inode);
|
||||
error = NFS_PROTO(dir)->remove(dir, &dentry->d_name);
|
||||
error = NFS_PROTO(dir)->remove(dir, dentry);
|
||||
if (error == 0)
|
||||
nfs_drop_nlink(inode);
|
||||
} else
|
||||
error = NFS_PROTO(dir)->remove(dir, &dentry->d_name);
|
||||
error = NFS_PROTO(dir)->remove(dir, dentry);
|
||||
if (error == -ENOENT)
|
||||
nfs_dentry_handle_enoent(dentry);
|
||||
trace_nfs_remove_exit(dir, dentry, error);
|
||||
|
@ -383,11 +383,11 @@ out:
|
||||
}
|
||||
|
||||
static int
|
||||
nfs3_proc_remove(struct inode *dir, const struct qstr *name)
|
||||
nfs3_proc_remove(struct inode *dir, struct dentry *dentry)
|
||||
{
|
||||
struct nfs_removeargs arg = {
|
||||
.fh = NFS_FH(dir),
|
||||
.name = *name,
|
||||
.name = dentry->d_name,
|
||||
};
|
||||
struct nfs_removeres res;
|
||||
struct rpc_message msg = {
|
||||
@ -397,7 +397,7 @@ nfs3_proc_remove(struct inode *dir, const struct qstr *name)
|
||||
};
|
||||
int status = -ENOMEM;
|
||||
|
||||
dprintk("NFS call remove %s\n", name->name);
|
||||
dprintk("NFS call remove %pd2\n", dentry);
|
||||
res.dir_attr = nfs_alloc_fattr();
|
||||
if (res.dir_attr == NULL)
|
||||
goto out;
|
||||
|
@ -4200,10 +4200,28 @@ static int _nfs4_proc_remove(struct inode *dir, const struct qstr *name)
|
||||
return status;
|
||||
}
|
||||
|
||||
static int nfs4_proc_remove(struct inode *dir, const struct qstr *name)
|
||||
static int nfs4_proc_remove(struct inode *dir, struct dentry *dentry)
|
||||
{
|
||||
struct nfs4_exception exception = { };
|
||||
struct inode *inode = d_inode(dentry);
|
||||
int err;
|
||||
|
||||
if (inode)
|
||||
nfs4_inode_return_delegation(inode);
|
||||
do {
|
||||
err = _nfs4_proc_remove(dir, &dentry->d_name);
|
||||
trace_nfs4_remove(dir, &dentry->d_name, err);
|
||||
err = nfs4_handle_exception(NFS_SERVER(dir), err,
|
||||
&exception);
|
||||
} while (exception.retry);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int nfs4_proc_rmdir(struct inode *dir, const struct qstr *name)
|
||||
{
|
||||
struct nfs4_exception exception = { };
|
||||
int err;
|
||||
|
||||
do {
|
||||
err = _nfs4_proc_remove(dir, name);
|
||||
trace_nfs4_remove(dir, name, err);
|
||||
@ -9601,7 +9619,7 @@ const struct nfs_rpc_ops nfs_v4_clientops = {
|
||||
.link = nfs4_proc_link,
|
||||
.symlink = nfs4_proc_symlink,
|
||||
.mkdir = nfs4_proc_mkdir,
|
||||
.rmdir = nfs4_proc_remove,
|
||||
.rmdir = nfs4_proc_rmdir,
|
||||
.readdir = nfs4_proc_readdir,
|
||||
.mknod = nfs4_proc_mknod,
|
||||
.statfs = nfs4_proc_statfs,
|
||||
|
@ -300,11 +300,11 @@ out:
|
||||
}
|
||||
|
||||
static int
|
||||
nfs_proc_remove(struct inode *dir, const struct qstr *name)
|
||||
nfs_proc_remove(struct inode *dir, struct dentry *dentry)
|
||||
{
|
||||
struct nfs_removeargs arg = {
|
||||
.fh = NFS_FH(dir),
|
||||
.name = *name,
|
||||
.name = dentry->d_name,
|
||||
};
|
||||
struct rpc_message msg = {
|
||||
.rpc_proc = &nfs_procedures[NFSPROC_REMOVE],
|
||||
@ -312,7 +312,7 @@ nfs_proc_remove(struct inode *dir, const struct qstr *name)
|
||||
};
|
||||
int status;
|
||||
|
||||
dprintk("NFS call remove %s\n", name->name);
|
||||
dprintk("NFS call remove %pd2\n",dentry);
|
||||
status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
|
||||
nfs_mark_for_revalidate(dir);
|
||||
|
||||
|
@ -1590,7 +1590,7 @@ struct nfs_rpc_ops {
|
||||
unsigned int);
|
||||
int (*create) (struct inode *, struct dentry *,
|
||||
struct iattr *, int);
|
||||
int (*remove) (struct inode *, const struct qstr *);
|
||||
int (*remove) (struct inode *, struct dentry *);
|
||||
void (*unlink_setup) (struct rpc_message *, struct inode *dir);
|
||||
void (*unlink_rpc_prepare) (struct rpc_task *, struct nfs_unlinkdata *);
|
||||
int (*unlink_done) (struct rpc_task *, struct inode *);
|
||||
|
Loading…
Reference in New Issue
Block a user