Commit 4f9838c7 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFSv4: Add post-op attributes to NFSv4 write and commit callbacks.

parent 16e42959
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -2169,8 +2169,10 @@ nfs4_write_done(struct rpc_task *task)
		rpc_restart_call(task);
		return;
	}
	if (task->tk_status >= 0)
	if (task->tk_status >= 0) {
		renew_lease(NFS_SERVER(inode), data->timestamp);
		nfs_post_op_update_inode(inode, data->res.fattr);
	}
	/* Call back common NFS writeback processing */
	nfs_writeback_done(task);
}
@@ -2186,6 +2188,7 @@ nfs4_proc_write_setup(struct nfs_write_data *data, int how)
		.rpc_cred = data->cred,
	};
	struct inode *inode = data->inode;
	struct nfs_server *server = NFS_SERVER(inode);
	int stable;
	int flags;
	
@@ -2197,6 +2200,8 @@ nfs4_proc_write_setup(struct nfs_write_data *data, int how)
	} else
		stable = NFS_UNSTABLE;
	data->args.stable = stable;
	data->args.bitmask = server->attr_bitmask;
	data->res.server = server;

	data->timestamp   = jiffies;

@@ -2218,6 +2223,8 @@ nfs4_commit_done(struct rpc_task *task)
		rpc_restart_call(task);
		return;
	}
	if (task->tk_status >= 0)
		nfs_post_op_update_inode(inode, data->res.fattr);
	/* Call back common NFS writeback processing */
	nfs_commit_done(task);
}
@@ -2233,8 +2240,12 @@ nfs4_proc_commit_setup(struct nfs_write_data *data, int how)
		.rpc_cred = data->cred,
	};	
	struct inode *inode = data->inode;
	struct nfs_server *server = NFS_SERVER(inode);
	int flags;
	
	data->args.bitmask = server->attr_bitmask;
	data->res.server = server;

	/* Set the initial flags for the task.  */
	flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC;

+22 −6
Original line number Diff line number Diff line
@@ -159,16 +159,20 @@ static int nfs_stat_to_errno(int);
				op_decode_hdr_maxsz + 2)
#define NFS4_enc_write_sz	(compound_encode_hdr_maxsz + \
				encode_putfh_maxsz + \
				op_encode_hdr_maxsz + 8)
				op_encode_hdr_maxsz + 8 + \
				encode_getattr_maxsz)
#define NFS4_dec_write_sz	(compound_decode_hdr_maxsz + \
				decode_putfh_maxsz + \
				op_decode_hdr_maxsz + 4)
				op_decode_hdr_maxsz + 4 + \
				decode_getattr_maxsz)
#define NFS4_enc_commit_sz	(compound_encode_hdr_maxsz + \
				encode_putfh_maxsz + \
				op_encode_hdr_maxsz + 3)
				op_encode_hdr_maxsz + 3 + \
				encode_getattr_maxsz)
#define NFS4_dec_commit_sz	(compound_decode_hdr_maxsz + \
				decode_putfh_maxsz + \
				op_decode_hdr_maxsz + 2)
				op_decode_hdr_maxsz + 2 + \
				decode_getattr_maxsz)
#define NFS4_enc_open_sz        (compound_encode_hdr_maxsz + \
                                encode_putfh_maxsz + \
                                op_encode_hdr_maxsz + \
@@ -1799,7 +1803,7 @@ static int nfs4_xdr_enc_write(struct rpc_rqst *req, uint32_t *p, struct nfs_writ
{
	struct xdr_stream xdr;
	struct compound_hdr hdr = {
		.nops = 2,
		.nops = 3,
	};
	int status;

@@ -1809,6 +1813,9 @@ static int nfs4_xdr_enc_write(struct rpc_rqst *req, uint32_t *p, struct nfs_writ
	if (status)
		goto out;
	status = encode_write(&xdr, args);
	if (status)
		goto out;
	status = encode_getfattr(&xdr, args->bitmask);
out:
	return status;
}
@@ -1820,7 +1827,7 @@ static int nfs4_xdr_enc_commit(struct rpc_rqst *req, uint32_t *p, struct nfs_wri
{
	struct xdr_stream xdr;
	struct compound_hdr hdr = {
		.nops = 2,
		.nops = 3,
	};
	int status;

@@ -1830,6 +1837,9 @@ static int nfs4_xdr_enc_commit(struct rpc_rqst *req, uint32_t *p, struct nfs_wri
	if (status)
		goto out;
	status = encode_commit(&xdr, args);
	if (status)
		goto out;
	status = encode_getfattr(&xdr, args->bitmask);
out:
	return status;
}
@@ -4001,6 +4011,9 @@ static int nfs4_xdr_dec_write(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_wr
	if (status)
		goto out;
	status = decode_write(&xdr, res);
	if (status)
		goto out;
	decode_getfattr(&xdr, res->fattr, res->server);
	if (!status)
		status = res->count;
out:
@@ -4024,6 +4037,9 @@ static int nfs4_xdr_dec_commit(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_w
	if (status)
		goto out;
	status = decode_commit(&xdr, res);
	if (status)
		goto out;
	decode_getfattr(&xdr, res->fattr, res->server);
out:
	return status;
}
+2 −0
Original line number Diff line number Diff line
@@ -256,6 +256,7 @@ struct nfs_writeargs {
	enum nfs3_stable_how	stable;
	unsigned int		pgbase;
	struct page **		pages;
	const u32 *		bitmask;
};

struct nfs_writeverf {
@@ -267,6 +268,7 @@ struct nfs_writeres {
	struct nfs_fattr *	fattr;
	struct nfs_writeverf *	verf;
	__u32			count;
	const struct nfs_server *server;
};

/*