diff options
author | Anna Schumaker <Anna.Schumaker@Netapp.com> | 2014-11-07 14:44:26 -0500 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2014-11-07 16:19:49 -0500 |
commit | 95d871f03cae6b49de040265cf88cbe2a16b9f05 (patch) | |
tree | 911d8bed4226e4e87e1411145c7fe0e275dea545 /fs/nfsd/nfs4proc.c | |
parent | 72c72bdf7bf53353d2d8e055194d27f0128be92b (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.c | 36 |
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 | ||
1016 | static __be32 | 1016 | static __be32 |
1017 | nfsd4_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 | |||
1039 | static __be32 | ||
1040 | nfsd4_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 | |||
1046 | static __be32 | ||
1017 | nfsd4_seek(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | 1047 | nfsd4_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", |