Merge tag 'drm-next-2022-06-03-1' of git://anongit.freedesktop.org/drm/drm
[linux-2.6-microblaze.git] / fs / nfs / nfs42proc.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2014 Anna Schumaker <Anna.Schumaker@Netapp.com>
4  */
5 #include <linux/fs.h>
6 #include <linux/sunrpc/addr.h>
7 #include <linux/sunrpc/sched.h>
8 #include <linux/nfs.h>
9 #include <linux/nfs3.h>
10 #include <linux/nfs4.h>
11 #include <linux/nfs_xdr.h>
12 #include <linux/nfs_fs.h>
13 #include "nfs4_fs.h"
14 #include "nfs42.h"
15 #include "iostat.h"
16 #include "pnfs.h"
17 #include "nfs4session.h"
18 #include "internal.h"
19 #include "delegation.h"
20 #include "nfs4trace.h"
21
22 #define NFSDBG_FACILITY NFSDBG_PROC
23 static int nfs42_do_offload_cancel_async(struct file *dst, nfs4_stateid *std);
24
25 static void nfs42_set_netaddr(struct file *filep, struct nfs42_netaddr *naddr)
26 {
27         struct nfs_client *clp = (NFS_SERVER(file_inode(filep)))->nfs_client;
28         unsigned short port = 2049;
29
30         rcu_read_lock();
31         naddr->netid_len = scnprintf(naddr->netid,
32                                         sizeof(naddr->netid), "%s",
33                                         rpc_peeraddr2str(clp->cl_rpcclient,
34                                         RPC_DISPLAY_NETID));
35         naddr->addr_len = scnprintf(naddr->addr,
36                                         sizeof(naddr->addr),
37                                         "%s.%u.%u",
38                                         rpc_peeraddr2str(clp->cl_rpcclient,
39                                         RPC_DISPLAY_ADDR),
40                                         port >> 8, port & 255);
41         rcu_read_unlock();
42 }
43
44 static int _nfs42_proc_fallocate(struct rpc_message *msg, struct file *filep,
45                 struct nfs_lock_context *lock, loff_t offset, loff_t len)
46 {
47         struct inode *inode = file_inode(filep);
48         struct nfs_server *server = NFS_SERVER(inode);
49         u32 bitmask[NFS_BITMASK_SZ];
50         struct nfs42_falloc_args args = {
51                 .falloc_fh      = NFS_FH(inode),
52                 .falloc_offset  = offset,
53                 .falloc_length  = len,
54                 .falloc_bitmask = bitmask,
55         };
56         struct nfs42_falloc_res res = {
57                 .falloc_server  = server,
58         };
59         int status;
60
61         msg->rpc_argp = &args;
62         msg->rpc_resp = &res;
63
64         status = nfs4_set_rw_stateid(&args.falloc_stateid, lock->open_context,
65                         lock, FMODE_WRITE);
66         if (status) {
67                 if (status == -EAGAIN)
68                         status = -NFS4ERR_BAD_STATEID;
69                 return status;
70         }
71
72         nfs4_bitmask_set(bitmask, server->cache_consistency_bitmask, inode,
73                          NFS_INO_INVALID_BLOCKS);
74
75         res.falloc_fattr = nfs_alloc_fattr();
76         if (!res.falloc_fattr)
77                 return -ENOMEM;
78
79         status = nfs4_call_sync(server->client, server, msg,
80                                 &args.seq_args, &res.seq_res, 0);
81         if (status == 0)
82                 status = nfs_post_op_update_inode_force_wcc(inode,
83                                                             res.falloc_fattr);
84
85         if (msg->rpc_proc == &nfs4_procedures[NFSPROC4_CLNT_ALLOCATE])
86                 trace_nfs4_fallocate(inode, &args, status);
87         else
88                 trace_nfs4_deallocate(inode, &args, status);
89         kfree(res.falloc_fattr);
90         return status;
91 }
92
93 static int nfs42_proc_fallocate(struct rpc_message *msg, struct file *filep,
94                                 loff_t offset, loff_t len)
95 {
96         struct inode *inode = file_inode(filep);
97         struct nfs_server *server = NFS_SERVER(inode);
98         struct nfs4_exception exception = { };
99         struct nfs_lock_context *lock;
100         int err;
101
102         lock = nfs_get_lock_context(nfs_file_open_context(filep));
103         if (IS_ERR(lock))
104                 return PTR_ERR(lock);
105
106         exception.inode = inode;
107         exception.state = lock->open_context->state;
108
109         err = nfs_sync_inode(inode);
110         if (err)
111                 goto out;
112
113         do {
114                 err = _nfs42_proc_fallocate(msg, filep, lock, offset, len);
115                 if (err == -ENOTSUPP) {
116                         err = -EOPNOTSUPP;
117                         break;
118                 }
119                 err = nfs4_handle_exception(server, err, &exception);
120         } while (exception.retry);
121 out:
122         nfs_put_lock_context(lock);
123         return err;
124 }
125
126 int nfs42_proc_allocate(struct file *filep, loff_t offset, loff_t len)
127 {
128         struct rpc_message msg = {
129                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_ALLOCATE],
130         };
131         struct inode *inode = file_inode(filep);
132         int err;
133
134         if (!nfs_server_capable(inode, NFS_CAP_ALLOCATE))
135                 return -EOPNOTSUPP;
136
137         inode_lock(inode);
138
139         err = nfs42_proc_fallocate(&msg, filep, offset, len);
140         if (err == -EOPNOTSUPP)
141                 NFS_SERVER(inode)->caps &= ~NFS_CAP_ALLOCATE;
142
143         inode_unlock(inode);
144         return err;
145 }
146
147 int nfs42_proc_deallocate(struct file *filep, loff_t offset, loff_t len)
148 {
149         struct rpc_message msg = {
150                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DEALLOCATE],
151         };
152         struct inode *inode = file_inode(filep);
153         int err;
154
155         if (!nfs_server_capable(inode, NFS_CAP_DEALLOCATE))
156                 return -EOPNOTSUPP;
157
158         inode_lock(inode);
159
160         err = nfs42_proc_fallocate(&msg, filep, offset, len);
161         if (err == 0)
162                 truncate_pagecache_range(inode, offset, (offset + len) -1);
163         if (err == -EOPNOTSUPP)
164                 NFS_SERVER(inode)->caps &= ~NFS_CAP_DEALLOCATE;
165
166         inode_unlock(inode);
167         return err;
168 }
169
170 static int handle_async_copy(struct nfs42_copy_res *res,
171                              struct nfs_server *dst_server,
172                              struct nfs_server *src_server,
173                              struct file *src,
174                              struct file *dst,
175                              nfs4_stateid *src_stateid,
176                              bool *restart)
177 {
178         struct nfs4_copy_state *copy, *tmp_copy = NULL, *iter;
179         int status = NFS4_OK;
180         struct nfs_open_context *dst_ctx = nfs_file_open_context(dst);
181         struct nfs_open_context *src_ctx = nfs_file_open_context(src);
182
183         copy = kzalloc(sizeof(struct nfs4_copy_state), GFP_KERNEL);
184         if (!copy)
185                 return -ENOMEM;
186
187         spin_lock(&dst_server->nfs_client->cl_lock);
188         list_for_each_entry(iter,
189                                 &dst_server->nfs_client->pending_cb_stateids,
190                                 copies) {
191                 if (memcmp(&res->write_res.stateid, &iter->stateid,
192                                 NFS4_STATEID_SIZE))
193                         continue;
194                 tmp_copy = iter;
195                 list_del(&iter->copies);
196                 break;
197         }
198         if (tmp_copy) {
199                 spin_unlock(&dst_server->nfs_client->cl_lock);
200                 kfree(copy);
201                 copy = tmp_copy;
202                 goto out;
203         }
204
205         memcpy(&copy->stateid, &res->write_res.stateid, NFS4_STATEID_SIZE);
206         init_completion(&copy->completion);
207         copy->parent_dst_state = dst_ctx->state;
208         copy->parent_src_state = src_ctx->state;
209
210         list_add_tail(&copy->copies, &dst_server->ss_copies);
211         spin_unlock(&dst_server->nfs_client->cl_lock);
212
213         if (dst_server != src_server) {
214                 spin_lock(&src_server->nfs_client->cl_lock);
215                 list_add_tail(&copy->src_copies, &src_server->ss_copies);
216                 spin_unlock(&src_server->nfs_client->cl_lock);
217         }
218
219         status = wait_for_completion_interruptible(&copy->completion);
220         spin_lock(&dst_server->nfs_client->cl_lock);
221         list_del_init(&copy->copies);
222         spin_unlock(&dst_server->nfs_client->cl_lock);
223         if (dst_server != src_server) {
224                 spin_lock(&src_server->nfs_client->cl_lock);
225                 list_del_init(&copy->src_copies);
226                 spin_unlock(&src_server->nfs_client->cl_lock);
227         }
228         if (status == -ERESTARTSYS) {
229                 goto out_cancel;
230         } else if (copy->flags || copy->error == NFS4ERR_PARTNER_NO_AUTH) {
231                 status = -EAGAIN;
232                 *restart = true;
233                 goto out_cancel;
234         }
235 out:
236         res->write_res.count = copy->count;
237         memcpy(&res->write_res.verifier, &copy->verf, sizeof(copy->verf));
238         status = -copy->error;
239
240 out_free:
241         kfree(copy);
242         return status;
243 out_cancel:
244         nfs42_do_offload_cancel_async(dst, &copy->stateid);
245         if (!nfs42_files_from_same_server(src, dst))
246                 nfs42_do_offload_cancel_async(src, src_stateid);
247         goto out_free;
248 }
249
250 static int process_copy_commit(struct file *dst, loff_t pos_dst,
251                                struct nfs42_copy_res *res)
252 {
253         struct nfs_commitres cres;
254         int status = -ENOMEM;
255
256         cres.verf = kzalloc(sizeof(struct nfs_writeverf), GFP_KERNEL);
257         if (!cres.verf)
258                 goto out;
259
260         status = nfs4_proc_commit(dst, pos_dst, res->write_res.count, &cres);
261         if (status)
262                 goto out_free;
263         if (nfs_write_verifier_cmp(&res->write_res.verifier.verifier,
264                                     &cres.verf->verifier)) {
265                 dprintk("commit verf differs from copy verf\n");
266                 status = -EAGAIN;
267         }
268 out_free:
269         kfree(cres.verf);
270 out:
271         return status;
272 }
273
274 /**
275  * nfs42_copy_dest_done - perform inode cache updates after clone/copy offload
276  * @inode: pointer to destination inode
277  * @pos: destination offset
278  * @len: copy length
279  *
280  * Punch a hole in the inode page cache, so that the NFS client will
281  * know to retrieve new data.
282  * Update the file size if necessary, and then mark the inode as having
283  * invalid cached values for change attribute, ctime, mtime and space used.
284  */
285 static void nfs42_copy_dest_done(struct inode *inode, loff_t pos, loff_t len)
286 {
287         loff_t newsize = pos + len;
288         loff_t end = newsize - 1;
289
290         WARN_ON_ONCE(invalidate_inode_pages2_range(inode->i_mapping,
291                                 pos >> PAGE_SHIFT, end >> PAGE_SHIFT));
292
293         spin_lock(&inode->i_lock);
294         if (newsize > i_size_read(inode))
295                 i_size_write(inode, newsize);
296         nfs_set_cache_invalid(inode, NFS_INO_INVALID_CHANGE |
297                                              NFS_INO_INVALID_CTIME |
298                                              NFS_INO_INVALID_MTIME |
299                                              NFS_INO_INVALID_BLOCKS);
300         spin_unlock(&inode->i_lock);
301 }
302
303 static ssize_t _nfs42_proc_copy(struct file *src,
304                                 struct nfs_lock_context *src_lock,
305                                 struct file *dst,
306                                 struct nfs_lock_context *dst_lock,
307                                 struct nfs42_copy_args *args,
308                                 struct nfs42_copy_res *res,
309                                 struct nl4_server *nss,
310                                 nfs4_stateid *cnr_stateid,
311                                 bool *restart)
312 {
313         struct rpc_message msg = {
314                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COPY],
315                 .rpc_argp = args,
316                 .rpc_resp = res,
317         };
318         struct inode *dst_inode = file_inode(dst);
319         struct inode *src_inode = file_inode(src);
320         struct nfs_server *dst_server = NFS_SERVER(dst_inode);
321         struct nfs_server *src_server = NFS_SERVER(src_inode);
322         loff_t pos_src = args->src_pos;
323         loff_t pos_dst = args->dst_pos;
324         size_t count = args->count;
325         ssize_t status;
326
327         if (nss) {
328                 args->cp_src = nss;
329                 nfs4_stateid_copy(&args->src_stateid, cnr_stateid);
330         } else {
331                 status = nfs4_set_rw_stateid(&args->src_stateid,
332                                 src_lock->open_context, src_lock, FMODE_READ);
333                 if (status) {
334                         if (status == -EAGAIN)
335                                 status = -NFS4ERR_BAD_STATEID;
336                         return status;
337                 }
338         }
339         status = nfs_filemap_write_and_wait_range(file_inode(src)->i_mapping,
340                         pos_src, pos_src + (loff_t)count - 1);
341         if (status)
342                 return status;
343
344         status = nfs4_set_rw_stateid(&args->dst_stateid, dst_lock->open_context,
345                                      dst_lock, FMODE_WRITE);
346         if (status) {
347                 if (status == -EAGAIN)
348                         status = -NFS4ERR_BAD_STATEID;
349                 return status;
350         }
351
352         status = nfs_sync_inode(dst_inode);
353         if (status)
354                 return status;
355
356         res->commit_res.verf = NULL;
357         if (args->sync) {
358                 res->commit_res.verf =
359                         kzalloc(sizeof(struct nfs_writeverf), GFP_KERNEL);
360                 if (!res->commit_res.verf)
361                         return -ENOMEM;
362         }
363         set_bit(NFS_CLNT_SRC_SSC_COPY_STATE,
364                 &src_lock->open_context->state->flags);
365         set_bit(NFS_CLNT_DST_SSC_COPY_STATE,
366                 &dst_lock->open_context->state->flags);
367
368         status = nfs4_call_sync(dst_server->client, dst_server, &msg,
369                                 &args->seq_args, &res->seq_res, 0);
370         trace_nfs4_copy(src_inode, dst_inode, args, res, nss, status);
371         if (status == -ENOTSUPP)
372                 dst_server->caps &= ~NFS_CAP_COPY;
373         if (status)
374                 goto out;
375
376         if (args->sync &&
377                 nfs_write_verifier_cmp(&res->write_res.verifier.verifier,
378                                     &res->commit_res.verf->verifier)) {
379                 status = -EAGAIN;
380                 goto out;
381         }
382
383         if (!res->synchronous) {
384                 status = handle_async_copy(res, dst_server, src_server, src,
385                                 dst, &args->src_stateid, restart);
386                 if (status)
387                         goto out;
388         }
389
390         if ((!res->synchronous || !args->sync) &&
391                         res->write_res.verifier.committed != NFS_FILE_SYNC) {
392                 status = process_copy_commit(dst, pos_dst, res);
393                 if (status)
394                         goto out;
395         }
396
397         nfs42_copy_dest_done(dst_inode, pos_dst, res->write_res.count);
398         nfs_invalidate_atime(src_inode);
399         status = res->write_res.count;
400 out:
401         if (args->sync)
402                 kfree(res->commit_res.verf);
403         return status;
404 }
405
406 ssize_t nfs42_proc_copy(struct file *src, loff_t pos_src,
407                         struct file *dst, loff_t pos_dst, size_t count,
408                         struct nl4_server *nss,
409                         nfs4_stateid *cnr_stateid, bool sync)
410 {
411         struct nfs_server *server = NFS_SERVER(file_inode(dst));
412         struct nfs_lock_context *src_lock;
413         struct nfs_lock_context *dst_lock;
414         struct nfs42_copy_args args = {
415                 .src_fh         = NFS_FH(file_inode(src)),
416                 .src_pos        = pos_src,
417                 .dst_fh         = NFS_FH(file_inode(dst)),
418                 .dst_pos        = pos_dst,
419                 .count          = count,
420                 .sync           = sync,
421         };
422         struct nfs42_copy_res res;
423         struct nfs4_exception src_exception = {
424                 .inode          = file_inode(src),
425                 .stateid        = &args.src_stateid,
426         };
427         struct nfs4_exception dst_exception = {
428                 .inode          = file_inode(dst),
429                 .stateid        = &args.dst_stateid,
430         };
431         ssize_t err, err2;
432         bool restart = false;
433
434         src_lock = nfs_get_lock_context(nfs_file_open_context(src));
435         if (IS_ERR(src_lock))
436                 return PTR_ERR(src_lock);
437
438         src_exception.state = src_lock->open_context->state;
439
440         dst_lock = nfs_get_lock_context(nfs_file_open_context(dst));
441         if (IS_ERR(dst_lock)) {
442                 err = PTR_ERR(dst_lock);
443                 goto out_put_src_lock;
444         }
445
446         dst_exception.state = dst_lock->open_context->state;
447
448         do {
449                 inode_lock(file_inode(dst));
450                 err = _nfs42_proc_copy(src, src_lock,
451                                 dst, dst_lock,
452                                 &args, &res,
453                                 nss, cnr_stateid, &restart);
454                 inode_unlock(file_inode(dst));
455
456                 if (err >= 0)
457                         break;
458                 if (err == -ENOTSUPP &&
459                                 nfs42_files_from_same_server(src, dst)) {
460                         err = -EOPNOTSUPP;
461                         break;
462                 } else if (err == -EAGAIN) {
463                         if (!restart) {
464                                 dst_exception.retry = 1;
465                                 continue;
466                         }
467                         break;
468                 } else if (err == -NFS4ERR_OFFLOAD_NO_REQS && !args.sync) {
469                         args.sync = true;
470                         dst_exception.retry = 1;
471                         continue;
472                 } else if ((err == -ESTALE ||
473                                 err == -NFS4ERR_OFFLOAD_DENIED ||
474                                 err == -ENOTSUPP) &&
475                                 !nfs42_files_from_same_server(src, dst)) {
476                         nfs42_do_offload_cancel_async(src, &args.src_stateid);
477                         err = -EOPNOTSUPP;
478                         break;
479                 }
480
481                 err2 = nfs4_handle_exception(server, err, &src_exception);
482                 err  = nfs4_handle_exception(server, err, &dst_exception);
483                 if (!err)
484                         err = err2;
485         } while (src_exception.retry || dst_exception.retry);
486
487         nfs_put_lock_context(dst_lock);
488 out_put_src_lock:
489         nfs_put_lock_context(src_lock);
490         return err;
491 }
492
493 struct nfs42_offloadcancel_data {
494         struct nfs_server *seq_server;
495         struct nfs42_offload_status_args args;
496         struct nfs42_offload_status_res res;
497 };
498
499 static void nfs42_offload_cancel_prepare(struct rpc_task *task, void *calldata)
500 {
501         struct nfs42_offloadcancel_data *data = calldata;
502
503         nfs4_setup_sequence(data->seq_server->nfs_client,
504                                 &data->args.osa_seq_args,
505                                 &data->res.osr_seq_res, task);
506 }
507
508 static void nfs42_offload_cancel_done(struct rpc_task *task, void *calldata)
509 {
510         struct nfs42_offloadcancel_data *data = calldata;
511
512         trace_nfs4_offload_cancel(&data->args, task->tk_status);
513         nfs41_sequence_done(task, &data->res.osr_seq_res);
514         if (task->tk_status &&
515                 nfs4_async_handle_error(task, data->seq_server, NULL,
516                         NULL) == -EAGAIN)
517                 rpc_restart_call_prepare(task);
518 }
519
520 static void nfs42_free_offloadcancel_data(void *data)
521 {
522         kfree(data);
523 }
524
525 static const struct rpc_call_ops nfs42_offload_cancel_ops = {
526         .rpc_call_prepare = nfs42_offload_cancel_prepare,
527         .rpc_call_done = nfs42_offload_cancel_done,
528         .rpc_release = nfs42_free_offloadcancel_data,
529 };
530
531 static int nfs42_do_offload_cancel_async(struct file *dst,
532                                          nfs4_stateid *stateid)
533 {
534         struct nfs_server *dst_server = NFS_SERVER(file_inode(dst));
535         struct nfs42_offloadcancel_data *data = NULL;
536         struct nfs_open_context *ctx = nfs_file_open_context(dst);
537         struct rpc_task *task;
538         struct rpc_message msg = {
539                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OFFLOAD_CANCEL],
540                 .rpc_cred = ctx->cred,
541         };
542         struct rpc_task_setup task_setup_data = {
543                 .rpc_client = dst_server->client,
544                 .rpc_message = &msg,
545                 .callback_ops = &nfs42_offload_cancel_ops,
546                 .workqueue = nfsiod_workqueue,
547                 .flags = RPC_TASK_ASYNC,
548         };
549         int status;
550
551         if (!(dst_server->caps & NFS_CAP_OFFLOAD_CANCEL))
552                 return -EOPNOTSUPP;
553
554         data = kzalloc(sizeof(struct nfs42_offloadcancel_data), GFP_KERNEL);
555         if (data == NULL)
556                 return -ENOMEM;
557
558         data->seq_server = dst_server;
559         data->args.osa_src_fh = NFS_FH(file_inode(dst));
560         memcpy(&data->args.osa_stateid, stateid,
561                 sizeof(data->args.osa_stateid));
562         msg.rpc_argp = &data->args;
563         msg.rpc_resp = &data->res;
564         task_setup_data.callback_data = data;
565         nfs4_init_sequence(&data->args.osa_seq_args, &data->res.osr_seq_res,
566                            1, 0);
567         task = rpc_run_task(&task_setup_data);
568         if (IS_ERR(task))
569                 return PTR_ERR(task);
570         status = rpc_wait_for_completion_task(task);
571         if (status == -ENOTSUPP)
572                 dst_server->caps &= ~NFS_CAP_OFFLOAD_CANCEL;
573         rpc_put_task(task);
574         return status;
575 }
576
577 static int _nfs42_proc_copy_notify(struct file *src, struct file *dst,
578                                    struct nfs42_copy_notify_args *args,
579                                    struct nfs42_copy_notify_res *res)
580 {
581         struct nfs_server *src_server = NFS_SERVER(file_inode(src));
582         struct rpc_message msg = {
583                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COPY_NOTIFY],
584                 .rpc_argp = args,
585                 .rpc_resp = res,
586         };
587         int status;
588         struct nfs_open_context *ctx;
589         struct nfs_lock_context *l_ctx;
590
591         ctx = get_nfs_open_context(nfs_file_open_context(src));
592         l_ctx = nfs_get_lock_context(ctx);
593         if (IS_ERR(l_ctx)) {
594                 status = PTR_ERR(l_ctx);
595                 goto out;
596         }
597
598         status = nfs4_set_rw_stateid(&args->cna_src_stateid, ctx, l_ctx,
599                                      FMODE_READ);
600         nfs_put_lock_context(l_ctx);
601         if (status) {
602                 if (status == -EAGAIN)
603                         status = -NFS4ERR_BAD_STATEID;
604                 goto out;
605         }
606
607         status = nfs4_call_sync(src_server->client, src_server, &msg,
608                                 &args->cna_seq_args, &res->cnr_seq_res, 0);
609         trace_nfs4_copy_notify(file_inode(src), args, res, status);
610         if (status == -ENOTSUPP)
611                 src_server->caps &= ~NFS_CAP_COPY_NOTIFY;
612
613 out:
614         put_nfs_open_context(nfs_file_open_context(src));
615         return status;
616 }
617
618 int nfs42_proc_copy_notify(struct file *src, struct file *dst,
619                                 struct nfs42_copy_notify_res *res)
620 {
621         struct nfs_server *src_server = NFS_SERVER(file_inode(src));
622         struct nfs42_copy_notify_args *args;
623         struct nfs4_exception exception = {
624                 .inode = file_inode(src),
625         };
626         int status;
627
628         if (!(src_server->caps & NFS_CAP_COPY_NOTIFY))
629                 return -EOPNOTSUPP;
630
631         args = kzalloc(sizeof(struct nfs42_copy_notify_args), GFP_KERNEL);
632         if (args == NULL)
633                 return -ENOMEM;
634
635         args->cna_src_fh  = NFS_FH(file_inode(src)),
636         args->cna_dst.nl4_type = NL4_NETADDR;
637         nfs42_set_netaddr(dst, &args->cna_dst.u.nl4_addr);
638         exception.stateid = &args->cna_src_stateid;
639
640         do {
641                 status = _nfs42_proc_copy_notify(src, dst, args, res);
642                 if (status == -ENOTSUPP) {
643                         status = -EOPNOTSUPP;
644                         goto out;
645                 }
646                 status = nfs4_handle_exception(src_server, status, &exception);
647         } while (exception.retry);
648
649 out:
650         kfree(args);
651         return status;
652 }
653
654 static loff_t _nfs42_proc_llseek(struct file *filep,
655                 struct nfs_lock_context *lock, loff_t offset, int whence)
656 {
657         struct inode *inode = file_inode(filep);
658         struct nfs42_seek_args args = {
659                 .sa_fh          = NFS_FH(inode),
660                 .sa_offset      = offset,
661                 .sa_what        = (whence == SEEK_HOLE) ?
662                                         NFS4_CONTENT_HOLE : NFS4_CONTENT_DATA,
663         };
664         struct nfs42_seek_res res;
665         struct rpc_message msg = {
666                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SEEK],
667                 .rpc_argp = &args,
668                 .rpc_resp = &res,
669         };
670         struct nfs_server *server = NFS_SERVER(inode);
671         int status;
672
673         if (!nfs_server_capable(inode, NFS_CAP_SEEK))
674                 return -ENOTSUPP;
675
676         status = nfs4_set_rw_stateid(&args.sa_stateid, lock->open_context,
677                         lock, FMODE_READ);
678         if (status) {
679                 if (status == -EAGAIN)
680                         status = -NFS4ERR_BAD_STATEID;
681                 return status;
682         }
683
684         status = nfs_filemap_write_and_wait_range(inode->i_mapping,
685                         offset, LLONG_MAX);
686         if (status)
687                 return status;
688
689         status = nfs4_call_sync(server->client, server, &msg,
690                                 &args.seq_args, &res.seq_res, 0);
691         trace_nfs4_llseek(inode, &args, &res, status);
692         if (status == -ENOTSUPP)
693                 server->caps &= ~NFS_CAP_SEEK;
694         if (status)
695                 return status;
696
697         if (whence == SEEK_DATA && res.sr_eof)
698                 return -NFS4ERR_NXIO;
699         else
700                 return vfs_setpos(filep, res.sr_offset, inode->i_sb->s_maxbytes);
701 }
702
703 loff_t nfs42_proc_llseek(struct file *filep, loff_t offset, int whence)
704 {
705         struct nfs_server *server = NFS_SERVER(file_inode(filep));
706         struct nfs4_exception exception = { };
707         struct nfs_lock_context *lock;
708         loff_t err;
709
710         lock = nfs_get_lock_context(nfs_file_open_context(filep));
711         if (IS_ERR(lock))
712                 return PTR_ERR(lock);
713
714         exception.inode = file_inode(filep);
715         exception.state = lock->open_context->state;
716
717         do {
718                 err = _nfs42_proc_llseek(filep, lock, offset, whence);
719                 if (err >= 0)
720                         break;
721                 if (err == -ENOTSUPP) {
722                         err = -EOPNOTSUPP;
723                         break;
724                 }
725                 err = nfs4_handle_exception(server, err, &exception);
726         } while (exception.retry);
727
728         nfs_put_lock_context(lock);
729         return err;
730 }
731
732
733 static void
734 nfs42_layoutstat_prepare(struct rpc_task *task, void *calldata)
735 {
736         struct nfs42_layoutstat_data *data = calldata;
737         struct inode *inode = data->inode;
738         struct nfs_server *server = NFS_SERVER(inode);
739         struct pnfs_layout_hdr *lo;
740
741         spin_lock(&inode->i_lock);
742         lo = NFS_I(inode)->layout;
743         if (!pnfs_layout_is_valid(lo)) {
744                 spin_unlock(&inode->i_lock);
745                 rpc_exit(task, 0);
746                 return;
747         }
748         nfs4_stateid_copy(&data->args.stateid, &lo->plh_stateid);
749         spin_unlock(&inode->i_lock);
750         nfs4_setup_sequence(server->nfs_client, &data->args.seq_args,
751                             &data->res.seq_res, task);
752 }
753
754 static void
755 nfs42_layoutstat_done(struct rpc_task *task, void *calldata)
756 {
757         struct nfs42_layoutstat_data *data = calldata;
758         struct inode *inode = data->inode;
759         struct pnfs_layout_hdr *lo;
760
761         if (!nfs4_sequence_done(task, &data->res.seq_res))
762                 return;
763
764         switch (task->tk_status) {
765         case 0:
766                 return;
767         case -NFS4ERR_BADHANDLE:
768         case -ESTALE:
769                 pnfs_destroy_layout(NFS_I(inode));
770                 break;
771         case -NFS4ERR_EXPIRED:
772         case -NFS4ERR_ADMIN_REVOKED:
773         case -NFS4ERR_DELEG_REVOKED:
774         case -NFS4ERR_STALE_STATEID:
775         case -NFS4ERR_BAD_STATEID:
776                 spin_lock(&inode->i_lock);
777                 lo = NFS_I(inode)->layout;
778                 if (pnfs_layout_is_valid(lo) &&
779                     nfs4_stateid_match(&data->args.stateid,
780                                              &lo->plh_stateid)) {
781                         LIST_HEAD(head);
782
783                         /*
784                          * Mark the bad layout state as invalid, then retry
785                          * with the current stateid.
786                          */
787                         pnfs_mark_layout_stateid_invalid(lo, &head);
788                         spin_unlock(&inode->i_lock);
789                         pnfs_free_lseg_list(&head);
790                         nfs_commit_inode(inode, 0);
791                 } else
792                         spin_unlock(&inode->i_lock);
793                 break;
794         case -NFS4ERR_OLD_STATEID:
795                 spin_lock(&inode->i_lock);
796                 lo = NFS_I(inode)->layout;
797                 if (pnfs_layout_is_valid(lo) &&
798                     nfs4_stateid_match_other(&data->args.stateid,
799                                         &lo->plh_stateid)) {
800                         /* Do we need to delay before resending? */
801                         if (!nfs4_stateid_is_newer(&lo->plh_stateid,
802                                                 &data->args.stateid))
803                                 rpc_delay(task, HZ);
804                         rpc_restart_call_prepare(task);
805                 }
806                 spin_unlock(&inode->i_lock);
807                 break;
808         case -ENOTSUPP:
809         case -EOPNOTSUPP:
810                 NFS_SERVER(inode)->caps &= ~NFS_CAP_LAYOUTSTATS;
811         }
812
813         trace_nfs4_layoutstats(inode, &data->args.stateid, task->tk_status);
814 }
815
816 static void
817 nfs42_layoutstat_release(void *calldata)
818 {
819         struct nfs42_layoutstat_data *data = calldata;
820         struct nfs42_layoutstat_devinfo *devinfo = data->args.devinfo;
821         int i;
822
823         for (i = 0; i < data->args.num_dev; i++) {
824                 if (devinfo[i].ld_private.ops && devinfo[i].ld_private.ops->free)
825                         devinfo[i].ld_private.ops->free(&devinfo[i].ld_private);
826         }
827
828         pnfs_put_layout_hdr(NFS_I(data->args.inode)->layout);
829         smp_mb__before_atomic();
830         clear_bit(NFS_INO_LAYOUTSTATS, &NFS_I(data->args.inode)->flags);
831         smp_mb__after_atomic();
832         nfs_iput_and_deactive(data->inode);
833         kfree(data->args.devinfo);
834         kfree(data);
835 }
836
837 static const struct rpc_call_ops nfs42_layoutstat_ops = {
838         .rpc_call_prepare = nfs42_layoutstat_prepare,
839         .rpc_call_done = nfs42_layoutstat_done,
840         .rpc_release = nfs42_layoutstat_release,
841 };
842
843 int nfs42_proc_layoutstats_generic(struct nfs_server *server,
844                                    struct nfs42_layoutstat_data *data)
845 {
846         struct rpc_message msg = {
847                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LAYOUTSTATS],
848                 .rpc_argp = &data->args,
849                 .rpc_resp = &data->res,
850         };
851         struct rpc_task_setup task_setup = {
852                 .rpc_client = server->client,
853                 .rpc_message = &msg,
854                 .callback_ops = &nfs42_layoutstat_ops,
855                 .callback_data = data,
856                 .flags = RPC_TASK_ASYNC,
857         };
858         struct rpc_task *task;
859
860         data->inode = nfs_igrab_and_active(data->args.inode);
861         if (!data->inode) {
862                 nfs42_layoutstat_release(data);
863                 return -EAGAIN;
864         }
865         nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 0, 0);
866         task = rpc_run_task(&task_setup);
867         if (IS_ERR(task))
868                 return PTR_ERR(task);
869         rpc_put_task(task);
870         return 0;
871 }
872
873 static struct nfs42_layouterror_data *
874 nfs42_alloc_layouterror_data(struct pnfs_layout_segment *lseg, gfp_t gfp_flags)
875 {
876         struct nfs42_layouterror_data *data;
877         struct inode *inode = lseg->pls_layout->plh_inode;
878
879         data = kzalloc(sizeof(*data), gfp_flags);
880         if (data) {
881                 data->args.inode = data->inode = nfs_igrab_and_active(inode);
882                 if (data->inode) {
883                         data->lseg = pnfs_get_lseg(lseg);
884                         if (data->lseg)
885                                 return data;
886                         nfs_iput_and_deactive(data->inode);
887                 }
888                 kfree(data);
889         }
890         return NULL;
891 }
892
893 static void
894 nfs42_free_layouterror_data(struct nfs42_layouterror_data *data)
895 {
896         pnfs_put_lseg(data->lseg);
897         nfs_iput_and_deactive(data->inode);
898         kfree(data);
899 }
900
901 static void
902 nfs42_layouterror_prepare(struct rpc_task *task, void *calldata)
903 {
904         struct nfs42_layouterror_data *data = calldata;
905         struct inode *inode = data->inode;
906         struct nfs_server *server = NFS_SERVER(inode);
907         struct pnfs_layout_hdr *lo = data->lseg->pls_layout;
908         unsigned i;
909
910         spin_lock(&inode->i_lock);
911         if (!pnfs_layout_is_valid(lo)) {
912                 spin_unlock(&inode->i_lock);
913                 rpc_exit(task, 0);
914                 return;
915         }
916         for (i = 0; i < data->args.num_errors; i++)
917                 nfs4_stateid_copy(&data->args.errors[i].stateid,
918                                 &lo->plh_stateid);
919         spin_unlock(&inode->i_lock);
920         nfs4_setup_sequence(server->nfs_client, &data->args.seq_args,
921                             &data->res.seq_res, task);
922 }
923
924 static void
925 nfs42_layouterror_done(struct rpc_task *task, void *calldata)
926 {
927         struct nfs42_layouterror_data *data = calldata;
928         struct inode *inode = data->inode;
929         struct pnfs_layout_hdr *lo = data->lseg->pls_layout;
930
931         if (!nfs4_sequence_done(task, &data->res.seq_res))
932                 return;
933
934         switch (task->tk_status) {
935         case 0:
936                 return;
937         case -NFS4ERR_BADHANDLE:
938         case -ESTALE:
939                 pnfs_destroy_layout(NFS_I(inode));
940                 break;
941         case -NFS4ERR_EXPIRED:
942         case -NFS4ERR_ADMIN_REVOKED:
943         case -NFS4ERR_DELEG_REVOKED:
944         case -NFS4ERR_STALE_STATEID:
945         case -NFS4ERR_BAD_STATEID:
946                 spin_lock(&inode->i_lock);
947                 if (pnfs_layout_is_valid(lo) &&
948                     nfs4_stateid_match(&data->args.errors[0].stateid,
949                                              &lo->plh_stateid)) {
950                         LIST_HEAD(head);
951
952                         /*
953                          * Mark the bad layout state as invalid, then retry
954                          * with the current stateid.
955                          */
956                         pnfs_mark_layout_stateid_invalid(lo, &head);
957                         spin_unlock(&inode->i_lock);
958                         pnfs_free_lseg_list(&head);
959                         nfs_commit_inode(inode, 0);
960                 } else
961                         spin_unlock(&inode->i_lock);
962                 break;
963         case -NFS4ERR_OLD_STATEID:
964                 spin_lock(&inode->i_lock);
965                 if (pnfs_layout_is_valid(lo) &&
966                     nfs4_stateid_match_other(&data->args.errors[0].stateid,
967                                         &lo->plh_stateid)) {
968                         /* Do we need to delay before resending? */
969                         if (!nfs4_stateid_is_newer(&lo->plh_stateid,
970                                                 &data->args.errors[0].stateid))
971                                 rpc_delay(task, HZ);
972                         rpc_restart_call_prepare(task);
973                 }
974                 spin_unlock(&inode->i_lock);
975                 break;
976         case -ENOTSUPP:
977         case -EOPNOTSUPP:
978                 NFS_SERVER(inode)->caps &= ~NFS_CAP_LAYOUTERROR;
979         }
980
981         trace_nfs4_layouterror(inode, &data->args.errors[0].stateid,
982                                task->tk_status);
983 }
984
985 static void
986 nfs42_layouterror_release(void *calldata)
987 {
988         struct nfs42_layouterror_data *data = calldata;
989
990         nfs42_free_layouterror_data(data);
991 }
992
993 static const struct rpc_call_ops nfs42_layouterror_ops = {
994         .rpc_call_prepare = nfs42_layouterror_prepare,
995         .rpc_call_done = nfs42_layouterror_done,
996         .rpc_release = nfs42_layouterror_release,
997 };
998
999 int nfs42_proc_layouterror(struct pnfs_layout_segment *lseg,
1000                 const struct nfs42_layout_error *errors, size_t n)
1001 {
1002         struct inode *inode = lseg->pls_layout->plh_inode;
1003         struct nfs42_layouterror_data *data;
1004         struct rpc_task *task;
1005         struct rpc_message msg = {
1006                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LAYOUTERROR],
1007         };
1008         struct rpc_task_setup task_setup = {
1009                 .rpc_message = &msg,
1010                 .callback_ops = &nfs42_layouterror_ops,
1011                 .flags = RPC_TASK_ASYNC,
1012         };
1013         unsigned int i;
1014
1015         if (!nfs_server_capable(inode, NFS_CAP_LAYOUTERROR))
1016                 return -EOPNOTSUPP;
1017         if (n > NFS42_LAYOUTERROR_MAX)
1018                 return -EINVAL;
1019         data = nfs42_alloc_layouterror_data(lseg, nfs_io_gfp_mask());
1020         if (!data)
1021                 return -ENOMEM;
1022         for (i = 0; i < n; i++) {
1023                 data->args.errors[i] = errors[i];
1024                 data->args.num_errors++;
1025                 data->res.num_errors++;
1026         }
1027         msg.rpc_argp = &data->args;
1028         msg.rpc_resp = &data->res;
1029         task_setup.callback_data = data;
1030         task_setup.rpc_client = NFS_SERVER(inode)->client;
1031         nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 0, 0);
1032         task = rpc_run_task(&task_setup);
1033         if (IS_ERR(task))
1034                 return PTR_ERR(task);
1035         rpc_put_task(task);
1036         return 0;
1037 }
1038 EXPORT_SYMBOL_GPL(nfs42_proc_layouterror);
1039
1040 static int _nfs42_proc_clone(struct rpc_message *msg, struct file *src_f,
1041                 struct file *dst_f, struct nfs_lock_context *src_lock,
1042                 struct nfs_lock_context *dst_lock, loff_t src_offset,
1043                 loff_t dst_offset, loff_t count)
1044 {
1045         struct inode *src_inode = file_inode(src_f);
1046         struct inode *dst_inode = file_inode(dst_f);
1047         struct nfs_server *server = NFS_SERVER(dst_inode);
1048         __u32 dst_bitmask[NFS_BITMASK_SZ];
1049         struct nfs42_clone_args args = {
1050                 .src_fh = NFS_FH(src_inode),
1051                 .dst_fh = NFS_FH(dst_inode),
1052                 .src_offset = src_offset,
1053                 .dst_offset = dst_offset,
1054                 .count = count,
1055                 .dst_bitmask = dst_bitmask,
1056         };
1057         struct nfs42_clone_res res = {
1058                 .server = server,
1059         };
1060         int status;
1061
1062         msg->rpc_argp = &args;
1063         msg->rpc_resp = &res;
1064
1065         status = nfs4_set_rw_stateid(&args.src_stateid, src_lock->open_context,
1066                         src_lock, FMODE_READ);
1067         if (status) {
1068                 if (status == -EAGAIN)
1069                         status = -NFS4ERR_BAD_STATEID;
1070                 return status;
1071         }
1072         status = nfs4_set_rw_stateid(&args.dst_stateid, dst_lock->open_context,
1073                         dst_lock, FMODE_WRITE);
1074         if (status) {
1075                 if (status == -EAGAIN)
1076                         status = -NFS4ERR_BAD_STATEID;
1077                 return status;
1078         }
1079
1080         res.dst_fattr = nfs_alloc_fattr();
1081         if (!res.dst_fattr)
1082                 return -ENOMEM;
1083
1084         nfs4_bitmask_set(dst_bitmask, server->cache_consistency_bitmask,
1085                          dst_inode, NFS_INO_INVALID_BLOCKS);
1086
1087         status = nfs4_call_sync(server->client, server, msg,
1088                                 &args.seq_args, &res.seq_res, 0);
1089         trace_nfs4_clone(src_inode, dst_inode, &args, status);
1090         if (status == 0) {
1091                 nfs42_copy_dest_done(dst_inode, dst_offset, count);
1092                 status = nfs_post_op_update_inode(dst_inode, res.dst_fattr);
1093         }
1094
1095         kfree(res.dst_fattr);
1096         return status;
1097 }
1098
1099 int nfs42_proc_clone(struct file *src_f, struct file *dst_f,
1100                      loff_t src_offset, loff_t dst_offset, loff_t count)
1101 {
1102         struct rpc_message msg = {
1103                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLONE],
1104         };
1105         struct inode *inode = file_inode(src_f);
1106         struct nfs_server *server = NFS_SERVER(file_inode(src_f));
1107         struct nfs_lock_context *src_lock;
1108         struct nfs_lock_context *dst_lock;
1109         struct nfs4_exception src_exception = { };
1110         struct nfs4_exception dst_exception = { };
1111         int err, err2;
1112
1113         if (!nfs_server_capable(inode, NFS_CAP_CLONE))
1114                 return -EOPNOTSUPP;
1115
1116         src_lock = nfs_get_lock_context(nfs_file_open_context(src_f));
1117         if (IS_ERR(src_lock))
1118                 return PTR_ERR(src_lock);
1119
1120         src_exception.inode = file_inode(src_f);
1121         src_exception.state = src_lock->open_context->state;
1122
1123         dst_lock = nfs_get_lock_context(nfs_file_open_context(dst_f));
1124         if (IS_ERR(dst_lock)) {
1125                 err = PTR_ERR(dst_lock);
1126                 goto out_put_src_lock;
1127         }
1128
1129         dst_exception.inode = file_inode(dst_f);
1130         dst_exception.state = dst_lock->open_context->state;
1131
1132         do {
1133                 err = _nfs42_proc_clone(&msg, src_f, dst_f, src_lock, dst_lock,
1134                                         src_offset, dst_offset, count);
1135                 if (err == -ENOTSUPP || err == -EOPNOTSUPP) {
1136                         NFS_SERVER(inode)->caps &= ~NFS_CAP_CLONE;
1137                         err = -EOPNOTSUPP;
1138                         break;
1139                 }
1140
1141                 err2 = nfs4_handle_exception(server, err, &src_exception);
1142                 err = nfs4_handle_exception(server, err, &dst_exception);
1143                 if (!err)
1144                         err = err2;
1145         } while (src_exception.retry || dst_exception.retry);
1146
1147         nfs_put_lock_context(dst_lock);
1148 out_put_src_lock:
1149         nfs_put_lock_context(src_lock);
1150         return err;
1151 }
1152
1153 #define NFS4XATTR_MAXPAGES DIV_ROUND_UP(XATTR_SIZE_MAX, PAGE_SIZE)
1154
1155 static int _nfs42_proc_removexattr(struct inode *inode, const char *name)
1156 {
1157         struct nfs_server *server = NFS_SERVER(inode);
1158         struct nfs42_removexattrargs args = {
1159                 .fh = NFS_FH(inode),
1160                 .xattr_name = name,
1161         };
1162         struct nfs42_removexattrres res;
1163         struct rpc_message msg = {
1164                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVEXATTR],
1165                 .rpc_argp = &args,
1166                 .rpc_resp = &res,
1167         };
1168         int ret;
1169         unsigned long timestamp = jiffies;
1170
1171         ret = nfs4_call_sync(server->client, server, &msg, &args.seq_args,
1172             &res.seq_res, 1);
1173         if (!ret)
1174                 nfs4_update_changeattr(inode, &res.cinfo, timestamp, 0);
1175
1176         return ret;
1177 }
1178
1179 static int _nfs42_proc_setxattr(struct inode *inode, const char *name,
1180                                 const void *buf, size_t buflen, int flags)
1181 {
1182         struct nfs_server *server = NFS_SERVER(inode);
1183         struct page *pages[NFS4XATTR_MAXPAGES];
1184         struct nfs42_setxattrargs arg = {
1185                 .fh             = NFS_FH(inode),
1186                 .xattr_pages    = pages,
1187                 .xattr_len      = buflen,
1188                 .xattr_name     = name,
1189                 .xattr_flags    = flags,
1190         };
1191         struct nfs42_setxattrres res;
1192         struct rpc_message msg = {
1193                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_SETXATTR],
1194                 .rpc_argp       = &arg,
1195                 .rpc_resp       = &res,
1196         };
1197         int ret, np;
1198         unsigned long timestamp = jiffies;
1199
1200         if (buflen > server->sxasize)
1201                 return -ERANGE;
1202
1203         if (buflen > 0) {
1204                 np = nfs4_buf_to_pages_noslab(buf, buflen, arg.xattr_pages);
1205                 if (np < 0)
1206                         return np;
1207         } else
1208                 np = 0;
1209
1210         ret = nfs4_call_sync(server->client, server, &msg, &arg.seq_args,
1211             &res.seq_res, 1);
1212
1213         for (; np > 0; np--)
1214                 put_page(pages[np - 1]);
1215
1216         if (!ret)
1217                 nfs4_update_changeattr(inode, &res.cinfo, timestamp, 0);
1218
1219         return ret;
1220 }
1221
1222 static ssize_t _nfs42_proc_getxattr(struct inode *inode, const char *name,
1223                                 void *buf, size_t buflen, struct page **pages,
1224                                 size_t plen)
1225 {
1226         struct nfs_server *server = NFS_SERVER(inode);
1227         struct nfs42_getxattrargs arg = {
1228                 .fh             = NFS_FH(inode),
1229                 .xattr_name     = name,
1230         };
1231         struct nfs42_getxattrres res;
1232         struct rpc_message msg = {
1233                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_GETXATTR],
1234                 .rpc_argp       = &arg,
1235                 .rpc_resp       = &res,
1236         };
1237         ssize_t ret;
1238
1239         arg.xattr_len = plen;
1240         arg.xattr_pages = pages;
1241
1242         ret = nfs4_call_sync(server->client, server, &msg, &arg.seq_args,
1243             &res.seq_res, 0);
1244         if (ret < 0)
1245                 return ret;
1246
1247         /*
1248          * Normally, the caching is done one layer up, but for successful
1249          * RPCS, always cache the result here, even if the caller was
1250          * just querying the length, or if the reply was too big for
1251          * the caller. This avoids a second RPC in the case of the
1252          * common query-alloc-retrieve cycle for xattrs.
1253          *
1254          * Note that xattr_len is always capped to XATTR_SIZE_MAX.
1255          */
1256
1257         nfs4_xattr_cache_add(inode, name, NULL, pages, res.xattr_len);
1258
1259         if (buflen) {
1260                 if (res.xattr_len > buflen)
1261                         return -ERANGE;
1262                 _copy_from_pages(buf, pages, 0, res.xattr_len);
1263         }
1264
1265         return res.xattr_len;
1266 }
1267
1268 static ssize_t _nfs42_proc_listxattrs(struct inode *inode, void *buf,
1269                                  size_t buflen, u64 *cookiep, bool *eofp)
1270 {
1271         struct nfs_server *server = NFS_SERVER(inode);
1272         struct page **pages;
1273         struct nfs42_listxattrsargs arg = {
1274                 .fh             = NFS_FH(inode),
1275                 .cookie         = *cookiep,
1276         };
1277         struct nfs42_listxattrsres res = {
1278                 .eof = false,
1279                 .xattr_buf = buf,
1280                 .xattr_len = buflen,
1281         };
1282         struct rpc_message msg = {
1283                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_LISTXATTRS],
1284                 .rpc_argp       = &arg,
1285                 .rpc_resp       = &res,
1286         };
1287         u32 xdrlen;
1288         int ret, np, i;
1289
1290
1291         ret = -ENOMEM;
1292         res.scratch = alloc_page(GFP_KERNEL);
1293         if (!res.scratch)
1294                 goto out;
1295
1296         xdrlen = nfs42_listxattr_xdrsize(buflen);
1297         if (xdrlen > server->lxasize)
1298                 xdrlen = server->lxasize;
1299         np = xdrlen / PAGE_SIZE + 1;
1300
1301         pages = kcalloc(np, sizeof(struct page *), GFP_KERNEL);
1302         if (!pages)
1303                 goto out_free_scratch;
1304         for (i = 0; i < np; i++) {
1305                 pages[i] = alloc_page(GFP_KERNEL);
1306                 if (!pages[i])
1307                         goto out_free_pages;
1308         }
1309
1310         arg.xattr_pages = pages;
1311         arg.count = xdrlen;
1312
1313         ret = nfs4_call_sync(server->client, server, &msg, &arg.seq_args,
1314             &res.seq_res, 0);
1315
1316         if (ret >= 0) {
1317                 ret = res.copied;
1318                 *cookiep = res.cookie;
1319                 *eofp = res.eof;
1320         }
1321
1322 out_free_pages:
1323         while (--np >= 0) {
1324                 if (pages[np])
1325                         __free_page(pages[np]);
1326         }
1327         kfree(pages);
1328 out_free_scratch:
1329         __free_page(res.scratch);
1330 out:
1331         return ret;
1332
1333 }
1334
1335 ssize_t nfs42_proc_getxattr(struct inode *inode, const char *name,
1336                               void *buf, size_t buflen)
1337 {
1338         struct nfs4_exception exception = { };
1339         ssize_t err, np, i;
1340         struct page **pages;
1341
1342         np = nfs_page_array_len(0, buflen ?: XATTR_SIZE_MAX);
1343         pages = kmalloc_array(np, sizeof(*pages), GFP_KERNEL);
1344         if (!pages)
1345                 return -ENOMEM;
1346
1347         for (i = 0; i < np; i++) {
1348                 pages[i] = alloc_page(GFP_KERNEL);
1349                 if (!pages[i]) {
1350                         np = i + 1;
1351                         err = -ENOMEM;
1352                         goto out;
1353                 }
1354         }
1355
1356         /*
1357          * The GETXATTR op has no length field in the call, and the
1358          * xattr data is at the end of the reply.
1359          *
1360          * There is no downside in using the page-aligned length. It will
1361          * allow receiving and caching xattrs that are too large for the
1362          * caller but still fit in the page-rounded value.
1363          */
1364         do {
1365                 err = _nfs42_proc_getxattr(inode, name, buf, buflen,
1366                         pages, np * PAGE_SIZE);
1367                 if (err >= 0)
1368                         break;
1369                 err = nfs4_handle_exception(NFS_SERVER(inode), err,
1370                                 &exception);
1371         } while (exception.retry);
1372
1373 out:
1374         while (--np >= 0)
1375                 __free_page(pages[np]);
1376         kfree(pages);
1377
1378         return err;
1379 }
1380
1381 int nfs42_proc_setxattr(struct inode *inode, const char *name,
1382                               const void *buf, size_t buflen, int flags)
1383 {
1384         struct nfs4_exception exception = { };
1385         int err;
1386
1387         do {
1388                 err = _nfs42_proc_setxattr(inode, name, buf, buflen, flags);
1389                 if (!err)
1390                         break;
1391                 err = nfs4_handle_exception(NFS_SERVER(inode), err,
1392                                 &exception);
1393         } while (exception.retry);
1394
1395         return err;
1396 }
1397
1398 ssize_t nfs42_proc_listxattrs(struct inode *inode, void *buf,
1399                               size_t buflen, u64 *cookiep, bool *eofp)
1400 {
1401         struct nfs4_exception exception = { };
1402         ssize_t err;
1403
1404         do {
1405                 err = _nfs42_proc_listxattrs(inode, buf, buflen,
1406                     cookiep, eofp);
1407                 if (err >= 0)
1408                         break;
1409                 err = nfs4_handle_exception(NFS_SERVER(inode), err,
1410                                 &exception);
1411         } while (exception.retry);
1412
1413         return err;
1414 }
1415
1416 int nfs42_proc_removexattr(struct inode *inode, const char *name)
1417 {
1418         struct nfs4_exception exception = { };
1419         int err;
1420
1421         do {
1422                 err = _nfs42_proc_removexattr(inode, name);
1423                 if (!err)
1424                         break;
1425                 err = nfs4_handle_exception(NFS_SERVER(inode), err,
1426                                 &exception);
1427         } while (exception.retry);
1428
1429         return err;
1430 }