aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd/nfs4proc.c
diff options
context:
space:
mode:
authorAnna Schumaker <Anna.Schumaker@Netapp.com>2014-11-07 14:44:26 -0500
committerJ. Bruce Fields <bfields@redhat.com>2014-11-07 16:19:49 -0500
commit95d871f03cae6b49de040265cf88cbe2a16b9f05 (patch)
tree911d8bed4226e4e87e1411145c7fe0e275dea545 /fs/nfsd/nfs4proc.c
parent72c72bdf7bf53353d2d8e055194d27f0128be92b (diff)
nfsd: Add ALLOCATE support
The ALLOCATE operation is used to preallocate space in a file. I can do this by using vfs_fallocate() to do the actual preallocation. ALLOCATE only returns a status indicator, so we don't need to write a special encode() function. Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs/nfsd/nfs4proc.c')
-rw-r--r--fs/nfsd/nfs4proc.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index 0beb023f25ac..a261f1800922 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -1014,6 +1014,36 @@ nfsd4_write(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
1014} 1014}
1015 1015
1016static __be32 1016static __be32
1017nfsd4_fallocate(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
1018 struct nfsd4_fallocate *fallocate, int flags)
1019{
1020 __be32 status = nfserr_notsupp;
1021 struct file *file;
1022
1023 status = nfs4_preprocess_stateid_op(SVC_NET(rqstp), cstate,
1024 &fallocate->falloc_stateid,
1025 WR_STATE, &file);
1026 if (status != nfs_ok) {
1027 dprintk("NFSD: nfsd4_fallocate: couldn't process stateid!\n");
1028 return status;
1029 }
1030
1031 status = nfsd4_vfs_fallocate(rqstp, &cstate->current_fh, file,
1032 fallocate->falloc_offset,
1033 fallocate->falloc_length,
1034 flags);
1035 fput(file);
1036 return status;
1037}
1038
1039static __be32
1040nfsd4_allocate(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
1041 struct nfsd4_fallocate *fallocate)
1042{
1043 return nfsd4_fallocate(rqstp, cstate, fallocate, 0);
1044}
1045
1046static __be32
1017nfsd4_seek(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, 1047nfsd4_seek(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
1018 struct nfsd4_seek *seek) 1048 struct nfsd4_seek *seek)
1019{ 1049{
@@ -1929,6 +1959,12 @@ static struct nfsd4_operation nfsd4_ops[] = {
1929 }, 1959 },
1930 1960
1931 /* NFSv4.2 operations */ 1961 /* NFSv4.2 operations */
1962 [OP_ALLOCATE] = {
1963 .op_func = (nfsd4op_func)nfsd4_allocate,
1964 .op_flags = OP_MODIFIES_SOMETHING | OP_CACHEME,
1965 .op_name = "OP_ALLOCATE",
1966 .op_rsize_bop = (nfsd4op_rsize)nfsd4_write_rsize,
1967 },
1932 [OP_SEEK] = { 1968 [OP_SEEK] = {
1933 .op_func = (nfsd4op_func)nfsd4_seek, 1969 .op_func = (nfsd4op_func)nfsd4_seek,
1934 .op_name = "OP_SEEK", 1970 .op_name = "OP_SEEK",