Linux Audio

Check our new training course

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