xref: /openbmc/linux/fs/afs/inode.c (revision 0cd08b10)
1 /*
2  * Copyright (c) 2002 Red Hat, Inc. All rights reserved.
3  *
4  * This software may be freely redistributed under the terms of the
5  * GNU General Public License.
6  *
7  * You should have received a copy of the GNU General Public License
8  * along with this program; if not, write to the Free Software
9  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
10  *
11  * Authors: David Woodhouse <dwmw2@infradead.org>
12  *          David Howells <dhowells@redhat.com>
13  *
14  */
15 
16 #include <linux/kernel.h>
17 #include <linux/module.h>
18 #include <linux/init.h>
19 #include <linux/fs.h>
20 #include <linux/pagemap.h>
21 #include <linux/sched.h>
22 #include <linux/mount.h>
23 #include <linux/namei.h>
24 #include <linux/iversion.h>
25 #include "internal.h"
26 #include "afs_fs.h"
27 
28 static const struct inode_operations afs_symlink_inode_operations = {
29 	.get_link	= page_get_link,
30 	.listxattr	= afs_listxattr,
31 };
32 
33 static noinline void dump_vnode(struct afs_vnode *vnode, struct afs_vnode *parent_vnode)
34 {
35 	static unsigned long once_only;
36 
37 	pr_warn("kAFS: AFS vnode with undefined type %u\n", vnode->status.type);
38 	pr_warn("kAFS: A=%d m=%o s=%llx v=%llx\n",
39 		vnode->status.abort_code,
40 		vnode->status.mode,
41 		vnode->status.size,
42 		vnode->status.data_version);
43 	pr_warn("kAFS: vnode %llx:%llx:%x\n",
44 		vnode->fid.vid,
45 		vnode->fid.vnode,
46 		vnode->fid.unique);
47 	if (parent_vnode)
48 		pr_warn("kAFS: dir %llx:%llx:%x\n",
49 			parent_vnode->fid.vid,
50 			parent_vnode->fid.vnode,
51 			parent_vnode->fid.unique);
52 
53 	if (!test_and_set_bit(0, &once_only))
54 		dump_stack();
55 }
56 
57 /*
58  * Set the file size and block count.  Estimate the number of 512 bytes blocks
59  * used, rounded up to nearest 1K for consistency with other AFS clients.
60  */
61 static void afs_set_i_size(struct afs_vnode *vnode, u64 size)
62 {
63 	i_size_write(&vnode->vfs_inode, size);
64 	vnode->vfs_inode.i_blocks = ((size + 1023) >> 10) << 1;
65 }
66 
67 /*
68  * Initialise an inode from the vnode status.
69  */
70 static int afs_inode_init_from_status(struct afs_operation *op,
71 				      struct afs_vnode_param *vp,
72 				      struct afs_vnode *vnode)
73 {
74 	struct afs_file_status *status = &vp->scb.status;
75 	struct inode *inode = AFS_VNODE_TO_I(vnode);
76 	struct timespec64 t;
77 
78 	_enter("{%llx:%llu.%u} %s",
79 	       vp->fid.vid, vp->fid.vnode, vp->fid.unique,
80 	       op->type ? op->type->name : "???");
81 
82 	_debug("FS: ft=%d lk=%d sz=%llu ver=%Lu mod=%hu",
83 	       status->type,
84 	       status->nlink,
85 	       (unsigned long long) status->size,
86 	       status->data_version,
87 	       status->mode);
88 
89 	write_seqlock(&vnode->cb_lock);
90 
91 	vnode->cb_v_break = op->cb_v_break;
92 	vnode->cb_s_break = op->cb_s_break;
93 	vnode->status = *status;
94 
95 	t = status->mtime_client;
96 	inode->i_ctime = t;
97 	inode->i_mtime = t;
98 	inode->i_atime = t;
99 	inode->i_flags |= S_NOATIME;
100 	inode->i_uid = make_kuid(&init_user_ns, status->owner);
101 	inode->i_gid = make_kgid(&init_user_ns, status->group);
102 	set_nlink(&vnode->vfs_inode, status->nlink);
103 
104 	switch (status->type) {
105 	case AFS_FTYPE_FILE:
106 		inode->i_mode	= S_IFREG | status->mode;
107 		inode->i_op	= &afs_file_inode_operations;
108 		inode->i_fop	= &afs_file_operations;
109 		inode->i_mapping->a_ops	= &afs_fs_aops;
110 		break;
111 	case AFS_FTYPE_DIR:
112 		inode->i_mode	= S_IFDIR | status->mode;
113 		inode->i_op	= &afs_dir_inode_operations;
114 		inode->i_fop	= &afs_dir_file_operations;
115 		inode->i_mapping->a_ops	= &afs_dir_aops;
116 		break;
117 	case AFS_FTYPE_SYMLINK:
118 		/* Symlinks with a mode of 0644 are actually mountpoints. */
119 		if ((status->mode & 0777) == 0644) {
120 			inode->i_flags |= S_AUTOMOUNT;
121 
122 			set_bit(AFS_VNODE_MOUNTPOINT, &vnode->flags);
123 
124 			inode->i_mode	= S_IFDIR | 0555;
125 			inode->i_op	= &afs_mntpt_inode_operations;
126 			inode->i_fop	= &afs_mntpt_file_operations;
127 			inode->i_mapping->a_ops	= &afs_fs_aops;
128 		} else {
129 			inode->i_mode	= S_IFLNK | status->mode;
130 			inode->i_op	= &afs_symlink_inode_operations;
131 			inode->i_mapping->a_ops	= &afs_fs_aops;
132 		}
133 		inode_nohighmem(inode);
134 		break;
135 	default:
136 		dump_vnode(vnode, op->file[0].vnode != vnode ? op->file[0].vnode : NULL);
137 		write_sequnlock(&vnode->cb_lock);
138 		return afs_protocol_error(NULL, afs_eproto_file_type);
139 	}
140 
141 	afs_set_i_size(vnode, status->size);
142 
143 	vnode->invalid_before	= status->data_version;
144 	inode_set_iversion_raw(&vnode->vfs_inode, status->data_version);
145 
146 	if (!vp->scb.have_cb) {
147 		/* it's a symlink we just created (the fileserver
148 		 * didn't give us a callback) */
149 		vnode->cb_expires_at = ktime_get_real_seconds();
150 	} else {
151 		vnode->cb_expires_at = vp->scb.callback.expires_at;
152 		vnode->cb_server = op->server;
153 		set_bit(AFS_VNODE_CB_PROMISED, &vnode->flags);
154 	}
155 
156 	write_sequnlock(&vnode->cb_lock);
157 	return 0;
158 }
159 
160 /*
161  * Update the core inode struct from a returned status record.
162  */
163 static void afs_apply_status(struct afs_operation *op,
164 			     struct afs_vnode_param *vp)
165 {
166 	struct afs_file_status *status = &vp->scb.status;
167 	struct afs_vnode *vnode = vp->vnode;
168 	struct timespec64 t;
169 	umode_t mode;
170 	bool data_changed = false;
171 
172 	_enter("{%llx:%llu.%u} %s",
173 	       vp->fid.vid, vp->fid.vnode, vp->fid.unique,
174 	       op->type ? op->type->name : "???");
175 
176 	BUG_ON(test_bit(AFS_VNODE_UNSET, &vnode->flags));
177 
178 	if (status->type != vnode->status.type) {
179 		pr_warn("Vnode %llx:%llx:%x changed type %u to %u\n",
180 			vnode->fid.vid,
181 			vnode->fid.vnode,
182 			vnode->fid.unique,
183 			status->type, vnode->status.type);
184 		afs_protocol_error(NULL, afs_eproto_bad_status);
185 		return;
186 	}
187 
188 	if (status->nlink != vnode->status.nlink)
189 		set_nlink(&vnode->vfs_inode, status->nlink);
190 
191 	if (status->owner != vnode->status.owner)
192 		vnode->vfs_inode.i_uid = make_kuid(&init_user_ns, status->owner);
193 
194 	if (status->group != vnode->status.group)
195 		vnode->vfs_inode.i_gid = make_kgid(&init_user_ns, status->group);
196 
197 	if (status->mode != vnode->status.mode) {
198 		mode = vnode->vfs_inode.i_mode;
199 		mode &= ~S_IALLUGO;
200 		mode |= status->mode;
201 		WRITE_ONCE(vnode->vfs_inode.i_mode, mode);
202 	}
203 
204 	t = status->mtime_client;
205 	vnode->vfs_inode.i_ctime = t;
206 	vnode->vfs_inode.i_mtime = t;
207 	vnode->vfs_inode.i_atime = t;
208 
209 	if (vnode->status.data_version != status->data_version)
210 		data_changed = true;
211 
212 	vnode->status = *status;
213 
214 	if (vp->dv_before + vp->dv_delta != status->data_version) {
215 		if (test_bit(AFS_VNODE_CB_PROMISED, &vnode->flags))
216 			pr_warn("kAFS: vnode modified {%llx:%llu} %llx->%llx %s\n",
217 				vnode->fid.vid, vnode->fid.vnode,
218 				(unsigned long long)vp->dv_before + vp->dv_delta,
219 				(unsigned long long)status->data_version,
220 				op->type ? op->type->name : "???");
221 
222 		vnode->invalid_before = status->data_version;
223 		if (vnode->status.type == AFS_FTYPE_DIR) {
224 			if (test_and_clear_bit(AFS_VNODE_DIR_VALID, &vnode->flags))
225 				afs_stat_v(vnode, n_inval);
226 		} else {
227 			set_bit(AFS_VNODE_ZAP_DATA, &vnode->flags);
228 		}
229 	} else if (vnode->status.type == AFS_FTYPE_DIR) {
230 		/* Expected directory change is handled elsewhere so
231 		 * that we can locally edit the directory and save on a
232 		 * download.
233 		 */
234 		if (test_bit(AFS_VNODE_DIR_VALID, &vnode->flags))
235 			data_changed = false;
236 	}
237 
238 	if (data_changed) {
239 		inode_set_iversion_raw(&vnode->vfs_inode, status->data_version);
240 		afs_set_i_size(vnode, status->size);
241 	}
242 }
243 
244 /*
245  * Apply a callback to a vnode.
246  */
247 static void afs_apply_callback(struct afs_operation *op,
248 			       struct afs_vnode_param *vp)
249 {
250 	struct afs_callback *cb = &vp->scb.callback;
251 	struct afs_vnode *vnode = vp->vnode;
252 
253 	if (!afs_cb_is_broken(vp->cb_break_before, vnode)) {
254 		vnode->cb_expires_at	= cb->expires_at;
255 		vnode->cb_server	= op->server;
256 		set_bit(AFS_VNODE_CB_PROMISED, &vnode->flags);
257 	}
258 }
259 
260 /*
261  * Apply the received status and callback to an inode all in the same critical
262  * section to avoid races with afs_validate().
263  */
264 void afs_vnode_commit_status(struct afs_operation *op, struct afs_vnode_param *vp)
265 {
266 	struct afs_vnode *vnode = vp->vnode;
267 
268 	_enter("");
269 
270 	ASSERTCMP(op->error, ==, 0);
271 
272 	write_seqlock(&vnode->cb_lock);
273 
274 	if (vp->scb.have_error) {
275 		if (vp->scb.status.abort_code == VNOVNODE) {
276 			set_bit(AFS_VNODE_DELETED, &vnode->flags);
277 			clear_nlink(&vnode->vfs_inode);
278 			__afs_break_callback(vnode, afs_cb_break_for_deleted);
279 		}
280 	} else {
281 		if (vp->scb.have_status)
282 			afs_apply_status(op, vp);
283 		if (vp->scb.have_cb)
284 			afs_apply_callback(op, vp);
285 	}
286 
287 	write_sequnlock(&vnode->cb_lock);
288 
289 	if (op->error == 0 && vp->scb.have_status)
290 		afs_cache_permit(vnode, op->key, vp->cb_break_before, &vp->scb);
291 }
292 
293 static void afs_fetch_status_success(struct afs_operation *op)
294 {
295 	struct afs_vnode_param *vp = &op->file[0];
296 	struct afs_vnode *vnode = vp->vnode;
297 	int ret;
298 
299 	if (vnode->vfs_inode.i_state & I_NEW) {
300 		ret = afs_inode_init_from_status(op, vp, vnode);
301 		op->error = ret;
302 		if (ret == 0)
303 			afs_cache_permit(vnode, op->key, vp->cb_break_before, &vp->scb);
304 	} else {
305 		afs_vnode_commit_status(op, vp);
306 	}
307 }
308 
309 static const struct afs_operation_ops afs_fetch_status_operation = {
310 	.issue_afs_rpc	= afs_fs_fetch_status,
311 	.issue_yfs_rpc	= yfs_fs_fetch_status,
312 	.success	= afs_fetch_status_success,
313 };
314 
315 /*
316  * Fetch file status from the volume.
317  */
318 int afs_fetch_status(struct afs_vnode *vnode, struct key *key, bool is_new,
319 		     afs_access_t *_caller_access)
320 {
321 	struct afs_operation *op;
322 
323 	_enter("%s,{%llx:%llu.%u,S=%lx}",
324 	       vnode->volume->name,
325 	       vnode->fid.vid, vnode->fid.vnode, vnode->fid.unique,
326 	       vnode->flags);
327 
328 	op = afs_alloc_operation(key, vnode->volume);
329 	if (IS_ERR(op))
330 		return PTR_ERR(op);
331 
332 	afs_op_set_vnode(op, 0, vnode);
333 
334 	op->nr_files	= 1;
335 	op->ops		= &afs_fetch_status_operation;
336 	afs_begin_vnode_operation(op);
337 	afs_wait_for_operation(op);
338 
339 	if (_caller_access)
340 		*_caller_access = op->file[0].scb.status.caller_access;
341 	return afs_put_operation(op);
342 }
343 
344 /*
345  * ilookup() comparator
346  */
347 int afs_ilookup5_test_by_fid(struct inode *inode, void *opaque)
348 {
349 	struct afs_vnode *vnode = AFS_FS_I(inode);
350 	struct afs_fid *fid = opaque;
351 
352 	return (fid->vnode == vnode->fid.vnode &&
353 		fid->vnode_hi == vnode->fid.vnode_hi &&
354 		fid->unique == vnode->fid.unique);
355 }
356 
357 /*
358  * iget5() comparator
359  */
360 static int afs_iget5_test(struct inode *inode, void *opaque)
361 {
362 	struct afs_vnode_param *vp = opaque;
363 	//struct afs_vnode *vnode = AFS_FS_I(inode);
364 
365 	return afs_ilookup5_test_by_fid(inode, &vp->fid);
366 }
367 
368 /*
369  * iget5() inode initialiser
370  */
371 static int afs_iget5_set(struct inode *inode, void *opaque)
372 {
373 	struct afs_vnode_param *vp = opaque;
374 	struct afs_super_info *as = AFS_FS_S(inode->i_sb);
375 	struct afs_vnode *vnode = AFS_FS_I(inode);
376 
377 	vnode->volume		= as->volume;
378 	vnode->fid		= vp->fid;
379 
380 	/* YFS supports 96-bit vnode IDs, but Linux only supports
381 	 * 64-bit inode numbers.
382 	 */
383 	inode->i_ino		= vnode->fid.vnode;
384 	inode->i_generation	= vnode->fid.unique;
385 	return 0;
386 }
387 
388 /*
389  * Get a cache cookie for an inode.
390  */
391 static void afs_get_inode_cache(struct afs_vnode *vnode)
392 {
393 #ifdef CONFIG_AFS_FSCACHE
394 	struct {
395 		u32 vnode_id;
396 		u32 unique;
397 		u32 vnode_id_ext[2];	/* Allow for a 96-bit key */
398 	} __packed key;
399 	struct afs_vnode_cache_aux aux;
400 
401 	if (vnode->status.type == AFS_FTYPE_DIR) {
402 		vnode->cache = NULL;
403 		return;
404 	}
405 
406 	key.vnode_id		= vnode->fid.vnode;
407 	key.unique		= vnode->fid.unique;
408 	key.vnode_id_ext[0]	= vnode->fid.vnode >> 32;
409 	key.vnode_id_ext[1]	= vnode->fid.vnode_hi;
410 	aux.data_version	= vnode->status.data_version;
411 
412 	vnode->cache = fscache_acquire_cookie(vnode->volume->cache,
413 					      &afs_vnode_cache_index_def,
414 					      &key, sizeof(key),
415 					      &aux, sizeof(aux),
416 					      vnode, vnode->status.size, true);
417 #endif
418 }
419 
420 /*
421  * inode retrieval
422  */
423 struct inode *afs_iget(struct afs_operation *op, struct afs_vnode_param *vp)
424 {
425 	struct afs_vnode_param *dvp = &op->file[0];
426 	struct super_block *sb = dvp->vnode->vfs_inode.i_sb;
427 	struct afs_vnode *vnode;
428 	struct inode *inode;
429 	int ret;
430 
431 	_enter(",{%llx:%llu.%u},,", vp->fid.vid, vp->fid.vnode, vp->fid.unique);
432 
433 	inode = iget5_locked(sb, vp->fid.vnode, afs_iget5_test, afs_iget5_set, vp);
434 	if (!inode) {
435 		_leave(" = -ENOMEM");
436 		return ERR_PTR(-ENOMEM);
437 	}
438 
439 	vnode = AFS_FS_I(inode);
440 
441 	_debug("GOT INODE %p { vl=%llx vn=%llx, u=%x }",
442 	       inode, vnode->fid.vid, vnode->fid.vnode, vnode->fid.unique);
443 
444 	/* deal with an existing inode */
445 	if (!(inode->i_state & I_NEW)) {
446 		_leave(" = %p", inode);
447 		return inode;
448 	}
449 
450 	ret = afs_inode_init_from_status(op, vp, vnode);
451 	if (ret < 0)
452 		goto bad_inode;
453 
454 	afs_get_inode_cache(vnode);
455 
456 	/* success */
457 	clear_bit(AFS_VNODE_UNSET, &vnode->flags);
458 	unlock_new_inode(inode);
459 	_leave(" = %p", inode);
460 	return inode;
461 
462 	/* failure */
463 bad_inode:
464 	iget_failed(inode);
465 	_leave(" = %d [bad]", ret);
466 	return ERR_PTR(ret);
467 }
468 
469 static int afs_iget5_set_root(struct inode *inode, void *opaque)
470 {
471 	struct afs_super_info *as = AFS_FS_S(inode->i_sb);
472 	struct afs_vnode *vnode = AFS_FS_I(inode);
473 
474 	vnode->volume		= as->volume;
475 	vnode->fid.vid		= as->volume->vid,
476 	vnode->fid.vnode	= 1;
477 	vnode->fid.unique	= 1;
478 	inode->i_ino		= 1;
479 	inode->i_generation	= 1;
480 	return 0;
481 }
482 
483 /*
484  * Set up the root inode for a volume.  This is always vnode 1, unique 1 within
485  * the volume.
486  */
487 struct inode *afs_root_iget(struct super_block *sb, struct key *key)
488 {
489 	struct afs_super_info *as = AFS_FS_S(sb);
490 	struct afs_operation *op;
491 	struct afs_vnode *vnode;
492 	struct inode *inode;
493 	int ret;
494 
495 	_enter(",{%llx},,", as->volume->vid);
496 
497 	inode = iget5_locked(sb, 1, NULL, afs_iget5_set_root, NULL);
498 	if (!inode) {
499 		_leave(" = -ENOMEM");
500 		return ERR_PTR(-ENOMEM);
501 	}
502 
503 	_debug("GOT ROOT INODE %p { vl=%llx }", inode, as->volume->vid);
504 
505 	BUG_ON(!(inode->i_state & I_NEW));
506 
507 	vnode = AFS_FS_I(inode);
508 	vnode->cb_v_break = as->volume->cb_v_break,
509 
510 	op = afs_alloc_operation(key, as->volume);
511 	if (IS_ERR(op)) {
512 		ret = PTR_ERR(op);
513 		goto error;
514 	}
515 
516 	afs_op_set_vnode(op, 0, vnode);
517 
518 	op->nr_files	= 1;
519 	op->ops		= &afs_fetch_status_operation;
520 	ret = afs_do_sync_operation(op);
521 	if (ret < 0)
522 		goto error;
523 
524 	afs_get_inode_cache(vnode);
525 
526 	clear_bit(AFS_VNODE_UNSET, &vnode->flags);
527 	unlock_new_inode(inode);
528 	_leave(" = %p", inode);
529 	return inode;
530 
531 error:
532 	iget_failed(inode);
533 	_leave(" = %d [bad]", ret);
534 	return ERR_PTR(ret);
535 }
536 
537 /*
538  * mark the data attached to an inode as obsolete due to a write on the server
539  * - might also want to ditch all the outstanding writes and dirty pages
540  */
541 static void afs_zap_data(struct afs_vnode *vnode)
542 {
543 	_enter("{%llx:%llu}", vnode->fid.vid, vnode->fid.vnode);
544 
545 #ifdef CONFIG_AFS_FSCACHE
546 	fscache_invalidate(vnode->cache);
547 #endif
548 
549 	/* nuke all the non-dirty pages that aren't locked, mapped or being
550 	 * written back in a regular file and completely discard the pages in a
551 	 * directory or symlink */
552 	if (S_ISREG(vnode->vfs_inode.i_mode))
553 		invalidate_remote_inode(&vnode->vfs_inode);
554 	else
555 		invalidate_inode_pages2(vnode->vfs_inode.i_mapping);
556 }
557 
558 /*
559  * Get the server reinit counter for a vnode's current server.
560  */
561 static bool afs_get_s_break_rcu(struct afs_vnode *vnode, unsigned int *_s_break)
562 {
563 	struct afs_server_list *slist = rcu_dereference(vnode->volume->servers);
564 	struct afs_server *server;
565 	int i;
566 
567 	for (i = 0; i < slist->nr_servers; i++) {
568 		server = slist->servers[i].server;
569 		if (server == vnode->cb_server) {
570 			*_s_break = READ_ONCE(server->cb_s_break);
571 			return true;
572 		}
573 	}
574 
575 	return false;
576 }
577 
578 /*
579  * Check the validity of a vnode/inode.
580  */
581 bool afs_check_validity(struct afs_vnode *vnode)
582 {
583 	struct afs_volume *volume = vnode->volume;
584 	enum afs_cb_break_reason need_clear = afs_cb_break_no_break;
585 	time64_t now = ktime_get_real_seconds();
586 	bool valid;
587 	unsigned int cb_break, cb_s_break, cb_v_break;
588 	int seq = 0;
589 
590 	do {
591 		read_seqbegin_or_lock(&vnode->cb_lock, &seq);
592 		cb_v_break = READ_ONCE(volume->cb_v_break);
593 		cb_break = vnode->cb_break;
594 
595 		if (test_bit(AFS_VNODE_CB_PROMISED, &vnode->flags) &&
596 		    afs_get_s_break_rcu(vnode, &cb_s_break)) {
597 			if (vnode->cb_s_break != cb_s_break ||
598 			    vnode->cb_v_break != cb_v_break) {
599 				vnode->cb_s_break = cb_s_break;
600 				vnode->cb_v_break = cb_v_break;
601 				need_clear = afs_cb_break_for_vsbreak;
602 				valid = false;
603 			} else if (test_bit(AFS_VNODE_ZAP_DATA, &vnode->flags)) {
604 				need_clear = afs_cb_break_for_zap;
605 				valid = false;
606 			} else if (vnode->cb_expires_at - 10 <= now) {
607 				need_clear = afs_cb_break_for_lapsed;
608 				valid = false;
609 			} else {
610 				valid = true;
611 			}
612 		} else if (test_bit(AFS_VNODE_DELETED, &vnode->flags)) {
613 			valid = true;
614 		} else {
615 			vnode->cb_v_break = cb_v_break;
616 			valid = false;
617 		}
618 
619 	} while (need_seqretry(&vnode->cb_lock, seq));
620 
621 	done_seqretry(&vnode->cb_lock, seq);
622 
623 	if (need_clear != afs_cb_break_no_break) {
624 		write_seqlock(&vnode->cb_lock);
625 		if (cb_break == vnode->cb_break)
626 			__afs_break_callback(vnode, need_clear);
627 		else
628 			trace_afs_cb_miss(&vnode->fid, need_clear);
629 		write_sequnlock(&vnode->cb_lock);
630 		valid = false;
631 	}
632 
633 	return valid;
634 }
635 
636 /*
637  * validate a vnode/inode
638  * - there are several things we need to check
639  *   - parent dir data changes (rm, rmdir, rename, mkdir, create, link,
640  *     symlink)
641  *   - parent dir metadata changed (security changes)
642  *   - dentry data changed (write, truncate)
643  *   - dentry metadata changed (security changes)
644  */
645 int afs_validate(struct afs_vnode *vnode, struct key *key)
646 {
647 	bool valid;
648 	int ret;
649 
650 	_enter("{v={%llx:%llu} fl=%lx},%x",
651 	       vnode->fid.vid, vnode->fid.vnode, vnode->flags,
652 	       key_serial(key));
653 
654 	rcu_read_lock();
655 	valid = afs_check_validity(vnode);
656 	rcu_read_unlock();
657 
658 	if (test_bit(AFS_VNODE_DELETED, &vnode->flags))
659 		clear_nlink(&vnode->vfs_inode);
660 
661 	if (valid)
662 		goto valid;
663 
664 	down_write(&vnode->validate_lock);
665 
666 	/* if the promise has expired, we need to check the server again to get
667 	 * a new promise - note that if the (parent) directory's metadata was
668 	 * changed then the security may be different and we may no longer have
669 	 * access */
670 	if (!test_bit(AFS_VNODE_CB_PROMISED, &vnode->flags)) {
671 		_debug("not promised");
672 		ret = afs_fetch_status(vnode, key, false, NULL);
673 		if (ret < 0) {
674 			if (ret == -ENOENT) {
675 				set_bit(AFS_VNODE_DELETED, &vnode->flags);
676 				ret = -ESTALE;
677 			}
678 			goto error_unlock;
679 		}
680 		_debug("new promise [fl=%lx]", vnode->flags);
681 	}
682 
683 	if (test_bit(AFS_VNODE_DELETED, &vnode->flags)) {
684 		_debug("file already deleted");
685 		ret = -ESTALE;
686 		goto error_unlock;
687 	}
688 
689 	/* if the vnode's data version number changed then its contents are
690 	 * different */
691 	if (test_and_clear_bit(AFS_VNODE_ZAP_DATA, &vnode->flags))
692 		afs_zap_data(vnode);
693 	up_write(&vnode->validate_lock);
694 valid:
695 	_leave(" = 0");
696 	return 0;
697 
698 error_unlock:
699 	up_write(&vnode->validate_lock);
700 	_leave(" = %d", ret);
701 	return ret;
702 }
703 
704 /*
705  * read the attributes of an inode
706  */
707 int afs_getattr(const struct path *path, struct kstat *stat,
708 		u32 request_mask, unsigned int query_flags)
709 {
710 	struct inode *inode = d_inode(path->dentry);
711 	struct afs_vnode *vnode = AFS_FS_I(inode);
712 	int seq = 0;
713 
714 	_enter("{ ino=%lu v=%u }", inode->i_ino, inode->i_generation);
715 
716 	do {
717 		read_seqbegin_or_lock(&vnode->cb_lock, &seq);
718 		generic_fillattr(inode, stat);
719 	} while (need_seqretry(&vnode->cb_lock, seq));
720 
721 	done_seqretry(&vnode->cb_lock, seq);
722 	return 0;
723 }
724 
725 /*
726  * discard an AFS inode
727  */
728 int afs_drop_inode(struct inode *inode)
729 {
730 	_enter("");
731 
732 	if (test_bit(AFS_VNODE_PSEUDODIR, &AFS_FS_I(inode)->flags))
733 		return generic_delete_inode(inode);
734 	else
735 		return generic_drop_inode(inode);
736 }
737 
738 /*
739  * clear an AFS inode
740  */
741 void afs_evict_inode(struct inode *inode)
742 {
743 	struct afs_vnode *vnode;
744 
745 	vnode = AFS_FS_I(inode);
746 
747 	_enter("{%llx:%llu.%d}",
748 	       vnode->fid.vid,
749 	       vnode->fid.vnode,
750 	       vnode->fid.unique);
751 
752 	_debug("CLEAR INODE %p", inode);
753 
754 	ASSERTCMP(inode->i_ino, ==, vnode->fid.vnode);
755 
756 	truncate_inode_pages_final(&inode->i_data);
757 	clear_inode(inode);
758 
759 	while (!list_empty(&vnode->wb_keys)) {
760 		struct afs_wb_key *wbk = list_entry(vnode->wb_keys.next,
761 						    struct afs_wb_key, vnode_link);
762 		list_del(&wbk->vnode_link);
763 		afs_put_wb_key(wbk);
764 	}
765 
766 #ifdef CONFIG_AFS_FSCACHE
767 	{
768 		struct afs_vnode_cache_aux aux;
769 
770 		aux.data_version = vnode->status.data_version;
771 		fscache_relinquish_cookie(vnode->cache, &aux,
772 					  test_bit(AFS_VNODE_DELETED, &vnode->flags));
773 		vnode->cache = NULL;
774 	}
775 #endif
776 
777 	afs_prune_wb_keys(vnode);
778 	afs_put_permits(rcu_access_pointer(vnode->permit_cache));
779 	key_put(vnode->silly_key);
780 	vnode->silly_key = NULL;
781 	key_put(vnode->lock_key);
782 	vnode->lock_key = NULL;
783 	_leave("");
784 }
785 
786 static void afs_setattr_success(struct afs_operation *op)
787 {
788 	afs_vnode_commit_status(op, &op->file[0]);
789 }
790 
791 static const struct afs_operation_ops afs_setattr_operation = {
792 	.issue_afs_rpc	= afs_fs_setattr,
793 	.issue_yfs_rpc	= yfs_fs_setattr,
794 	.success	= afs_setattr_success,
795 };
796 
797 /*
798  * set the attributes of an inode
799  */
800 int afs_setattr(struct dentry *dentry, struct iattr *attr)
801 {
802 	struct afs_operation *op;
803 	struct afs_vnode *vnode = AFS_FS_I(d_inode(dentry));
804 
805 	_enter("{%llx:%llu},{n=%pd},%x",
806 	       vnode->fid.vid, vnode->fid.vnode, dentry,
807 	       attr->ia_valid);
808 
809 	if (!(attr->ia_valid & (ATTR_SIZE | ATTR_MODE | ATTR_UID | ATTR_GID |
810 				ATTR_MTIME))) {
811 		_leave(" = 0 [unsupported]");
812 		return 0;
813 	}
814 
815 	/* flush any dirty data outstanding on a regular file */
816 	if (S_ISREG(vnode->vfs_inode.i_mode))
817 		filemap_write_and_wait(vnode->vfs_inode.i_mapping);
818 
819 	op = afs_alloc_operation(((attr->ia_valid & ATTR_FILE) ?
820 				  afs_file_key(attr->ia_file) : NULL),
821 				 vnode->volume);
822 	if (IS_ERR(op))
823 		return PTR_ERR(op);
824 
825 	afs_op_set_vnode(op, 0, vnode);
826 	op->setattr.attr = attr;
827 
828 	if (attr->ia_valid & ATTR_SIZE)
829 		op->file[0].dv_delta = 1;
830 
831 	op->ops = &afs_setattr_operation;
832 	return afs_do_sync_operation(op);
833 }
834