diff options
Diffstat (limited to 'fs/nfs/nfs42proc.c')
-rw-r--r-- | fs/nfs/nfs42proc.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c index cb170722769c..3a9e75235f30 100644 --- a/fs/nfs/nfs42proc.c +++ b/fs/nfs/nfs42proc.c | |||
@@ -36,13 +36,16 @@ static int _nfs42_proc_fallocate(struct rpc_message *msg, struct file *filep, | |||
36 | loff_t offset, loff_t len) | 36 | loff_t offset, loff_t len) |
37 | { | 37 | { |
38 | struct inode *inode = file_inode(filep); | 38 | struct inode *inode = file_inode(filep); |
39 | struct nfs_server *server = NFS_SERVER(inode); | ||
39 | struct nfs42_falloc_args args = { | 40 | struct nfs42_falloc_args args = { |
40 | .falloc_fh = NFS_FH(inode), | 41 | .falloc_fh = NFS_FH(inode), |
41 | .falloc_offset = offset, | 42 | .falloc_offset = offset, |
42 | .falloc_length = len, | 43 | .falloc_length = len, |
44 | .falloc_bitmask = server->cache_consistency_bitmask, | ||
45 | }; | ||
46 | struct nfs42_falloc_res res = { | ||
47 | .falloc_server = server, | ||
43 | }; | 48 | }; |
44 | struct nfs42_falloc_res res; | ||
45 | struct nfs_server *server = NFS_SERVER(inode); | ||
46 | int status; | 49 | int status; |
47 | 50 | ||
48 | msg->rpc_argp = &args; | 51 | msg->rpc_argp = &args; |
@@ -52,8 +55,17 @@ static int _nfs42_proc_fallocate(struct rpc_message *msg, struct file *filep, | |||
52 | if (status) | 55 | if (status) |
53 | return status; | 56 | return status; |
54 | 57 | ||
55 | return nfs4_call_sync(server->client, server, msg, | 58 | res.falloc_fattr = nfs_alloc_fattr(); |
56 | &args.seq_args, &res.seq_res, 0); | 59 | if (!res.falloc_fattr) |
60 | return -ENOMEM; | ||
61 | |||
62 | status = nfs4_call_sync(server->client, server, msg, | ||
63 | &args.seq_args, &res.seq_res, 0); | ||
64 | if (status == 0) | ||
65 | status = nfs_post_op_update_inode(inode, res.falloc_fattr); | ||
66 | |||
67 | kfree(res.falloc_fattr); | ||
68 | return status; | ||
57 | } | 69 | } |
58 | 70 | ||
59 | static int nfs42_proc_fallocate(struct rpc_message *msg, struct file *filep, | 71 | static int nfs42_proc_fallocate(struct rpc_message *msg, struct file *filep, |
@@ -84,9 +96,13 @@ int nfs42_proc_allocate(struct file *filep, loff_t offset, loff_t len) | |||
84 | if (!nfs_server_capable(inode, NFS_CAP_ALLOCATE)) | 96 | if (!nfs_server_capable(inode, NFS_CAP_ALLOCATE)) |
85 | return -EOPNOTSUPP; | 97 | return -EOPNOTSUPP; |
86 | 98 | ||
99 | mutex_lock(&inode->i_mutex); | ||
100 | |||
87 | err = nfs42_proc_fallocate(&msg, filep, offset, len); | 101 | err = nfs42_proc_fallocate(&msg, filep, offset, len); |
88 | if (err == -EOPNOTSUPP) | 102 | if (err == -EOPNOTSUPP) |
89 | NFS_SERVER(inode)->caps &= ~NFS_CAP_ALLOCATE; | 103 | NFS_SERVER(inode)->caps &= ~NFS_CAP_ALLOCATE; |
104 | |||
105 | mutex_unlock(&inode->i_mutex); | ||
90 | return err; | 106 | return err; |
91 | } | 107 | } |
92 | 108 | ||
@@ -101,9 +117,16 @@ int nfs42_proc_deallocate(struct file *filep, loff_t offset, loff_t len) | |||
101 | if (!nfs_server_capable(inode, NFS_CAP_DEALLOCATE)) | 117 | if (!nfs_server_capable(inode, NFS_CAP_DEALLOCATE)) |
102 | return -EOPNOTSUPP; | 118 | return -EOPNOTSUPP; |
103 | 119 | ||
120 | nfs_wb_all(inode); | ||
121 | mutex_lock(&inode->i_mutex); | ||
122 | |||
104 | err = nfs42_proc_fallocate(&msg, filep, offset, len); | 123 | err = nfs42_proc_fallocate(&msg, filep, offset, len); |
124 | if (err == 0) | ||
125 | truncate_pagecache_range(inode, offset, (offset + len) -1); | ||
105 | if (err == -EOPNOTSUPP) | 126 | if (err == -EOPNOTSUPP) |
106 | NFS_SERVER(inode)->caps &= ~NFS_CAP_DEALLOCATE; | 127 | NFS_SERVER(inode)->caps &= ~NFS_CAP_DEALLOCATE; |
128 | |||
129 | mutex_unlock(&inode->i_mutex); | ||
107 | return err; | 130 | return err; |
108 | } | 131 | } |
109 | 132 | ||