]> git.karo-electronics.de Git - linux-beck.git/commitdiff
nfsd: Add DEALLOCATE support
authorAnna Schumaker <Anna.Schumaker@Netapp.com>
Fri, 7 Nov 2014 19:44:27 +0000 (14:44 -0500)
committerJ. Bruce Fields <bfields@redhat.com>
Fri, 7 Nov 2014 21:20:15 +0000 (16:20 -0500)
DEALLOCATE only returns a status value, meaning we can use the noop()
xdr encoder to reply to the client.

Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4proc.c
fs/nfsd/nfs4xdr.c
fs/nfsd/xdr4.h

index a261f1800922f54ff29a7d6f1e127008997a3bcc..74fb15eefc3165e37f03aa5ebf3b326cac7c396d 100644 (file)
@@ -33,6 +33,7 @@
  *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 #include <linux/file.h>
+#include <linux/falloc.h>
 #include <linux/slab.h>
 
 #include "idmap.h"
@@ -1043,6 +1044,14 @@ nfsd4_allocate(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        return nfsd4_fallocate(rqstp, cstate, fallocate, 0);
 }
 
+static __be32
+nfsd4_deallocate(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
+                struct nfsd4_fallocate *fallocate)
+{
+       return nfsd4_fallocate(rqstp, cstate, fallocate,
+                              FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE);
+}
+
 static __be32
 nfsd4_seek(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                struct nfsd4_seek *seek)
@@ -1965,6 +1974,12 @@ static struct nfsd4_operation nfsd4_ops[] = {
                .op_name = "OP_ALLOCATE",
                .op_rsize_bop = (nfsd4op_rsize)nfsd4_write_rsize,
        },
+       [OP_DEALLOCATE] = {
+               .op_func = (nfsd4op_func)nfsd4_deallocate,
+               .op_flags = OP_MODIFIES_SOMETHING | OP_CACHEME,
+               .op_name = "OP_DEALLOCATE",
+               .op_rsize_bop = (nfsd4op_rsize)nfsd4_write_rsize,
+       },
        [OP_SEEK] = {
                .op_func = (nfsd4op_func)nfsd4_seek,
                .op_name = "OP_SEEK",
index a60cff86fc28d57baa9468bf1d90ca6522c09817..0622d4f4a9a242313732a5a9014b493500abdf02 100644 (file)
@@ -1624,7 +1624,7 @@ static nfsd4_dec nfsd4_dec_ops[] = {
        [OP_ALLOCATE]           = (nfsd4_dec)nfsd4_decode_fallocate,
        [OP_COPY]               = (nfsd4_dec)nfsd4_decode_notsupp,
        [OP_COPY_NOTIFY]        = (nfsd4_dec)nfsd4_decode_notsupp,
-       [OP_DEALLOCATE]         = (nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_DEALLOCATE]         = (nfsd4_dec)nfsd4_decode_fallocate,
        [OP_IO_ADVISE]          = (nfsd4_dec)nfsd4_decode_notsupp,
        [OP_LAYOUTERROR]        = (nfsd4_dec)nfsd4_decode_notsupp,
        [OP_LAYOUTSTATS]        = (nfsd4_dec)nfsd4_decode_notsupp,
index eeaa0d0c4f794148fc76bd2bcd32124940204886..90a5925bd6ab49484ad44c4a19d421b664ede361 100644 (file)
@@ -494,6 +494,7 @@ struct nfsd4_op {
 
                /* NFSv4.2 */
                struct nfsd4_fallocate          allocate;
+               struct nfsd4_fallocate          deallocate;
                struct nfsd4_seek               seek;
        } u;
        struct nfs4_replay *                    replay;