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 bab47c4cb4..933e13b383 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 3ee3a1669d..6f1bf182e0 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 deeba7e2c5..40718669b9 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 | /* |
