diff options
| -rw-r--r-- | fs/nfs/nfs4proc.c | 27 | ||||
| -rw-r--r-- | fs/nfs/nfs4xdr.c | 25 | ||||
| -rw-r--r-- | include/linux/nfs_xdr.h | 7 | 
3 files changed, 45 insertions, 14 deletions
| diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index f96bc12c0fa0..bab47c4cb41c 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -1614,11 +1614,17 @@ out:  static int _nfs4_proc_remove(struct inode *dir, struct qstr *name)  { +	struct nfs_server *server = NFS_SERVER(dir);  	struct nfs4_remove_arg args = {  		.fh = NFS_FH(dir),  		.name = name, +		.bitmask = server->attr_bitmask, +	}; +	struct nfs_fattr dir_attr; +	struct nfs4_remove_res	res = { +		.server = server, +		.dir_attr = &dir_attr,  	}; -	struct nfs4_change_info	res;  	struct rpc_message msg = {  		.rpc_proc	= &nfs4_procedures[NFSPROC4_CLNT_REMOVE],  		.rpc_argp	= &args, @@ -1626,9 +1632,12 @@ static int _nfs4_proc_remove(struct inode *dir, struct qstr *name)  	};  	int			status; -	status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); -	if (status == 0) -		update_changeattr(dir, &res); +	nfs_fattr_init(res.dir_attr); +	status = rpc_call_sync(server->client, &msg, 0); +	if (status == 0) { +		update_changeattr(dir, &res.cinfo); +		nfs_post_op_update_inode(dir, res.dir_attr); +	}  	return status;  } @@ -1646,12 +1655,14 @@ static int nfs4_proc_remove(struct inode *dir, struct qstr *name)  struct unlink_desc {  	struct nfs4_remove_arg	args; -	struct nfs4_change_info	res; +	struct nfs4_remove_res	res; +	struct nfs_fattr dir_attr;  };  static int nfs4_proc_unlink_setup(struct rpc_message *msg, struct dentry *dir,  		struct qstr *name)  { +	struct nfs_server *server = NFS_SERVER(dir->d_inode);  	struct unlink_desc *up;  	up = (struct unlink_desc *) kmalloc(sizeof(*up), GFP_KERNEL); @@ -1660,6 +1671,9 @@ static int nfs4_proc_unlink_setup(struct rpc_message *msg, struct dentry *dir,  	up->args.fh = NFS_FH(dir->d_inode);  	up->args.name = name; +	up->args.bitmask = server->attr_bitmask; +	up->res.server = server; +	up->res.dir_attr = &up->dir_attr;  	msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVE];  	msg->rpc_argp = &up->args; @@ -1674,7 +1688,8 @@ static int nfs4_proc_unlink_done(struct dentry *dir, struct rpc_task *task)  	if (msg->rpc_resp != NULL) {  		up = container_of(msg->rpc_resp, struct unlink_desc, res); -		update_changeattr(dir->d_inode, &up->res); +		update_changeattr(dir->d_inode, &up->res.cinfo); +		nfs_post_op_update_inode(dir->d_inode, up->res.dir_attr);  		kfree(up);  		msg->rpc_resp = NULL;  		msg->rpc_argp = NULL; diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index 2a07755bd347..3ee3a1669d28 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c @@ -306,10 +306,12 @@ static int nfs_stat_to_errno(int);  				decode_getfh_maxsz)  #define NFS4_enc_remove_sz	(compound_encode_hdr_maxsz + \  				encode_putfh_maxsz + \ -				encode_remove_maxsz) +				encode_remove_maxsz + \ +				encode_getattr_maxsz)  #define NFS4_dec_remove_sz	(compound_decode_hdr_maxsz + \  				decode_putfh_maxsz + \ -				op_decode_hdr_maxsz + 5) +				op_decode_hdr_maxsz + 5 + \ +				decode_getattr_maxsz)  #define NFS4_enc_rename_sz	(compound_encode_hdr_maxsz + \  				encode_putfh_maxsz + \  				encode_savefh_maxsz + \ @@ -1327,14 +1329,18 @@ static int nfs4_xdr_enc_remove(struct rpc_rqst *req, uint32_t *p, const struct n  {  	struct xdr_stream xdr;  	struct compound_hdr hdr = { -		.nops = 2, +		.nops = 3,  	};  	int status;  	xdr_init_encode(&xdr, &req->rq_snd_buf, p);  	encode_compound_hdr(&xdr, &hdr); -	if ((status = encode_putfh(&xdr, args->fh)) == 0) -		status = encode_remove(&xdr, args->name); +	if ((status = encode_putfh(&xdr, args->fh)) != 0) +		goto out; +	if ((status = encode_remove(&xdr, args->name)) != 0) +		goto out; +	status = encode_getfattr(&xdr, args->bitmask); +out:  	return status;  } @@ -3512,7 +3518,7 @@ out:  /*   * Decode REMOVE response   */ -static int nfs4_xdr_dec_remove(struct rpc_rqst *rqstp, uint32_t *p, struct nfs4_change_info *cinfo) +static int nfs4_xdr_dec_remove(struct rpc_rqst *rqstp, uint32_t *p, struct nfs4_remove_res *res)  {  	struct xdr_stream xdr;  	struct compound_hdr hdr; @@ -3521,8 +3527,11 @@ static int nfs4_xdr_dec_remove(struct rpc_rqst *rqstp, uint32_t *p, struct nfs4_  	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);  	if ((status = decode_compound_hdr(&xdr, &hdr)) != 0)  		goto out; -	if ((status = decode_putfh(&xdr)) == 0) -		status = decode_remove(&xdr, cinfo); +	if ((status = decode_putfh(&xdr)) != 0) +		goto out; +	if ((status = decode_remove(&xdr, &res->cinfo)) != 0) +		goto out; +	decode_getfattr(&xdr, res->dir_attr, res->server);  out:  	return status;  } diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index 6f0804280824..deeba7e2c518 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h @@ -623,6 +623,13 @@ struct nfs4_readlink {  struct nfs4_remove_arg {  	const struct nfs_fh *		fh;  	const struct qstr *		name; +	const u32 *			bitmask; +}; + +struct nfs4_remove_res { +	const struct nfs_server *	server; +	struct nfs4_change_info		cinfo; +	struct nfs_fattr *		dir_attr;  };  struct nfs4_rename_arg { | 
