|
@@ -33,6 +33,7 @@
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
*/
|
|
#include <linux/file.h>
|
|
#include <linux/file.h>
|
|
|
|
+#include <linux/falloc.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/slab.h>
|
|
|
|
|
|
#include "idmap.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);
|
|
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
|
|
static __be32
|
|
nfsd4_seek(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
|
nfsd4_seek(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
|
struct nfsd4_seek *seek)
|
|
struct nfsd4_seek *seek)
|
|
@@ -1965,6 +1974,12 @@ static struct nfsd4_operation nfsd4_ops[] = {
|
|
.op_name = "OP_ALLOCATE",
|
|
.op_name = "OP_ALLOCATE",
|
|
.op_rsize_bop = (nfsd4op_rsize)nfsd4_write_rsize,
|
|
.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_SEEK] = {
|
|
.op_func = (nfsd4op_func)nfsd4_seek,
|
|
.op_func = (nfsd4op_func)nfsd4_seek,
|
|
.op_name = "OP_SEEK",
|
|
.op_name = "OP_SEEK",
|