diff options
-rw-r--r-- | fs/nfs/nfs4proc.c | 13 | ||||
-rw-r--r-- | fs/nfs/nfs4xdr.c | 28 | ||||
-rw-r--r-- | include/linux/nfs_xdr.h | 2 |
3 files changed, 36 insertions, 7 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index bab47c4cb41c..933e13b383f8 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -2169,8 +2169,10 @@ nfs4_write_done(struct rpc_task *task) | |||
2169 | rpc_restart_call(task); | 2169 | rpc_restart_call(task); |
2170 | return; | 2170 | return; |
2171 | } | 2171 | } |
2172 | if (task->tk_status >= 0) | 2172 | if (task->tk_status >= 0) { |
2173 | renew_lease(NFS_SERVER(inode), data->timestamp); | 2173 | renew_lease(NFS_SERVER(inode), data->timestamp); |
2174 | nfs_post_op_update_inode(inode, data->res.fattr); | ||
2175 | } | ||
2174 | /* Call back common NFS writeback processing */ | 2176 | /* Call back common NFS writeback processing */ |
2175 | nfs_writeback_done(task); | 2177 | nfs_writeback_done(task); |
2176 | } | 2178 | } |
@@ -2186,6 +2188,7 @@ nfs4_proc_write_setup(struct nfs_write_data *data, int how) | |||
2186 | .rpc_cred = data->cred, | 2188 | .rpc_cred = data->cred, |
2187 | }; | 2189 | }; |
2188 | struct inode *inode = data->inode; | 2190 | struct inode *inode = data->inode; |
2191 | struct nfs_server *server = NFS_SERVER(inode); | ||
2189 | int stable; | 2192 | int stable; |
2190 | int flags; | 2193 | int flags; |
2191 | 2194 | ||
@@ -2197,6 +2200,8 @@ nfs4_proc_write_setup(struct nfs_write_data *data, int how) | |||
2197 | } else | 2200 | } else |
2198 | stable = NFS_UNSTABLE; | 2201 | stable = NFS_UNSTABLE; |
2199 | data->args.stable = stable; | 2202 | data->args.stable = stable; |
2203 | data->args.bitmask = server->attr_bitmask; | ||
2204 | data->res.server = server; | ||
2200 | 2205 | ||
2201 | data->timestamp = jiffies; | 2206 | data->timestamp = jiffies; |
2202 | 2207 | ||
@@ -2218,6 +2223,8 @@ nfs4_commit_done(struct rpc_task *task) | |||
2218 | rpc_restart_call(task); | 2223 | rpc_restart_call(task); |
2219 | return; | 2224 | return; |
2220 | } | 2225 | } |
2226 | if (task->tk_status >= 0) | ||
2227 | nfs_post_op_update_inode(inode, data->res.fattr); | ||
2221 | /* Call back common NFS writeback processing */ | 2228 | /* Call back common NFS writeback processing */ |
2222 | nfs_commit_done(task); | 2229 | nfs_commit_done(task); |
2223 | } | 2230 | } |
@@ -2233,8 +2240,12 @@ nfs4_proc_commit_setup(struct nfs_write_data *data, int how) | |||
2233 | .rpc_cred = data->cred, | 2240 | .rpc_cred = data->cred, |
2234 | }; | 2241 | }; |
2235 | struct inode *inode = data->inode; | 2242 | struct inode *inode = data->inode; |
2243 | struct nfs_server *server = NFS_SERVER(inode); | ||
2236 | int flags; | 2244 | int flags; |
2237 | 2245 | ||
2246 | data->args.bitmask = server->attr_bitmask; | ||
2247 | data->res.server = server; | ||
2248 | |||
2238 | /* Set the initial flags for the task. */ | 2249 | /* Set the initial flags for the task. */ |
2239 | flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC; | 2250 | flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC; |
2240 | 2251 | ||
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index 3ee3a1669d28..6f1bf182e0e0 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c | |||
@@ -159,16 +159,20 @@ static int nfs_stat_to_errno(int); | |||
159 | op_decode_hdr_maxsz + 2) | 159 | op_decode_hdr_maxsz + 2) |
160 | #define NFS4_enc_write_sz (compound_encode_hdr_maxsz + \ | 160 | #define NFS4_enc_write_sz (compound_encode_hdr_maxsz + \ |
161 | encode_putfh_maxsz + \ | 161 | encode_putfh_maxsz + \ |
162 | op_encode_hdr_maxsz + 8) | 162 | op_encode_hdr_maxsz + 8 + \ |
163 | encode_getattr_maxsz) | ||
163 | #define NFS4_dec_write_sz (compound_decode_hdr_maxsz + \ | 164 | #define NFS4_dec_write_sz (compound_decode_hdr_maxsz + \ |
164 | decode_putfh_maxsz + \ | 165 | decode_putfh_maxsz + \ |
165 | op_decode_hdr_maxsz + 4) | 166 | op_decode_hdr_maxsz + 4 + \ |
167 | decode_getattr_maxsz) | ||
166 | #define NFS4_enc_commit_sz (compound_encode_hdr_maxsz + \ | 168 | #define NFS4_enc_commit_sz (compound_encode_hdr_maxsz + \ |
167 | encode_putfh_maxsz + \ | 169 | encode_putfh_maxsz + \ |
168 | op_encode_hdr_maxsz + 3) | 170 | op_encode_hdr_maxsz + 3 + \ |
171 | encode_getattr_maxsz) | ||
169 | #define NFS4_dec_commit_sz (compound_decode_hdr_maxsz + \ | 172 | #define NFS4_dec_commit_sz (compound_decode_hdr_maxsz + \ |
170 | decode_putfh_maxsz + \ | 173 | decode_putfh_maxsz + \ |
171 | op_decode_hdr_maxsz + 2) | 174 | op_decode_hdr_maxsz + 2 + \ |
175 | decode_getattr_maxsz) | ||
172 | #define NFS4_enc_open_sz (compound_encode_hdr_maxsz + \ | 176 | #define NFS4_enc_open_sz (compound_encode_hdr_maxsz + \ |
173 | encode_putfh_maxsz + \ | 177 | encode_putfh_maxsz + \ |
174 | op_encode_hdr_maxsz + \ | 178 | op_encode_hdr_maxsz + \ |
@@ -1799,7 +1803,7 @@ static int nfs4_xdr_enc_write(struct rpc_rqst *req, uint32_t *p, struct nfs_writ | |||
1799 | { | 1803 | { |
1800 | struct xdr_stream xdr; | 1804 | struct xdr_stream xdr; |
1801 | struct compound_hdr hdr = { | 1805 | struct compound_hdr hdr = { |
1802 | .nops = 2, | 1806 | .nops = 3, |
1803 | }; | 1807 | }; |
1804 | int status; | 1808 | int status; |
1805 | 1809 | ||
@@ -1809,6 +1813,9 @@ static int nfs4_xdr_enc_write(struct rpc_rqst *req, uint32_t *p, struct nfs_writ | |||
1809 | if (status) | 1813 | if (status) |
1810 | goto out; | 1814 | goto out; |
1811 | status = encode_write(&xdr, args); | 1815 | status = encode_write(&xdr, args); |
1816 | if (status) | ||
1817 | goto out; | ||
1818 | status = encode_getfattr(&xdr, args->bitmask); | ||
1812 | out: | 1819 | out: |
1813 | return status; | 1820 | return status; |
1814 | } | 1821 | } |
@@ -1820,7 +1827,7 @@ static int nfs4_xdr_enc_commit(struct rpc_rqst *req, uint32_t *p, struct nfs_wri | |||
1820 | { | 1827 | { |
1821 | struct xdr_stream xdr; | 1828 | struct xdr_stream xdr; |
1822 | struct compound_hdr hdr = { | 1829 | struct compound_hdr hdr = { |
1823 | .nops = 2, | 1830 | .nops = 3, |
1824 | }; | 1831 | }; |
1825 | int status; | 1832 | int status; |
1826 | 1833 | ||
@@ -1830,6 +1837,9 @@ static int nfs4_xdr_enc_commit(struct rpc_rqst *req, uint32_t *p, struct nfs_wri | |||
1830 | if (status) | 1837 | if (status) |
1831 | goto out; | 1838 | goto out; |
1832 | status = encode_commit(&xdr, args); | 1839 | status = encode_commit(&xdr, args); |
1840 | if (status) | ||
1841 | goto out; | ||
1842 | status = encode_getfattr(&xdr, args->bitmask); | ||
1833 | out: | 1843 | out: |
1834 | return status; | 1844 | return status; |
1835 | } | 1845 | } |
@@ -4001,6 +4011,9 @@ static int nfs4_xdr_dec_write(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_wr | |||
4001 | if (status) | 4011 | if (status) |
4002 | goto out; | 4012 | goto out; |
4003 | status = decode_write(&xdr, res); | 4013 | status = decode_write(&xdr, res); |
4014 | if (status) | ||
4015 | goto out; | ||
4016 | decode_getfattr(&xdr, res->fattr, res->server); | ||
4004 | if (!status) | 4017 | if (!status) |
4005 | status = res->count; | 4018 | status = res->count; |
4006 | out: | 4019 | out: |
@@ -4024,6 +4037,9 @@ static int nfs4_xdr_dec_commit(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_w | |||
4024 | if (status) | 4037 | if (status) |
4025 | goto out; | 4038 | goto out; |
4026 | status = decode_commit(&xdr, res); | 4039 | status = decode_commit(&xdr, res); |
4040 | if (status) | ||
4041 | goto out; | ||
4042 | decode_getfattr(&xdr, res->fattr, res->server); | ||
4027 | out: | 4043 | out: |
4028 | return status; | 4044 | return status; |
4029 | } | 4045 | } |
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index deeba7e2c518..40718669b9c8 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h | |||
@@ -256,6 +256,7 @@ struct nfs_writeargs { | |||
256 | enum nfs3_stable_how stable; | 256 | enum nfs3_stable_how stable; |
257 | unsigned int pgbase; | 257 | unsigned int pgbase; |
258 | struct page ** pages; | 258 | struct page ** pages; |
259 | const u32 * bitmask; | ||
259 | }; | 260 | }; |
260 | 261 | ||
261 | struct nfs_writeverf { | 262 | struct nfs_writeverf { |
@@ -267,6 +268,7 @@ struct nfs_writeres { | |||
267 | struct nfs_fattr * fattr; | 268 | struct nfs_fattr * fattr; |
268 | struct nfs_writeverf * verf; | 269 | struct nfs_writeverf * verf; |
269 | __u32 count; | 270 | __u32 count; |
271 | const struct nfs_server *server; | ||
270 | }; | 272 | }; |
271 | 273 | ||
272 | /* | 274 | /* |