1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* dir.c: AFS filesystem directory handling
3 *
4 * Copyright (C) 2002, 2018 Red Hat, Inc. All Rights Reserved.
5 * Written by David Howells (dhowells@redhat.com)
6 */
7
8 #include <linux/kernel.h>
9 #include <linux/fs.h>
10 #include <linux/namei.h>
11 #include <linux/pagemap.h>
12 #include <linux/swap.h>
13 #include <linux/ctype.h>
14 #include <linux/sched.h>
15 #include <linux/iversion.h>
16 #include <linux/iov_iter.h>
17 #include <linux/task_io_accounting_ops.h>
18 #include "internal.h"
19 #include "afs_fs.h"
20 #include "xdr_fs.h"
21
22 static struct dentry *afs_lookup(struct inode *dir, struct dentry *dentry,
23 unsigned int flags);
24 static int afs_dir_open(struct inode *inode, struct file *file);
25 static int afs_readdir(struct file *file, struct dir_context *ctx);
26 static int afs_d_revalidate(struct inode *dir, const struct qstr *name,
27 struct dentry *dentry, unsigned int flags);
28 static int afs_d_delete(const struct dentry *dentry);
29 static void afs_d_iput(struct dentry *dentry, struct inode *inode);
30 static bool afs_lookup_one_filldir(struct dir_context *ctx, const char *name, int nlen,
31 u64 ino, u32 uniquifier);
32 #define AFS_LOOKUP_ONE ((filldir_t)0x123UL)
33 static bool afs_lookup_filldir(struct dir_context *ctx, const char *name, int nlen,
34 u64 ino, u32 uniquifier);
35 #define AFS_LOOKUP ((filldir_t)0x137UL)
36 static int afs_create(struct mnt_idmap *idmap, struct inode *dir,
37 struct dentry *dentry, umode_t mode, bool excl);
38 static struct dentry *afs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
39 struct dentry *dentry, umode_t mode);
40 static int afs_rmdir(struct inode *dir, struct dentry *dentry);
41 static int afs_unlink(struct inode *dir, struct dentry *dentry);
42 static int afs_link(struct dentry *from, struct inode *dir,
43 struct dentry *dentry);
44 static int afs_symlink(struct mnt_idmap *idmap, struct inode *dir,
45 struct dentry *dentry, const char *content);
46 static int afs_rename(struct mnt_idmap *idmap, struct inode *old_dir,
47 struct dentry *old_dentry, struct inode *new_dir,
48 struct dentry *new_dentry, unsigned int flags);
49 static int afs_dir_writepages(struct address_space *mapping,
50 struct writeback_control *wbc);
51
52 const struct file_operations afs_dir_file_operations = {
53 .open = afs_dir_open,
54 .release = afs_release,
55 .iterate_shared = afs_readdir,
56 .lock = afs_lock,
57 .llseek = generic_file_llseek,
58 };
59
60 const struct inode_operations afs_dir_inode_operations = {
61 .create = afs_create,
62 .lookup = afs_lookup,
63 .link = afs_link,
64 .unlink = afs_unlink,
65 .symlink = afs_symlink,
66 .mkdir = afs_mkdir,
67 .rmdir = afs_rmdir,
68 .rename = afs_rename,
69 .permission = afs_permission,
70 .getattr = afs_getattr,
71 .setattr = afs_setattr,
72 };
73
74 const struct address_space_operations afs_dir_aops = {
75 .writepages = afs_dir_writepages,
76 };
77
78 const struct dentry_operations afs_fs_dentry_operations = {
79 .d_revalidate = afs_d_revalidate,
80 .d_delete = afs_d_delete,
81 .d_release = afs_d_release,
82 .d_automount = afs_d_automount,
83 .d_iput = afs_d_iput,
84 };
85
86 struct afs_lookup_one_cookie {
87 struct dir_context ctx;
88 struct qstr name;
89 bool found;
90 struct afs_fid fid;
91 };
92
93 struct afs_lookup_cookie {
94 struct dir_context ctx;
95 struct qstr name;
96 unsigned short nr_fids;
97 struct afs_fid fids[50];
98 };
99
afs_dir_unuse_cookie(struct afs_vnode * dvnode,int ret)100 static void afs_dir_unuse_cookie(struct afs_vnode *dvnode, int ret)
101 {
102 if (ret == 0) {
103 struct afs_vnode_cache_aux aux;
104 loff_t i_size = i_size_read(&dvnode->netfs.inode);
105
106 afs_set_cache_aux(dvnode, &aux);
107 fscache_unuse_cookie(afs_vnode_cache(dvnode), &aux, &i_size);
108 } else {
109 fscache_unuse_cookie(afs_vnode_cache(dvnode), NULL, NULL);
110 }
111 }
112
113 /*
114 * Iterate through a kmapped directory segment, dumping a summary of
115 * the contents.
116 */
afs_dir_dump_step(void * iter_base,size_t progress,size_t len,void * priv,void * priv2)117 static size_t afs_dir_dump_step(void *iter_base, size_t progress, size_t len,
118 void *priv, void *priv2)
119 {
120 do {
121 union afs_xdr_dir_block *block = iter_base;
122
123 pr_warn("[%05zx] %32phN\n", progress, block);
124 iter_base += AFS_DIR_BLOCK_SIZE;
125 progress += AFS_DIR_BLOCK_SIZE;
126 len -= AFS_DIR_BLOCK_SIZE;
127 } while (len > 0);
128
129 return len;
130 }
131
132 /*
133 * Dump the contents of a directory.
134 */
afs_dir_dump(struct afs_vnode * dvnode)135 static void afs_dir_dump(struct afs_vnode *dvnode)
136 {
137 struct iov_iter iter;
138 unsigned long long i_size = i_size_read(&dvnode->netfs.inode);
139
140 pr_warn("DIR %llx:%llx is=%llx\n",
141 dvnode->fid.vid, dvnode->fid.vnode, i_size);
142
143 iov_iter_folio_queue(&iter, ITER_SOURCE, dvnode->directory, 0, 0, i_size);
144 iterate_folioq(&iter, iov_iter_count(&iter), NULL, NULL,
145 afs_dir_dump_step);
146 }
147
148 /*
149 * check that a directory folio is valid
150 */
afs_dir_check_block(struct afs_vnode * dvnode,size_t progress,union afs_xdr_dir_block * block)151 static bool afs_dir_check_block(struct afs_vnode *dvnode, size_t progress,
152 union afs_xdr_dir_block *block)
153 {
154 if (block->hdr.magic != AFS_DIR_MAGIC) {
155 pr_warn("%s(%llx): [%zx] bad magic %04x\n",
156 __func__, dvnode->netfs.inode.i_ino,
157 progress, ntohs(block->hdr.magic));
158 trace_afs_dir_check_failed(dvnode, progress);
159 trace_afs_file_error(dvnode, -EIO, afs_file_error_dir_bad_magic);
160 return false;
161 }
162
163 /* Make sure each block is NUL terminated so we can reasonably
164 * use string functions on it. The filenames in the folio
165 * *should* be NUL-terminated anyway.
166 */
167 ((u8 *)block)[AFS_DIR_BLOCK_SIZE - 1] = 0;
168 afs_stat_v(dvnode, n_read_dir);
169 return true;
170 }
171
172 /*
173 * Iterate through a kmapped directory segment, checking the content.
174 */
afs_dir_check_step(void * iter_base,size_t progress,size_t len,void * priv,void * priv2)175 static size_t afs_dir_check_step(void *iter_base, size_t progress, size_t len,
176 void *priv, void *priv2)
177 {
178 struct afs_vnode *dvnode = priv;
179
180 if (WARN_ON_ONCE(progress % AFS_DIR_BLOCK_SIZE ||
181 len % AFS_DIR_BLOCK_SIZE))
182 return len;
183
184 do {
185 if (!afs_dir_check_block(dvnode, progress, iter_base))
186 break;
187 iter_base += AFS_DIR_BLOCK_SIZE;
188 len -= AFS_DIR_BLOCK_SIZE;
189 } while (len > 0);
190
191 return len;
192 }
193
194 /*
195 * Check all the blocks in a directory.
196 */
afs_dir_check(struct afs_vnode * dvnode)197 static int afs_dir_check(struct afs_vnode *dvnode)
198 {
199 struct iov_iter iter;
200 unsigned long long i_size = i_size_read(&dvnode->netfs.inode);
201 size_t checked = 0;
202
203 if (unlikely(!i_size))
204 return 0;
205
206 iov_iter_folio_queue(&iter, ITER_SOURCE, dvnode->directory, 0, 0, i_size);
207 checked = iterate_folioq(&iter, iov_iter_count(&iter), dvnode, NULL,
208 afs_dir_check_step);
209 if (checked != i_size) {
210 afs_dir_dump(dvnode);
211 return -EIO;
212 }
213 return 0;
214 }
215
216 /*
217 * open an AFS directory file
218 */
afs_dir_open(struct inode * inode,struct file * file)219 static int afs_dir_open(struct inode *inode, struct file *file)
220 {
221 _enter("{%llu}", inode->i_ino);
222
223 BUILD_BUG_ON(sizeof(union afs_xdr_dir_block) != 2048);
224 BUILD_BUG_ON(sizeof(union afs_xdr_dirent) != 32);
225
226 if (test_bit(AFS_VNODE_DELETED, &AFS_FS_I(inode)->flags))
227 return -ENOENT;
228
229 return afs_open(inode, file);
230 }
231
232 /*
233 * Read a file in a single download.
234 */
afs_do_read_single(struct afs_vnode * dvnode,struct file * file)235 static ssize_t afs_do_read_single(struct afs_vnode *dvnode, struct file *file)
236 {
237 struct iov_iter iter;
238 ssize_t ret;
239 loff_t i_size;
240
241 i_size = i_size_read(&dvnode->netfs.inode);
242 if (i_size < AFS_DIR_BLOCK_SIZE)
243 return afs_bad(dvnode, afs_file_error_dir_small);
244 if (i_size > AFS_DIR_BLOCK_SIZE * 1024) {
245 trace_afs_file_error(dvnode, -EFBIG, afs_file_error_dir_big);
246 return -EFBIG;
247 }
248
249 /* Expand the storage. TODO: Shrink the storage too. */
250 if (dvnode->directory_size < i_size) {
251 size_t cur_size = dvnode->directory_size;
252
253 ret = netfs_alloc_folioq_buffer(NULL,
254 &dvnode->directory, &cur_size, i_size,
255 mapping_gfp_mask(dvnode->netfs.inode.i_mapping));
256 dvnode->directory_size = cur_size;
257 if (ret < 0)
258 return ret;
259 }
260
261 iov_iter_folio_queue(&iter, ITER_DEST, dvnode->directory, 0, 0, dvnode->directory_size);
262
263 /* AFS requires us to perform the read of a directory synchronously as
264 * a single unit to avoid issues with the directory contents being
265 * changed between reads.
266 */
267 ret = netfs_read_single(&dvnode->netfs.inode, file, &iter);
268 if (ret >= 0) {
269 i_size = i_size_read(&dvnode->netfs.inode);
270 if (i_size > ret) {
271 /* The content has grown, so we need to expand the
272 * buffer.
273 */
274 ret = -ESTALE;
275 } else {
276 int ret2 = afs_dir_check(dvnode);
277
278 if (ret2 < 0)
279 ret = ret2;
280 }
281 }
282
283 return ret;
284 }
285
afs_read_single(struct afs_vnode * dvnode,struct file * file)286 static ssize_t afs_read_single(struct afs_vnode *dvnode, struct file *file)
287 {
288 ssize_t ret;
289
290 fscache_use_cookie(afs_vnode_cache(dvnode), false);
291 ret = afs_do_read_single(dvnode, file);
292 fscache_unuse_cookie(afs_vnode_cache(dvnode), NULL, NULL);
293 return ret;
294 }
295
296 /*
297 * Read the directory into a folio_queue buffer in one go, scrubbing the
298 * previous contents. We return -ESTALE if the caller needs to call us again.
299 */
afs_read_dir(struct afs_vnode * dvnode,struct file * file)300 ssize_t afs_read_dir(struct afs_vnode *dvnode, struct file *file)
301 __acquires(&dvnode->validate_lock)
302 {
303 ssize_t ret;
304 loff_t i_size;
305
306 i_size = i_size_read(&dvnode->netfs.inode);
307
308 ret = -ERESTARTSYS;
309 if (down_read_killable(&dvnode->validate_lock) < 0)
310 goto error;
311
312 /* We only need to reread the data if it became invalid - or if we
313 * haven't read it yet.
314 */
315 if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags) &&
316 test_bit(AFS_VNODE_DIR_READ, &dvnode->flags)) {
317 ret = i_size;
318 goto valid;
319 }
320
321 up_read(&dvnode->validate_lock);
322 if (down_write_killable(&dvnode->validate_lock) < 0)
323 goto error;
324
325 if (!test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
326 afs_invalidate_cache(dvnode, 0);
327
328 if (!test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags) ||
329 !test_bit(AFS_VNODE_DIR_READ, &dvnode->flags)) {
330 trace_afs_reload_dir(dvnode);
331 ret = afs_read_single(dvnode, file);
332 if (ret < 0)
333 goto error_unlock;
334
335 // TODO: Trim excess pages
336
337 set_bit(AFS_VNODE_DIR_VALID, &dvnode->flags);
338 set_bit(AFS_VNODE_DIR_READ, &dvnode->flags);
339 } else {
340 ret = i_size;
341 }
342
343 downgrade_write(&dvnode->validate_lock);
344 valid:
345 return ret;
346
347 error_unlock:
348 up_write(&dvnode->validate_lock);
349 error:
350 _leave(" = %zd", ret);
351 return ret;
352 }
353
354 /*
355 * deal with one block in an AFS directory
356 */
afs_dir_iterate_block(struct afs_vnode * dvnode,struct dir_context * ctx,union afs_xdr_dir_block * block)357 static int afs_dir_iterate_block(struct afs_vnode *dvnode,
358 struct dir_context *ctx,
359 union afs_xdr_dir_block *block)
360 {
361 union afs_xdr_dirent *dire;
362 unsigned int blknum, base, hdr, pos, next, nr_slots;
363 size_t nlen;
364 int tmp;
365
366 blknum = ctx->pos / AFS_DIR_BLOCK_SIZE;
367 base = blknum * AFS_DIR_SLOTS_PER_BLOCK;
368 hdr = (blknum == 0 ? AFS_DIR_RESV_BLOCKS0 : AFS_DIR_RESV_BLOCKS);
369 pos = DIV_ROUND_UP(ctx->pos, AFS_DIR_DIRENT_SIZE) - base;
370
371 _enter("%llx,%x", ctx->pos, blknum);
372
373 /* walk through the block, an entry at a time */
374 for (unsigned int slot = hdr; slot < AFS_DIR_SLOTS_PER_BLOCK; slot = next) {
375 /* skip entries marked unused in the bitmap */
376 if (!(block->hdr.bitmap[slot / 8] &
377 (1 << (slot % 8)))) {
378 _debug("ENT[%x]: Unused", base + slot);
379 next = slot + 1;
380 if (next >= pos)
381 ctx->pos = (base + next) * sizeof(union afs_xdr_dirent);
382 continue;
383 }
384
385 /* got a valid entry */
386 dire = &block->dirents[slot];
387 nlen = strnlen(dire->u.name,
388 (unsigned long)(block + 1) - (unsigned long)dire->u.name - 1);
389 if (nlen > AFSNAMEMAX - 1) {
390 _debug("ENT[%x]: Name too long (len %zx)",
391 base + slot, nlen);
392 return afs_bad(dvnode, afs_file_error_dir_name_too_long);
393 }
394
395 _debug("ENT[%x]: %s %zx \"%s\"",
396 base + slot, (slot < pos ? "skip" : "fill"),
397 nlen, dire->u.name);
398
399 nr_slots = afs_dir_calc_slots(nlen);
400 next = slot + nr_slots;
401 if (next > AFS_DIR_SLOTS_PER_BLOCK) {
402 _debug("ENT[%x]: extends beyond end dir block (len %zx)",
403 base + slot, nlen);
404 return afs_bad(dvnode, afs_file_error_dir_over_end);
405 }
406
407 /* Check that the name-extension dirents are all allocated */
408 for (tmp = 1; tmp < nr_slots; tmp++) {
409 unsigned int xslot = slot + tmp;
410
411 if (!(block->hdr.bitmap[xslot / 8] & (1 << (xslot % 8)))) {
412 _debug("ENT[%x]: Unmarked extension (%x/%x)",
413 base + slot, tmp, nr_slots);
414 return afs_bad(dvnode, afs_file_error_dir_unmarked_ext);
415 }
416 }
417
418 /* skip if starts before the current position */
419 if (slot < pos) {
420 if (next > pos)
421 ctx->pos = (base + next) * sizeof(union afs_xdr_dirent);
422 continue;
423 }
424
425 /* found the next entry */
426 if (ctx->actor == AFS_LOOKUP) {
427 if (!afs_lookup_filldir(ctx, dire->u.name, nlen,
428 ntohl(dire->u.vnode),
429 ntohl(dire->u.unique)))
430 return 0;
431 } else if (ctx->actor == AFS_LOOKUP_ONE) {
432 if (!afs_lookup_one_filldir(ctx, dire->u.name, nlen,
433 ntohl(dire->u.vnode),
434 ntohl(dire->u.unique)))
435 return 0;
436 } else if (!dir_emit(ctx, dire->u.name, nlen,
437 ntohl(dire->u.vnode), DT_UNKNOWN)) {
438 _leave(" = 0 [full]");
439 return 0;
440 }
441
442 ctx->pos = (base + next) * sizeof(union afs_xdr_dirent);
443 }
444
445 _leave(" = 1 [more]");
446 return 1;
447 }
448
449 struct afs_dir_iteration_ctx {
450 struct dir_context *dir_ctx;
451 int error;
452 };
453
454 /*
455 * Iterate through a kmapped directory segment.
456 */
afs_dir_iterate_step(void * iter_base,size_t progress,size_t len,void * priv,void * priv2)457 static size_t afs_dir_iterate_step(void *iter_base, size_t progress, size_t len,
458 void *priv, void *priv2)
459 {
460 struct afs_dir_iteration_ctx *ctx = priv2;
461 struct afs_vnode *dvnode = priv;
462 int ret;
463
464 if (WARN_ON_ONCE(progress % AFS_DIR_BLOCK_SIZE ||
465 len % AFS_DIR_BLOCK_SIZE)) {
466 pr_err("Mis-iteration prog=%zx len=%zx\n",
467 progress % AFS_DIR_BLOCK_SIZE,
468 len % AFS_DIR_BLOCK_SIZE);
469 return len;
470 }
471
472 do {
473 ret = afs_dir_iterate_block(dvnode, ctx->dir_ctx, iter_base);
474 if (ret != 1)
475 break;
476
477 ctx->dir_ctx->pos = round_up(ctx->dir_ctx->pos, AFS_DIR_BLOCK_SIZE);
478 iter_base += AFS_DIR_BLOCK_SIZE;
479 len -= AFS_DIR_BLOCK_SIZE;
480 } while (len > 0);
481
482 return len;
483 }
484
485 /*
486 * Iterate through the directory folios.
487 */
afs_dir_iterate_contents(struct inode * dir,struct dir_context * dir_ctx)488 static int afs_dir_iterate_contents(struct inode *dir, struct dir_context *dir_ctx)
489 {
490 struct afs_dir_iteration_ctx ctx = { .dir_ctx = dir_ctx };
491 struct afs_vnode *dvnode = AFS_FS_I(dir);
492 struct iov_iter iter;
493 unsigned long long i_size = i_size_read(dir);
494
495 /* Round the file position up to the next entry boundary */
496 dir_ctx->pos = round_up(dir_ctx->pos, sizeof(union afs_xdr_dirent));
497
498 if (i_size <= 0 || dir_ctx->pos >= i_size)
499 return 0;
500
501 iov_iter_folio_queue(&iter, ITER_SOURCE, dvnode->directory, 0, 0, i_size);
502 iov_iter_advance(&iter, round_down(dir_ctx->pos, AFS_DIR_BLOCK_SIZE));
503
504 iterate_folioq(&iter, iov_iter_count(&iter), dvnode, &ctx,
505 afs_dir_iterate_step);
506
507 if (ctx.error == -ESTALE)
508 afs_invalidate_dir(dvnode, afs_dir_invalid_iter_stale);
509 return ctx.error;
510 }
511
512 /*
513 * iterate through the data blob that lists the contents of an AFS directory
514 */
afs_dir_iterate(struct inode * dir,struct dir_context * ctx,struct file * file,afs_dataversion_t * _dir_version)515 static int afs_dir_iterate(struct inode *dir, struct dir_context *ctx,
516 struct file *file, afs_dataversion_t *_dir_version)
517 {
518 struct afs_vnode *dvnode = AFS_FS_I(dir);
519 int retry_limit = 100;
520 int ret;
521
522 _enter("{%llu},%llx,,", dir->i_ino, ctx->pos);
523
524 do {
525 if (--retry_limit < 0) {
526 pr_warn("afs_read_dir(): Too many retries\n");
527 ret = -ESTALE;
528 break;
529 }
530 ret = afs_read_dir(dvnode, file);
531 if (ret < 0) {
532 if (ret != -ESTALE)
533 break;
534 if (test_bit(AFS_VNODE_DELETED, &AFS_FS_I(dir)->flags)) {
535 ret = -ESTALE;
536 break;
537 }
538 continue;
539 }
540 *_dir_version = inode_peek_iversion_raw(dir);
541
542 ret = afs_dir_iterate_contents(dir, ctx);
543 up_read(&dvnode->validate_lock);
544 } while (ret == -ESTALE);
545
546 _leave(" = %d", ret);
547 return ret;
548 }
549
550 /*
551 * read an AFS directory
552 */
afs_readdir(struct file * file,struct dir_context * ctx)553 static int afs_readdir(struct file *file, struct dir_context *ctx)
554 {
555 afs_dataversion_t dir_version;
556
557 ctx->dt_flags_mask = UINT_MAX;
558 return afs_dir_iterate(file_inode(file), ctx, file, &dir_version);
559 }
560
561 /*
562 * Search the directory for a single name
563 * - if afs_dir_iterate_block() spots this function, it'll pass the FID
564 * uniquifier through dtype
565 */
afs_lookup_one_filldir(struct dir_context * ctx,const char * name,int nlen,u64 ino,u32 uniquifier)566 static bool afs_lookup_one_filldir(struct dir_context *ctx, const char *name,
567 int nlen, u64 ino, u32 uniquifier)
568 {
569 struct afs_lookup_one_cookie *cookie =
570 container_of(ctx, struct afs_lookup_one_cookie, ctx);
571
572 _enter("{%s,%u},%s,%u,,%llu,%u",
573 cookie->name.name, cookie->name.len, name, nlen,
574 (unsigned long long) ino, uniquifier);
575
576 /* insanity checks first */
577 BUILD_BUG_ON(sizeof(union afs_xdr_dir_block) != 2048);
578 BUILD_BUG_ON(sizeof(union afs_xdr_dirent) != 32);
579
580 if (cookie->name.len != nlen ||
581 memcmp(cookie->name.name, name, nlen) != 0) {
582 _leave(" = true [keep looking]");
583 return true;
584 }
585
586 cookie->fid.vnode = ino;
587 cookie->fid.unique = uniquifier;
588 cookie->found = 1;
589
590 _leave(" = false [found]");
591 return false;
592 }
593
594 /*
595 * Do a lookup of a single name in a directory
596 * - just returns the FID the dentry name maps to if found
597 */
afs_do_lookup_one(struct inode * dir,const struct qstr * name,struct afs_fid * fid,afs_dataversion_t * _dir_version)598 static int afs_do_lookup_one(struct inode *dir, const struct qstr *name,
599 struct afs_fid *fid,
600 afs_dataversion_t *_dir_version)
601 {
602 struct afs_super_info *as = dir->i_sb->s_fs_info;
603 struct afs_lookup_one_cookie cookie = {
604 .ctx.actor = AFS_LOOKUP_ONE,
605 .name = *name,
606 .fid.vid = as->volume->vid
607 };
608 int ret;
609
610 _enter("{%llu},{%.*s},", dir->i_ino, name->len, name->name);
611
612 /* search the directory */
613 ret = afs_dir_iterate(dir, &cookie.ctx, NULL, _dir_version);
614 if (ret < 0) {
615 _leave(" = %d [iter]", ret);
616 return ret;
617 }
618
619 if (!cookie.found) {
620 _leave(" = -ENOENT [not found]");
621 return -ENOENT;
622 }
623
624 *fid = cookie.fid;
625 _leave(" = 0 { vn=%llu u=%u }", fid->vnode, fid->unique);
626 return 0;
627 }
628
629 /*
630 * search the directory for a name
631 * - if afs_dir_iterate_block() spots this function, it'll pass the FID
632 * uniquifier through dtype
633 */
afs_lookup_filldir(struct dir_context * ctx,const char * name,int nlen,u64 ino,u32 uniquifier)634 static bool afs_lookup_filldir(struct dir_context *ctx, const char *name,
635 int nlen, u64 ino, u32 uniquifier)
636 {
637 struct afs_lookup_cookie *cookie =
638 container_of(ctx, struct afs_lookup_cookie, ctx);
639
640 _enter("{%s,%u},%s,%u,,%llu,%u",
641 cookie->name.name, cookie->name.len, name, nlen,
642 (unsigned long long) ino, uniquifier);
643
644 /* insanity checks first */
645 BUILD_BUG_ON(sizeof(union afs_xdr_dir_block) != 2048);
646 BUILD_BUG_ON(sizeof(union afs_xdr_dirent) != 32);
647
648 if (cookie->nr_fids < 50) {
649 cookie->fids[cookie->nr_fids].vnode = ino;
650 cookie->fids[cookie->nr_fids].unique = uniquifier;
651 cookie->nr_fids++;
652 }
653
654 return cookie->nr_fids < 50;
655 }
656
657 /*
658 * Deal with the result of a successful lookup operation. Turn all the files
659 * into inodes and save the first one - which is the one we actually want.
660 */
afs_do_lookup_success(struct afs_operation * op)661 static void afs_do_lookup_success(struct afs_operation *op)
662 {
663 struct afs_vnode_param *vp;
664 struct afs_vnode *vnode;
665 struct inode *inode;
666 u32 abort_code;
667 int i;
668
669 _enter("");
670
671 for (i = 0; i < op->nr_files; i++) {
672 switch (i) {
673 case 0:
674 vp = &op->file[0];
675 abort_code = vp->scb.status.abort_code;
676 if (abort_code != 0) {
677 op->call_abort_code = abort_code;
678 afs_op_set_error(op, afs_abort_to_error(abort_code));
679 op->cumul_error.abort_code = abort_code;
680 }
681 break;
682
683 case 1:
684 vp = &op->file[1];
685 break;
686
687 default:
688 vp = &op->more_files[i - 2];
689 break;
690 }
691
692 if (vp->scb.status.abort_code)
693 trace_afs_bulkstat_error(op, &vp->fid, i, vp->scb.status.abort_code);
694 if (!vp->scb.have_status && !vp->scb.have_error)
695 continue;
696
697 _debug("do [%u]", i);
698 if (vp->vnode) {
699 if (!test_bit(AFS_VNODE_UNSET, &vp->vnode->flags))
700 afs_vnode_commit_status(op, vp);
701 } else if (vp->scb.status.abort_code == 0) {
702 inode = afs_iget(op, vp);
703 if (!IS_ERR(inode)) {
704 vnode = AFS_FS_I(inode);
705 afs_cache_permit(vnode, op->key,
706 0 /* Assume vnode->cb_break is 0 */ +
707 op->cb_v_break,
708 &vp->scb);
709 vp->vnode = vnode;
710 vp->put_vnode = true;
711 }
712 } else {
713 _debug("- abort %d %llx:%llx.%x",
714 vp->scb.status.abort_code,
715 vp->fid.vid, vp->fid.vnode, vp->fid.unique);
716 }
717 }
718
719 _leave("");
720 }
721
722 static const struct afs_operation_ops afs_inline_bulk_status_operation = {
723 .issue_afs_rpc = afs_fs_inline_bulk_status,
724 .issue_yfs_rpc = yfs_fs_inline_bulk_status,
725 .success = afs_do_lookup_success,
726 };
727
728 static const struct afs_operation_ops afs_lookup_fetch_status_operation = {
729 .issue_afs_rpc = afs_fs_fetch_status,
730 .issue_yfs_rpc = yfs_fs_fetch_status,
731 .success = afs_do_lookup_success,
732 .aborted = afs_check_for_remote_deletion,
733 };
734
735 /*
736 * See if we know that the server we expect to use doesn't support
737 * FS.InlineBulkStatus.
738 */
afs_server_supports_ibulk(struct afs_vnode * dvnode)739 static bool afs_server_supports_ibulk(struct afs_vnode *dvnode)
740 {
741 struct afs_server_list *slist;
742 struct afs_volume *volume = dvnode->volume;
743 struct afs_server *server;
744 bool ret = true;
745 int i;
746
747 if (!test_bit(AFS_VOLUME_MAYBE_NO_IBULK, &volume->flags))
748 return true;
749
750 rcu_read_lock();
751 slist = rcu_dereference(volume->servers);
752
753 for (i = 0; i < slist->nr_servers; i++) {
754 server = slist->servers[i].server;
755 if (server == dvnode->cb_server) {
756 if (test_bit(AFS_SERVER_FL_NO_IBULK, &server->flags))
757 ret = false;
758 break;
759 }
760 }
761
762 rcu_read_unlock();
763 return ret;
764 }
765
766 /*
767 * Do a lookup in a directory. We make use of bulk lookup to query a slew of
768 * files in one go and create inodes for them. The inode of the file we were
769 * asked for is returned.
770 */
afs_do_lookup(struct inode * dir,struct dentry * dentry)771 static struct inode *afs_do_lookup(struct inode *dir, struct dentry *dentry)
772 {
773 struct afs_lookup_cookie *cookie;
774 struct afs_vnode_param *vp;
775 struct afs_operation *op;
776 struct afs_vnode *dvnode = AFS_FS_I(dir), *vnode;
777 struct inode *inode = NULL, *ti;
778 afs_dataversion_t data_version = READ_ONCE(dvnode->status.data_version);
779 bool supports_ibulk, isnew;
780 long ret;
781 int i;
782
783 _enter("{%llu},%p{%pd},", dir->i_ino, dentry, dentry);
784
785 cookie = kzalloc_obj(struct afs_lookup_cookie);
786 if (!cookie)
787 return ERR_PTR(-ENOMEM);
788
789 for (i = 0; i < ARRAY_SIZE(cookie->fids); i++)
790 cookie->fids[i].vid = dvnode->fid.vid;
791 cookie->ctx.actor = AFS_LOOKUP;
792 cookie->name = dentry->d_name;
793 cookie->nr_fids = 2; /* slot 1 is saved for the fid we actually want
794 * and slot 0 for the directory */
795
796 /* Search the directory for the named entry using the hash table... */
797 ret = afs_dir_search(dvnode, &dentry->d_name, &cookie->fids[1], &data_version);
798 if (ret < 0)
799 goto out;
800
801 supports_ibulk = afs_server_supports_ibulk(dvnode);
802 if (supports_ibulk) {
803 /* ...then scan linearly from that point for entries to lookup-ahead. */
804 cookie->ctx.pos = (ret + 1) * AFS_DIR_DIRENT_SIZE;
805 afs_dir_iterate(dir, &cookie->ctx, NULL, &data_version);
806 }
807
808 dentry->d_fsdata = (void *)(unsigned long)data_version;
809
810 /* Check to see if we already have an inode for the primary fid. */
811 inode = ilookup5(dir->i_sb, cookie->fids[1].vnode,
812 afs_ilookup5_test_by_fid, &cookie->fids[1]);
813 if (inode)
814 goto out; /* We do */
815
816 /* Okay, we didn't find it. We need to query the server - and whilst
817 * we're doing that, we're going to attempt to look up a bunch of other
818 * vnodes also.
819 */
820 op = afs_alloc_operation(NULL, dvnode->volume);
821 if (IS_ERR(op)) {
822 ret = PTR_ERR(op);
823 goto out;
824 }
825
826 afs_op_set_vnode(op, 0, dvnode);
827 afs_op_set_fid(op, 1, &cookie->fids[1]);
828
829 op->nr_files = cookie->nr_fids;
830 _debug("nr_files %u", op->nr_files);
831
832 /* Need space for examining all the selected files */
833 if (op->nr_files > 2) {
834 op->more_files = kvzalloc_objs(struct afs_vnode_param,
835 op->nr_files - 2);
836 if (!op->more_files) {
837 afs_op_nomem(op);
838 goto out_op;
839 }
840
841 for (i = 2; i < op->nr_files; i++) {
842 vp = &op->more_files[i - 2];
843 vp->fid = cookie->fids[i];
844
845 /* Find any inodes that already exist and get their
846 * callback counters.
847 */
848 ti = ilookup5_nowait(dir->i_sb, vp->fid.vnode,
849 afs_ilookup5_test_by_fid, &vp->fid, &isnew);
850 if (!IS_ERR_OR_NULL(ti)) {
851 vnode = AFS_FS_I(ti);
852 vp->dv_before = vnode->status.data_version;
853 vp->cb_break_before = afs_calc_vnode_cb_break(vnode);
854 vp->vnode = vnode;
855 vp->put_vnode = true;
856 vp->speculative = true; /* vnode not locked */
857 }
858 }
859 }
860
861 /* Try FS.InlineBulkStatus first. Abort codes for the individual
862 * lookups contained therein are stored in the reply without aborting
863 * the whole operation.
864 */
865 afs_op_set_error(op, -ENOTSUPP);
866 if (supports_ibulk) {
867 op->ops = &afs_inline_bulk_status_operation;
868 afs_begin_vnode_operation(op);
869 afs_wait_for_operation(op);
870 }
871
872 if (afs_op_error(op) == -ENOTSUPP) {
873 /* We could try FS.BulkStatus next, but this aborts the entire
874 * op if any of the lookups fails - so, for the moment, revert
875 * to FS.FetchStatus for op->file[1].
876 */
877 op->fetch_status.which = 1;
878 op->ops = &afs_lookup_fetch_status_operation;
879 afs_begin_vnode_operation(op);
880 afs_wait_for_operation(op);
881 }
882
883 out_op:
884 if (!afs_op_error(op)) {
885 if (op->file[1].scb.status.abort_code) {
886 afs_op_accumulate_error(op, -ECONNABORTED,
887 op->file[1].scb.status.abort_code);
888 } else {
889 inode = &op->file[1].vnode->netfs.inode;
890 op->file[1].vnode = NULL;
891 }
892 }
893
894 if (op->file[0].scb.have_status)
895 dentry->d_fsdata = (void *)(unsigned long)op->file[0].scb.status.data_version;
896 else
897 dentry->d_fsdata = (void *)(unsigned long)op->file[0].dv_before;
898 ret = afs_put_operation(op);
899 out:
900 kfree(cookie);
901 _leave("");
902 return inode ?: ERR_PTR(ret);
903 }
904
905 /*
906 * Look up an entry in a directory with @sys substitution.
907 */
afs_lookup_atsys(struct inode * dir,struct dentry * dentry)908 static struct dentry *afs_lookup_atsys(struct inode *dir, struct dentry *dentry)
909 {
910 struct afs_sysnames *subs;
911 struct afs_net *net = afs_i2net(dir);
912 struct dentry *ret;
913 char *buf, *p, *name;
914 int len, i;
915
916 _enter("");
917
918 ret = ERR_PTR(-ENOMEM);
919 p = buf = kmalloc(AFSNAMEMAX, GFP_KERNEL);
920 if (!buf)
921 goto out_p;
922 if (dentry->d_name.len > 4) {
923 memcpy(p, dentry->d_name.name, dentry->d_name.len - 4);
924 p += dentry->d_name.len - 4;
925 }
926
927 /* There is an ordered list of substitutes that we have to try. */
928 read_lock(&net->sysnames_lock);
929 subs = net->sysnames;
930 refcount_inc(&subs->usage);
931 read_unlock(&net->sysnames_lock);
932
933 for (i = 0; i < subs->nr; i++) {
934 name = subs->subs[i];
935 len = dentry->d_name.len - 4 + strlen(name);
936 if (len >= AFSNAMEMAX) {
937 ret = ERR_PTR(-ENAMETOOLONG);
938 goto out_s;
939 }
940
941 strcpy(p, name);
942 ret = lookup_noperm(&QSTR(buf), dentry->d_parent);
943 if (IS_ERR(ret) || d_is_positive(ret))
944 goto out_s;
945 dput(ret);
946 }
947
948 /* We don't want to d_add() the @sys dentry here as we don't want to
949 * the cached dentry to hide changes to the sysnames list.
950 */
951 ret = NULL;
952 out_s:
953 afs_put_sysnames(subs);
954 kfree(buf);
955 out_p:
956 return ret;
957 }
958
959 /*
960 * look up an entry in a directory
961 */
afs_lookup(struct inode * dir,struct dentry * dentry,unsigned int flags)962 static struct dentry *afs_lookup(struct inode *dir, struct dentry *dentry,
963 unsigned int flags)
964 {
965 struct afs_vnode *dvnode = AFS_FS_I(dir);
966 struct afs_fid fid = {};
967 struct inode *inode;
968 struct dentry *d;
969 int ret;
970
971 _enter("{%llx:%llu},%p{%pd},",
972 dvnode->fid.vid, dvnode->fid.vnode, dentry, dentry);
973
974 ASSERTCMP(d_inode(dentry), ==, NULL);
975
976 if (dentry->d_name.len >= AFSNAMEMAX) {
977 _leave(" = -ENAMETOOLONG");
978 return ERR_PTR(-ENAMETOOLONG);
979 }
980
981 if (test_bit(AFS_VNODE_DELETED, &dvnode->flags)) {
982 _leave(" = -ESTALE");
983 return ERR_PTR(-ESTALE);
984 }
985
986 ret = afs_validate(dvnode, NULL);
987 if (ret < 0) {
988 afs_dir_unuse_cookie(dvnode, ret);
989 _leave(" = %d [val]", ret);
990 return ERR_PTR(ret);
991 }
992
993 if (dentry->d_name.len >= 4 &&
994 dentry->d_name.name[dentry->d_name.len - 4] == '@' &&
995 dentry->d_name.name[dentry->d_name.len - 3] == 's' &&
996 dentry->d_name.name[dentry->d_name.len - 2] == 'y' &&
997 dentry->d_name.name[dentry->d_name.len - 1] == 's')
998 return afs_lookup_atsys(dir, dentry);
999
1000 afs_stat_v(dvnode, n_lookup);
1001 inode = afs_do_lookup(dir, dentry);
1002 if (inode == ERR_PTR(-ENOENT))
1003 inode = NULL;
1004 else if (!IS_ERR_OR_NULL(inode))
1005 fid = AFS_FS_I(inode)->fid;
1006
1007 _debug("splice %p", dentry->d_inode);
1008 d = d_splice_alias(inode, dentry);
1009 if (!IS_ERR_OR_NULL(d)) {
1010 d->d_fsdata = dentry->d_fsdata;
1011 trace_afs_lookup(dvnode, &d->d_name, &fid);
1012 } else {
1013 trace_afs_lookup(dvnode, &dentry->d_name, &fid);
1014 }
1015 _leave("");
1016 return d;
1017 }
1018
1019 /*
1020 * Check the validity of a dentry under RCU conditions.
1021 */
afs_d_revalidate_rcu(struct afs_vnode * dvnode,struct dentry * dentry)1022 static int afs_d_revalidate_rcu(struct afs_vnode *dvnode, struct dentry *dentry)
1023 {
1024 long dir_version, de_version;
1025
1026 _enter("%p", dentry);
1027
1028 if (test_bit(AFS_VNODE_DELETED, &dvnode->flags))
1029 return -ECHILD;
1030
1031 if (!afs_check_validity(dvnode))
1032 return -ECHILD;
1033
1034 /* We only need to invalidate a dentry if the server's copy changed
1035 * behind our back. If we made the change, it's no problem. Note that
1036 * on a 32-bit system, we only have 32 bits in the dentry to store the
1037 * version.
1038 */
1039 dir_version = (long)READ_ONCE(dvnode->status.data_version);
1040 de_version = (long)READ_ONCE(dentry->d_fsdata);
1041 if (de_version != dir_version) {
1042 dir_version = (long)READ_ONCE(dvnode->invalid_before);
1043 if (de_version - dir_version < 0)
1044 return -ECHILD;
1045 }
1046
1047 return 1; /* Still valid */
1048 }
1049
1050 /*
1051 * check that a dentry lookup hit has found a valid entry
1052 * - NOTE! the hit can be a negative hit too, so we can't assume we have an
1053 * inode
1054 */
afs_d_revalidate(struct inode * parent_dir,const struct qstr * name,struct dentry * dentry,unsigned int flags)1055 static int afs_d_revalidate(struct inode *parent_dir, const struct qstr *name,
1056 struct dentry *dentry, unsigned int flags)
1057 {
1058 struct afs_vnode *vnode, *dir = AFS_FS_I(parent_dir);
1059 struct afs_fid fid;
1060 struct inode *inode;
1061 struct key *key;
1062 afs_dataversion_t dir_version, invalid_before;
1063 long de_version;
1064 int ret;
1065
1066 if (flags & LOOKUP_RCU)
1067 return afs_d_revalidate_rcu(dir, dentry);
1068
1069 if (d_really_is_positive(dentry)) {
1070 vnode = AFS_FS_I(d_inode(dentry));
1071 _enter("{v={%llx:%llu} n=%pd fl=%lx},",
1072 vnode->fid.vid, vnode->fid.vnode, dentry,
1073 vnode->flags);
1074 } else {
1075 _enter("{neg n=%pd}", dentry);
1076 }
1077
1078 key = afs_request_key(AFS_FS_S(dentry->d_sb)->volume->cell);
1079 if (IS_ERR(key))
1080 key = NULL;
1081
1082 /* validate the parent directory */
1083 ret = afs_validate(dir, key);
1084 if (ret == -ERESTARTSYS) {
1085 key_put(key);
1086 return ret;
1087 }
1088
1089 if (test_bit(AFS_VNODE_DELETED, &dir->flags)) {
1090 _debug("%pd: parent dir deleted", dentry);
1091 goto not_found;
1092 }
1093
1094 /* We only need to invalidate a dentry if the server's copy changed
1095 * behind our back. If we made the change, it's no problem. Note that
1096 * on a 32-bit system, we only have 32 bits in the dentry to store the
1097 * version.
1098 */
1099 dir_version = dir->status.data_version;
1100 de_version = (long)dentry->d_fsdata;
1101 if (de_version == (long)dir_version)
1102 goto out_valid_noupdate;
1103
1104 invalid_before = dir->invalid_before;
1105 if (de_version - (long)invalid_before >= 0)
1106 goto out_valid;
1107
1108 _debug("dir modified");
1109 afs_stat_v(dir, n_reval);
1110
1111 /* search the directory for this vnode */
1112 ret = afs_do_lookup_one(&dir->netfs.inode, name, &fid, &dir_version);
1113 switch (ret) {
1114 case 0:
1115 /* the filename maps to something */
1116 if (d_really_is_negative(dentry))
1117 goto not_found;
1118 inode = d_inode(dentry);
1119 if (is_bad_inode(inode)) {
1120 printk("kAFS: afs_d_revalidate: %pd2 has bad inode\n",
1121 dentry);
1122 goto not_found;
1123 }
1124
1125 vnode = AFS_FS_I(inode);
1126
1127 /* if the vnode ID has changed, then the dirent points to a
1128 * different file */
1129 if (fid.vnode != vnode->fid.vnode) {
1130 _debug("%pd: dirent changed [%llu != %llu]",
1131 dentry, fid.vnode,
1132 vnode->fid.vnode);
1133 goto not_found;
1134 }
1135
1136 /* if the vnode ID uniqifier has changed, then the file has
1137 * been deleted and replaced, and the original vnode ID has
1138 * been reused */
1139 if (fid.unique != vnode->fid.unique) {
1140 _debug("%pd: file deleted (uq %u -> %u I:%u)",
1141 dentry, fid.unique,
1142 vnode->fid.unique,
1143 vnode->netfs.inode.i_generation);
1144 goto not_found;
1145 }
1146 goto out_valid;
1147
1148 case -ENOENT:
1149 /* the filename is unknown */
1150 _debug("%pd: dirent not found", dentry);
1151 if (d_really_is_positive(dentry))
1152 goto not_found;
1153 goto out_valid;
1154
1155 default:
1156 _debug("failed to iterate parent %pd2: %d", dentry, ret);
1157 goto not_found;
1158 }
1159
1160 out_valid:
1161 dentry->d_fsdata = (void *)(unsigned long)dir_version;
1162 out_valid_noupdate:
1163 key_put(key);
1164 _leave(" = 1 [valid]");
1165 return 1;
1166
1167 not_found:
1168 _debug("dropping dentry %pd2", dentry);
1169 key_put(key);
1170
1171 _leave(" = 0 [bad]");
1172 return 0;
1173 }
1174
1175 /*
1176 * allow the VFS to enquire as to whether a dentry should be unhashed (mustn't
1177 * sleep)
1178 * - called from dput() when d_count is going to 0.
1179 * - return 1 to request dentry be unhashed, 0 otherwise
1180 */
afs_d_delete(const struct dentry * dentry)1181 static int afs_d_delete(const struct dentry *dentry)
1182 {
1183 _enter("%pd", dentry);
1184
1185 if (dentry->d_flags & DCACHE_NFSFS_RENAMED)
1186 goto zap;
1187
1188 if (d_really_is_positive(dentry) &&
1189 (test_bit(AFS_VNODE_DELETED, &AFS_FS_I(d_inode(dentry))->flags) ||
1190 test_bit(AFS_VNODE_PSEUDODIR, &AFS_FS_I(d_inode(dentry))->flags)))
1191 goto zap;
1192
1193 _leave(" = 0 [keep]");
1194 return 0;
1195
1196 zap:
1197 _leave(" = 1 [zap]");
1198 return 1;
1199 }
1200
1201 /*
1202 * Clean up sillyrename files on dentry removal.
1203 */
afs_d_iput(struct dentry * dentry,struct inode * inode)1204 static void afs_d_iput(struct dentry *dentry, struct inode *inode)
1205 {
1206 if (dentry->d_flags & DCACHE_NFSFS_RENAMED)
1207 afs_silly_iput(dentry, inode);
1208 iput(inode);
1209 }
1210
1211 /*
1212 * handle dentry release
1213 */
afs_d_release(struct dentry * dentry)1214 void afs_d_release(struct dentry *dentry)
1215 {
1216 _enter("%pd", dentry);
1217 }
1218
afs_check_for_remote_deletion(struct afs_operation * op)1219 void afs_check_for_remote_deletion(struct afs_operation *op)
1220 {
1221 struct afs_vnode *vnode = op->file[0].vnode;
1222
1223 switch (afs_op_abort_code(op)) {
1224 case VNOVNODE:
1225 set_bit(AFS_VNODE_DELETED, &vnode->flags);
1226 clear_nlink(&vnode->netfs.inode);
1227 afs_break_callback(vnode, afs_cb_break_for_deleted);
1228 }
1229 }
1230
1231 /*
1232 * Create a new inode for create/mkdir/symlink
1233 */
afs_vnode_new_inode(struct afs_operation * op)1234 static void afs_vnode_new_inode(struct afs_operation *op)
1235 {
1236 struct afs_vnode_param *dvp = &op->file[0];
1237 struct afs_vnode_param *vp = &op->file[1];
1238 struct afs_vnode *vnode;
1239 struct inode *inode;
1240
1241 _enter("");
1242
1243 ASSERTCMP(afs_op_error(op), ==, 0);
1244
1245 inode = afs_iget(op, vp);
1246 if (IS_ERR(inode)) {
1247 /* ENOMEM or EINTR at a really inconvenient time - just abandon
1248 * the new directory on the server.
1249 */
1250 afs_op_accumulate_error(op, PTR_ERR(inode), 0);
1251 return;
1252 }
1253
1254 vnode = AFS_FS_I(inode);
1255 set_bit(AFS_VNODE_NEW_CONTENT, &vnode->flags);
1256 if (S_ISDIR(inode->i_mode))
1257 afs_mkdir_init_dir(vnode, dvp->vnode);
1258 else if (S_ISLNK(inode->i_mode))
1259 afs_init_new_symlink(vnode, op);
1260 if (!afs_op_error(op))
1261 afs_cache_permit(vnode, op->key, vnode->cb_break, &vp->scb);
1262 d_instantiate(op->dentry, inode);
1263 }
1264
afs_create_success(struct afs_operation * op)1265 static void afs_create_success(struct afs_operation *op)
1266 {
1267 _enter("op=%08x", op->debug_id);
1268 op->ctime = op->file[0].scb.status.mtime_client;
1269 afs_vnode_commit_status(op, &op->file[0]);
1270 afs_update_dentry_version(op, &op->file[0], op->dentry);
1271 afs_vnode_new_inode(op);
1272 }
1273
afs_create_edit_dir(struct afs_operation * op)1274 static void afs_create_edit_dir(struct afs_operation *op)
1275 {
1276 struct netfs_cache_resources cres = {};
1277 struct afs_vnode_param *dvp = &op->file[0];
1278 struct afs_vnode_param *vp = &op->file[1];
1279 struct afs_vnode *dvnode = dvp->vnode;
1280
1281 _enter("op=%08x", op->debug_id);
1282
1283 fscache_begin_write_operation(&cres, afs_vnode_cache(dvnode));
1284 down_write(&dvnode->validate_lock);
1285 if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags) &&
1286 dvnode->status.data_version == dvp->dv_before + dvp->dv_delta)
1287 afs_edit_dir_add(dvnode, &op->dentry->d_name, &vp->fid,
1288 op->create.reason);
1289 up_write(&dvnode->validate_lock);
1290 fscache_end_operation(&cres);
1291 }
1292
afs_create_put(struct afs_operation * op)1293 static void afs_create_put(struct afs_operation *op)
1294 {
1295 _enter("op=%08x", op->debug_id);
1296
1297 if (afs_op_error(op))
1298 d_drop(op->dentry);
1299 }
1300
1301 static const struct afs_operation_ops afs_mkdir_operation = {
1302 .issue_afs_rpc = afs_fs_make_dir,
1303 .issue_yfs_rpc = yfs_fs_make_dir,
1304 .success = afs_create_success,
1305 .aborted = afs_check_for_remote_deletion,
1306 .edit_dir = afs_create_edit_dir,
1307 .put = afs_create_put,
1308 };
1309
1310 /*
1311 * create a directory on an AFS filesystem
1312 */
afs_mkdir(struct mnt_idmap * idmap,struct inode * dir,struct dentry * dentry,umode_t mode)1313 static struct dentry *afs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
1314 struct dentry *dentry, umode_t mode)
1315 {
1316 struct afs_operation *op;
1317 struct afs_vnode *dvnode = AFS_FS_I(dir);
1318 int ret;
1319
1320 _enter("{%llx:%llu},{%pd},%ho",
1321 dvnode->fid.vid, dvnode->fid.vnode, dentry, mode);
1322
1323 op = afs_alloc_operation(NULL, dvnode->volume);
1324 if (IS_ERR(op)) {
1325 d_drop(dentry);
1326 return ERR_CAST(op);
1327 }
1328
1329 fscache_use_cookie(afs_vnode_cache(dvnode), true);
1330
1331 afs_op_set_vnode(op, 0, dvnode);
1332 op->file[0].dv_delta = 1;
1333 op->file[0].modification = true;
1334 op->file[0].update_ctime = true;
1335 op->dentry = dentry;
1336 op->create.mode = S_IFDIR | mode;
1337 op->create.reason = afs_edit_dir_for_mkdir;
1338 op->mtime = current_time(dir);
1339 op->ops = &afs_mkdir_operation;
1340 ret = afs_do_sync_operation(op);
1341 afs_dir_unuse_cookie(dvnode, ret);
1342 return ERR_PTR(ret);
1343 }
1344
1345 /*
1346 * Remove a subdir from a directory.
1347 */
afs_dir_remove_subdir(struct dentry * dentry)1348 static void afs_dir_remove_subdir(struct dentry *dentry)
1349 {
1350 if (d_really_is_positive(dentry)) {
1351 struct afs_vnode *vnode = AFS_FS_I(d_inode(dentry));
1352
1353 clear_nlink(&vnode->netfs.inode);
1354 set_bit(AFS_VNODE_DELETED, &vnode->flags);
1355 afs_clear_cb_promise(vnode, afs_cb_promise_clear_rmdir);
1356 afs_invalidate_dir(vnode, afs_dir_invalid_subdir_removed);
1357 }
1358 }
1359
afs_rmdir_success(struct afs_operation * op)1360 static void afs_rmdir_success(struct afs_operation *op)
1361 {
1362 _enter("op=%08x", op->debug_id);
1363 op->ctime = op->file[0].scb.status.mtime_client;
1364 afs_vnode_commit_status(op, &op->file[0]);
1365 afs_update_dentry_version(op, &op->file[0], op->dentry);
1366 }
1367
afs_rmdir_edit_dir(struct afs_operation * op)1368 static void afs_rmdir_edit_dir(struct afs_operation *op)
1369 {
1370 struct netfs_cache_resources cres = {};
1371 struct afs_vnode_param *dvp = &op->file[0];
1372 struct afs_vnode *dvnode = dvp->vnode;
1373
1374 _enter("op=%08x", op->debug_id);
1375 afs_dir_remove_subdir(op->dentry);
1376
1377 fscache_begin_write_operation(&cres, afs_vnode_cache(dvnode));
1378 down_write(&dvnode->validate_lock);
1379 if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags) &&
1380 dvnode->status.data_version == dvp->dv_before + dvp->dv_delta)
1381 afs_edit_dir_remove(dvnode, &op->dentry->d_name,
1382 afs_edit_dir_for_rmdir);
1383 up_write(&dvnode->validate_lock);
1384 fscache_end_operation(&cres);
1385 }
1386
afs_rmdir_put(struct afs_operation * op)1387 static void afs_rmdir_put(struct afs_operation *op)
1388 {
1389 _enter("op=%08x", op->debug_id);
1390 if (op->file[1].vnode)
1391 up_write(&op->file[1].vnode->rmdir_lock);
1392 }
1393
1394 static const struct afs_operation_ops afs_rmdir_operation = {
1395 .issue_afs_rpc = afs_fs_remove_dir,
1396 .issue_yfs_rpc = yfs_fs_remove_dir,
1397 .success = afs_rmdir_success,
1398 .aborted = afs_check_for_remote_deletion,
1399 .edit_dir = afs_rmdir_edit_dir,
1400 .put = afs_rmdir_put,
1401 };
1402
1403 /*
1404 * remove a directory from an AFS filesystem
1405 */
afs_rmdir(struct inode * dir,struct dentry * dentry)1406 static int afs_rmdir(struct inode *dir, struct dentry *dentry)
1407 {
1408 struct afs_operation *op;
1409 struct afs_vnode *dvnode = AFS_FS_I(dir), *vnode = NULL;
1410 int ret;
1411
1412 _enter("{%llx:%llu},{%pd}",
1413 dvnode->fid.vid, dvnode->fid.vnode, dentry);
1414
1415 op = afs_alloc_operation(NULL, dvnode->volume);
1416 if (IS_ERR(op))
1417 return PTR_ERR(op);
1418
1419 fscache_use_cookie(afs_vnode_cache(dvnode), true);
1420
1421 afs_op_set_vnode(op, 0, dvnode);
1422 op->file[0].dv_delta = 1;
1423 op->file[0].modification = true;
1424 op->file[0].update_ctime = true;
1425
1426 op->dentry = dentry;
1427 op->ops = &afs_rmdir_operation;
1428
1429 /* Try to make sure we have a callback promise on the victim. */
1430 if (d_really_is_positive(dentry)) {
1431 vnode = AFS_FS_I(d_inode(dentry));
1432 ret = afs_validate(vnode, op->key);
1433 if (ret < 0)
1434 goto error;
1435 }
1436
1437 if (vnode) {
1438 ret = down_write_killable(&vnode->rmdir_lock);
1439 if (ret < 0)
1440 goto error;
1441 op->file[1].vnode = vnode;
1442 }
1443
1444 ret = afs_do_sync_operation(op);
1445
1446 /* Not all systems that can host afs servers have ENOTEMPTY. */
1447 if (ret == -EEXIST)
1448 ret = -ENOTEMPTY;
1449 out:
1450 afs_dir_unuse_cookie(dvnode, ret);
1451 return ret;
1452
1453 error:
1454 ret = afs_put_operation(op);
1455 goto out;
1456 }
1457
1458 /*
1459 * Remove a link to a file or symlink from a directory.
1460 *
1461 * If the file was not deleted due to excess hard links, the fileserver will
1462 * break the callback promise on the file - if it had one - before it returns
1463 * to us, and if it was deleted, it won't
1464 *
1465 * However, if we didn't have a callback promise outstanding, or it was
1466 * outstanding on a different server, then it won't break it either...
1467 */
afs_dir_remove_link(struct afs_operation * op)1468 static void afs_dir_remove_link(struct afs_operation *op)
1469 {
1470 struct afs_vnode *dvnode = op->file[0].vnode;
1471 struct afs_vnode *vnode = op->file[1].vnode;
1472 struct dentry *dentry = op->dentry;
1473 int ret;
1474
1475 if (afs_op_error(op) ||
1476 (op->file[1].scb.have_status && op->file[1].scb.have_error))
1477 return;
1478 if (d_really_is_positive(dentry))
1479 return;
1480
1481 if (test_bit(AFS_VNODE_DELETED, &vnode->flags)) {
1482 /* Already done */
1483 } else if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags)) {
1484 write_seqlock(&vnode->cb_lock);
1485 drop_nlink(&vnode->netfs.inode);
1486 if (vnode->netfs.inode.i_nlink == 0) {
1487 set_bit(AFS_VNODE_DELETED, &vnode->flags);
1488 __afs_break_callback(vnode, afs_cb_break_for_unlink);
1489 }
1490 write_sequnlock(&vnode->cb_lock);
1491 } else {
1492 afs_break_callback(vnode, afs_cb_break_for_unlink);
1493
1494 if (test_bit(AFS_VNODE_DELETED, &vnode->flags))
1495 _debug("AFS_VNODE_DELETED");
1496
1497 ret = afs_validate(vnode, op->key);
1498 if (ret != -ESTALE)
1499 afs_op_set_error(op, ret);
1500 }
1501
1502 _debug("nlink %d [val %d]", vnode->netfs.inode.i_nlink, afs_op_error(op));
1503 }
1504
afs_unlink_success(struct afs_operation * op)1505 static void afs_unlink_success(struct afs_operation *op)
1506 {
1507 _enter("op=%08x", op->debug_id);
1508 op->ctime = op->file[0].scb.status.mtime_client;
1509 afs_check_dir_conflict(op, &op->file[0]);
1510 afs_vnode_commit_status(op, &op->file[0]);
1511 afs_vnode_commit_status(op, &op->file[1]);
1512 afs_update_dentry_version(op, &op->file[0], op->dentry);
1513 afs_dir_remove_link(op);
1514 }
1515
afs_unlink_edit_dir(struct afs_operation * op)1516 static void afs_unlink_edit_dir(struct afs_operation *op)
1517 {
1518 struct netfs_cache_resources cres = {};
1519 struct afs_vnode_param *dvp = &op->file[0];
1520 struct afs_vnode *dvnode = dvp->vnode;
1521
1522 _enter("op=%08x", op->debug_id);
1523 fscache_begin_write_operation(&cres, afs_vnode_cache(dvnode));
1524 down_write(&dvnode->validate_lock);
1525 if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags) &&
1526 dvnode->status.data_version == dvp->dv_before + dvp->dv_delta)
1527 afs_edit_dir_remove(dvnode, &op->dentry->d_name,
1528 afs_edit_dir_for_unlink);
1529 up_write(&dvnode->validate_lock);
1530 fscache_end_operation(&cres);
1531 }
1532
afs_unlink_put(struct afs_operation * op)1533 static void afs_unlink_put(struct afs_operation *op)
1534 {
1535 _enter("op=%08x", op->debug_id);
1536 if (op->unlink.need_rehash && afs_op_error(op) < 0 && afs_op_error(op) != -ENOENT)
1537 d_rehash(op->dentry);
1538 }
1539
1540 static const struct afs_operation_ops afs_unlink_operation = {
1541 .issue_afs_rpc = afs_fs_remove_file,
1542 .issue_yfs_rpc = yfs_fs_remove_file,
1543 .success = afs_unlink_success,
1544 .aborted = afs_check_for_remote_deletion,
1545 .edit_dir = afs_unlink_edit_dir,
1546 .put = afs_unlink_put,
1547 };
1548
1549 /*
1550 * Remove a file or symlink from an AFS filesystem.
1551 */
afs_unlink(struct inode * dir,struct dentry * dentry)1552 static int afs_unlink(struct inode *dir, struct dentry *dentry)
1553 {
1554 struct afs_operation *op;
1555 struct afs_vnode *dvnode = AFS_FS_I(dir);
1556 struct afs_vnode *vnode = AFS_FS_I(d_inode(dentry));
1557 int ret;
1558
1559 _enter("{%llx:%llu},{%pd}",
1560 dvnode->fid.vid, dvnode->fid.vnode, dentry);
1561
1562 if (dentry->d_name.len >= AFSNAMEMAX)
1563 return -ENAMETOOLONG;
1564
1565 op = afs_alloc_operation(NULL, dvnode->volume);
1566 if (IS_ERR(op))
1567 return PTR_ERR(op);
1568
1569 fscache_use_cookie(afs_vnode_cache(dvnode), true);
1570
1571 afs_op_set_vnode(op, 0, dvnode);
1572 op->file[0].dv_delta = 1;
1573 op->file[0].modification = true;
1574 op->file[0].update_ctime = true;
1575
1576 /* Try to make sure we have a callback promise on the victim. */
1577 ret = afs_validate(vnode, op->key);
1578 if (ret < 0) {
1579 afs_op_set_error(op, ret);
1580 goto error;
1581 }
1582
1583 spin_lock(&dentry->d_lock);
1584 if (d_count(dentry) > 1) {
1585 spin_unlock(&dentry->d_lock);
1586 /* Start asynchronous writeout of the inode */
1587 write_inode_now(d_inode(dentry), 0);
1588 afs_op_set_error(op, afs_sillyrename(dvnode, vnode, dentry, op->key));
1589 goto error;
1590 }
1591 if (!d_unhashed(dentry)) {
1592 /* Prevent a race with RCU lookup. */
1593 __d_drop(dentry);
1594 op->unlink.need_rehash = true;
1595 }
1596 spin_unlock(&dentry->d_lock);
1597
1598 op->file[1].vnode = vnode;
1599 op->file[1].update_ctime = true;
1600 op->file[1].op_unlinked = true;
1601 op->dentry = dentry;
1602 op->ops = &afs_unlink_operation;
1603 afs_begin_vnode_operation(op);
1604 afs_wait_for_operation(op);
1605
1606 /* If there was a conflict with a third party, check the status of the
1607 * unlinked vnode.
1608 */
1609 if (afs_op_error(op) == 0 && (op->flags & AFS_OPERATION_DIR_CONFLICT)) {
1610 op->file[1].update_ctime = false;
1611 op->fetch_status.which = 1;
1612 op->ops = &afs_fetch_status_operation;
1613 afs_begin_vnode_operation(op);
1614 afs_wait_for_operation(op);
1615 }
1616
1617 error:
1618 ret = afs_put_operation(op);
1619 afs_dir_unuse_cookie(dvnode, ret);
1620 return ret;
1621 }
1622
1623 static const struct afs_operation_ops afs_create_operation = {
1624 .issue_afs_rpc = afs_fs_create_file,
1625 .issue_yfs_rpc = yfs_fs_create_file,
1626 .success = afs_create_success,
1627 .aborted = afs_check_for_remote_deletion,
1628 .edit_dir = afs_create_edit_dir,
1629 .put = afs_create_put,
1630 };
1631
1632 /*
1633 * create a regular file on an AFS filesystem
1634 */
afs_create(struct mnt_idmap * idmap,struct inode * dir,struct dentry * dentry,umode_t mode,bool excl)1635 static int afs_create(struct mnt_idmap *idmap, struct inode *dir,
1636 struct dentry *dentry, umode_t mode, bool excl)
1637 {
1638 struct afs_operation *op;
1639 struct afs_vnode *dvnode = AFS_FS_I(dir);
1640 int ret = -ENAMETOOLONG;
1641
1642 _enter("{%llx:%llu},{%pd},%ho",
1643 dvnode->fid.vid, dvnode->fid.vnode, dentry, mode);
1644
1645 if (dentry->d_name.len >= AFSNAMEMAX)
1646 goto error;
1647
1648 op = afs_alloc_operation(NULL, dvnode->volume);
1649 if (IS_ERR(op)) {
1650 ret = PTR_ERR(op);
1651 goto error;
1652 }
1653
1654 fscache_use_cookie(afs_vnode_cache(dvnode), true);
1655
1656 afs_op_set_vnode(op, 0, dvnode);
1657 op->file[0].dv_delta = 1;
1658 op->file[0].modification = true;
1659 op->file[0].update_ctime = true;
1660
1661 op->dentry = dentry;
1662 op->create.mode = S_IFREG | mode;
1663 op->create.reason = afs_edit_dir_for_create;
1664 op->mtime = current_time(dir);
1665 op->ops = &afs_create_operation;
1666 ret = afs_do_sync_operation(op);
1667 afs_dir_unuse_cookie(dvnode, ret);
1668 return ret;
1669
1670 error:
1671 d_drop(dentry);
1672 _leave(" = %d", ret);
1673 return ret;
1674 }
1675
afs_link_success(struct afs_operation * op)1676 static void afs_link_success(struct afs_operation *op)
1677 {
1678 struct afs_vnode_param *dvp = &op->file[0];
1679 struct afs_vnode_param *vp = &op->file[1];
1680
1681 _enter("op=%08x", op->debug_id);
1682 op->ctime = dvp->scb.status.mtime_client;
1683 afs_vnode_commit_status(op, dvp);
1684 afs_vnode_commit_status(op, vp);
1685 afs_update_dentry_version(op, dvp, op->dentry);
1686 if (op->dentry_2->d_parent == op->dentry->d_parent)
1687 afs_update_dentry_version(op, dvp, op->dentry_2);
1688 ihold(&vp->vnode->netfs.inode);
1689 d_instantiate(op->dentry, &vp->vnode->netfs.inode);
1690 }
1691
afs_link_put(struct afs_operation * op)1692 static void afs_link_put(struct afs_operation *op)
1693 {
1694 _enter("op=%08x", op->debug_id);
1695 if (afs_op_error(op))
1696 d_drop(op->dentry);
1697 }
1698
1699 static const struct afs_operation_ops afs_link_operation = {
1700 .issue_afs_rpc = afs_fs_link,
1701 .issue_yfs_rpc = yfs_fs_link,
1702 .success = afs_link_success,
1703 .aborted = afs_check_for_remote_deletion,
1704 .edit_dir = afs_create_edit_dir,
1705 .put = afs_link_put,
1706 };
1707
1708 /*
1709 * create a hard link between files in an AFS filesystem
1710 */
afs_link(struct dentry * from,struct inode * dir,struct dentry * dentry)1711 static int afs_link(struct dentry *from, struct inode *dir,
1712 struct dentry *dentry)
1713 {
1714 struct afs_operation *op;
1715 struct afs_vnode *dvnode = AFS_FS_I(dir);
1716 struct afs_vnode *vnode = AFS_FS_I(d_inode(from));
1717 int ret = -ENAMETOOLONG;
1718
1719 _enter("{%llx:%llu},{%llx:%llu},{%pd}",
1720 vnode->fid.vid, vnode->fid.vnode,
1721 dvnode->fid.vid, dvnode->fid.vnode,
1722 dentry);
1723
1724 if (dentry->d_name.len >= AFSNAMEMAX)
1725 goto error;
1726
1727 op = afs_alloc_operation(NULL, dvnode->volume);
1728 if (IS_ERR(op)) {
1729 ret = PTR_ERR(op);
1730 goto error;
1731 }
1732
1733 fscache_use_cookie(afs_vnode_cache(dvnode), true);
1734
1735 ret = afs_validate(vnode, op->key);
1736 if (ret < 0)
1737 goto error_op;
1738
1739 afs_op_set_vnode(op, 0, dvnode);
1740 afs_op_set_vnode(op, 1, vnode);
1741 op->file[0].dv_delta = 1;
1742 op->file[0].modification = true;
1743 op->file[0].update_ctime = true;
1744 op->file[1].update_ctime = true;
1745
1746 op->dentry = dentry;
1747 op->dentry_2 = from;
1748 op->ops = &afs_link_operation;
1749 op->create.reason = afs_edit_dir_for_link;
1750 ret = afs_do_sync_operation(op);
1751 afs_dir_unuse_cookie(dvnode, ret);
1752 return ret;
1753
1754 error_op:
1755 afs_put_operation(op);
1756 afs_dir_unuse_cookie(dvnode, ret);
1757 error:
1758 d_drop(dentry);
1759 _leave(" = %d", ret);
1760 return ret;
1761 }
1762
afs_symlink_put(struct afs_operation * op)1763 static void afs_symlink_put(struct afs_operation *op)
1764 {
1765 kfree(op->create.symlink);
1766 op->create.symlink = NULL;
1767 afs_create_put(op);
1768 }
1769
1770 static const struct afs_operation_ops afs_symlink_operation = {
1771 .issue_afs_rpc = afs_fs_symlink,
1772 .issue_yfs_rpc = yfs_fs_symlink,
1773 .success = afs_create_success,
1774 .aborted = afs_check_for_remote_deletion,
1775 .edit_dir = afs_create_edit_dir,
1776 .put = afs_symlink_put,
1777 };
1778
1779 /*
1780 * create a symlink in an AFS filesystem
1781 */
afs_symlink(struct mnt_idmap * idmap,struct inode * dir,struct dentry * dentry,const char * content)1782 static int afs_symlink(struct mnt_idmap *idmap, struct inode *dir,
1783 struct dentry *dentry, const char *content)
1784 {
1785 struct afs_operation *op;
1786 struct afs_symlink *symlink;
1787 struct afs_vnode *dvnode = AFS_FS_I(dir);
1788 size_t clen = strlen(content);
1789 int ret;
1790
1791 _enter("{%llx:%llu},{%pd},%s",
1792 dvnode->fid.vid, dvnode->fid.vnode, dentry,
1793 content);
1794
1795 ret = -ENAMETOOLONG;
1796 if (dentry->d_name.len >= AFSNAMEMAX)
1797 goto error;
1798
1799 ret = -EINVAL;
1800 if (clen >= AFSPATHMAX)
1801 goto error;
1802
1803 ret = -ENOMEM;
1804 symlink = kmalloc_flex(struct afs_symlink, content, clen + 1, GFP_KERNEL);
1805 if (!symlink)
1806 goto error;
1807 refcount_set(&symlink->ref, 1);
1808 memcpy(symlink->content, content, clen + 1);
1809
1810 op = afs_alloc_operation(NULL, dvnode->volume);
1811 if (IS_ERR(op)) {
1812 ret = PTR_ERR(op);
1813 kfree(symlink);
1814 goto error;
1815 }
1816
1817 fscache_use_cookie(afs_vnode_cache(dvnode), true);
1818
1819 afs_op_set_vnode(op, 0, dvnode);
1820 op->file[0].dv_delta = 1;
1821
1822 op->dentry = dentry;
1823 op->ops = &afs_symlink_operation;
1824 op->create.reason = afs_edit_dir_for_symlink;
1825 op->create.symlink = symlink;
1826 op->mtime = current_time(dir);
1827 ret = afs_do_sync_operation(op);
1828 afs_dir_unuse_cookie(dvnode, ret);
1829 return ret;
1830
1831 error:
1832 d_drop(dentry);
1833 _leave(" = %d", ret);
1834 return ret;
1835 }
1836
afs_rename_success(struct afs_operation * op)1837 static void afs_rename_success(struct afs_operation *op)
1838 {
1839 struct afs_vnode *vnode = op->more_files[0].vnode;
1840 struct afs_vnode *new_vnode = op->more_files[1].vnode;
1841
1842 _enter("op=%08x", op->debug_id);
1843
1844 op->ctime = op->file[0].scb.status.mtime_client;
1845 afs_check_dir_conflict(op, &op->file[1]);
1846 afs_vnode_commit_status(op, &op->file[0]);
1847 if (op->file[1].vnode != op->file[0].vnode) {
1848 op->ctime = op->file[1].scb.status.mtime_client;
1849 afs_vnode_commit_status(op, &op->file[1]);
1850 }
1851 if (op->more_files[0].scb.have_status)
1852 afs_vnode_commit_status(op, &op->more_files[0]);
1853 if (op->more_files[1].scb.have_status)
1854 afs_vnode_commit_status(op, &op->more_files[1]);
1855
1856 /* If we're moving a subdir between dirs, we need to update
1857 * its DV counter too as the ".." will be altered.
1858 */
1859 if (op->file[0].vnode != op->file[1].vnode) {
1860 if (S_ISDIR(vnode->netfs.inode.i_mode)) {
1861 u64 new_dv;
1862
1863 write_seqlock(&vnode->cb_lock);
1864
1865 new_dv = vnode->status.data_version + 1;
1866 trace_afs_set_dv(vnode, new_dv);
1867 vnode->status.data_version = new_dv;
1868 inode_set_iversion_raw(&vnode->netfs.inode, new_dv);
1869
1870 write_sequnlock(&vnode->cb_lock);
1871 }
1872
1873 if ((op->rename.rename_flags & RENAME_EXCHANGE) &&
1874 S_ISDIR(new_vnode->netfs.inode.i_mode)) {
1875 u64 new_dv;
1876
1877 write_seqlock(&new_vnode->cb_lock);
1878
1879 new_dv = new_vnode->status.data_version + 1;
1880 new_vnode->status.data_version = new_dv;
1881 inode_set_iversion_raw(&new_vnode->netfs.inode, new_dv);
1882
1883 write_sequnlock(&new_vnode->cb_lock);
1884 }
1885 }
1886 }
1887
afs_rename_edit_dir(struct afs_operation * op)1888 static void afs_rename_edit_dir(struct afs_operation *op)
1889 {
1890 struct netfs_cache_resources orig_cres = {}, new_cres = {};
1891 struct afs_vnode_param *orig_dvp = &op->file[0];
1892 struct afs_vnode_param *new_dvp = &op->file[1];
1893 struct afs_vnode *orig_dvnode = orig_dvp->vnode;
1894 struct afs_vnode *new_dvnode = new_dvp->vnode;
1895 struct afs_vnode *vnode = AFS_FS_I(d_inode(op->dentry));
1896 struct dentry *old_dentry = op->dentry;
1897 struct dentry *new_dentry = op->dentry_2;
1898 struct inode *new_inode;
1899
1900 _enter("op=%08x", op->debug_id);
1901
1902 if (op->rename.rehash) {
1903 d_rehash(op->rename.rehash);
1904 op->rename.rehash = NULL;
1905 }
1906
1907 fscache_begin_write_operation(&orig_cres, afs_vnode_cache(orig_dvnode));
1908 if (new_dvnode != orig_dvnode)
1909 fscache_begin_write_operation(&new_cres, afs_vnode_cache(new_dvnode));
1910
1911 down_write(&orig_dvnode->validate_lock);
1912 if (test_bit(AFS_VNODE_DIR_VALID, &orig_dvnode->flags) &&
1913 orig_dvnode->status.data_version == orig_dvp->dv_before + orig_dvp->dv_delta)
1914 afs_edit_dir_remove(orig_dvnode, &old_dentry->d_name,
1915 afs_edit_dir_for_rename_0);
1916
1917 if (new_dvnode != orig_dvnode) {
1918 up_write(&orig_dvnode->validate_lock);
1919 down_write(&new_dvnode->validate_lock);
1920 }
1921
1922 if (test_bit(AFS_VNODE_DIR_VALID, &new_dvnode->flags) &&
1923 new_dvnode->status.data_version == new_dvp->dv_before + new_dvp->dv_delta) {
1924 if (!op->rename.new_negative)
1925 afs_edit_dir_remove(new_dvnode, &new_dentry->d_name,
1926 afs_edit_dir_for_rename_1);
1927
1928 afs_edit_dir_add(new_dvnode, &new_dentry->d_name,
1929 &vnode->fid, afs_edit_dir_for_rename_2);
1930 }
1931
1932 if (S_ISDIR(vnode->netfs.inode.i_mode) &&
1933 new_dvnode != orig_dvnode &&
1934 test_bit(AFS_VNODE_DIR_VALID, &vnode->flags))
1935 afs_edit_dir_update(vnode, &dotdot_name, new_dvnode,
1936 afs_edit_dir_for_rename_sub);
1937
1938 new_inode = d_inode(new_dentry);
1939 if (new_inode) {
1940 spin_lock(&new_inode->i_lock);
1941 if (S_ISDIR(new_inode->i_mode))
1942 clear_nlink(new_inode);
1943 else if (new_inode->i_nlink > 0)
1944 drop_nlink(new_inode);
1945 spin_unlock(&new_inode->i_lock);
1946 }
1947
1948 /* Now we can update d_fsdata on the dentries to reflect their
1949 * new parent's data_version.
1950 */
1951 afs_update_dentry_version(op, new_dvp, op->dentry);
1952 afs_update_dentry_version(op, new_dvp, op->dentry_2);
1953
1954 d_move(old_dentry, new_dentry);
1955
1956 up_write(&new_dvnode->validate_lock);
1957 fscache_end_operation(&orig_cres);
1958 if (new_dvnode != orig_dvnode)
1959 fscache_end_operation(&new_cres);
1960 }
1961
afs_rename_exchange_edit_dir(struct afs_operation * op)1962 static void afs_rename_exchange_edit_dir(struct afs_operation *op)
1963 {
1964 struct afs_vnode_param *orig_dvp = &op->file[0];
1965 struct afs_vnode_param *new_dvp = &op->file[1];
1966 struct afs_vnode *orig_dvnode = orig_dvp->vnode;
1967 struct afs_vnode *new_dvnode = new_dvp->vnode;
1968 struct afs_vnode *old_vnode = op->more_files[0].vnode;
1969 struct afs_vnode *new_vnode = op->more_files[1].vnode;
1970 struct dentry *old_dentry = op->dentry;
1971 struct dentry *new_dentry = op->dentry_2;
1972
1973 _enter("op=%08x", op->debug_id);
1974
1975 if (new_dvnode == orig_dvnode) {
1976 down_write(&orig_dvnode->validate_lock);
1977 if (test_bit(AFS_VNODE_DIR_VALID, &orig_dvnode->flags) &&
1978 orig_dvnode->status.data_version == orig_dvp->dv_before + orig_dvp->dv_delta) {
1979 afs_edit_dir_update(orig_dvnode, &old_dentry->d_name,
1980 new_vnode, afs_edit_dir_for_rename_0);
1981 afs_edit_dir_update(orig_dvnode, &new_dentry->d_name,
1982 old_vnode, afs_edit_dir_for_rename_1);
1983 }
1984
1985 d_exchange(old_dentry, new_dentry);
1986 up_write(&orig_dvnode->validate_lock);
1987 } else {
1988 down_write(&orig_dvnode->validate_lock);
1989 if (test_bit(AFS_VNODE_DIR_VALID, &orig_dvnode->flags) &&
1990 orig_dvnode->status.data_version == orig_dvp->dv_before + orig_dvp->dv_delta)
1991 afs_edit_dir_update(orig_dvnode, &old_dentry->d_name,
1992 new_vnode, afs_edit_dir_for_rename_0);
1993
1994 up_write(&orig_dvnode->validate_lock);
1995 down_write(&new_dvnode->validate_lock);
1996
1997 if (test_bit(AFS_VNODE_DIR_VALID, &new_dvnode->flags) &&
1998 new_dvnode->status.data_version == new_dvp->dv_before + new_dvp->dv_delta)
1999 afs_edit_dir_update(new_dvnode, &new_dentry->d_name,
2000 old_vnode, afs_edit_dir_for_rename_1);
2001
2002 if (S_ISDIR(old_vnode->netfs.inode.i_mode) &&
2003 test_bit(AFS_VNODE_DIR_VALID, &old_vnode->flags))
2004 afs_edit_dir_update(old_vnode, &dotdot_name, new_dvnode,
2005 afs_edit_dir_for_rename_sub);
2006
2007 if (S_ISDIR(new_vnode->netfs.inode.i_mode) &&
2008 test_bit(AFS_VNODE_DIR_VALID, &new_vnode->flags))
2009 afs_edit_dir_update(new_vnode, &dotdot_name, orig_dvnode,
2010 afs_edit_dir_for_rename_sub);
2011
2012 /* Now we can update d_fsdata on the dentries to reflect their
2013 * new parents' data_version.
2014 */
2015 afs_update_dentry_version(op, new_dvp, old_dentry);
2016 afs_update_dentry_version(op, orig_dvp, new_dentry);
2017
2018 d_exchange(old_dentry, new_dentry);
2019 up_write(&new_dvnode->validate_lock);
2020 }
2021 }
2022
afs_rename_put(struct afs_operation * op)2023 static void afs_rename_put(struct afs_operation *op)
2024 {
2025 _enter("op=%08x", op->debug_id);
2026 if (op->rename.rehash)
2027 d_rehash(op->rename.rehash);
2028 dput(op->rename.tmp);
2029 if (afs_op_error(op))
2030 d_rehash(op->dentry);
2031 }
2032
2033 static const struct afs_operation_ops afs_rename_operation = {
2034 .issue_afs_rpc = afs_fs_rename,
2035 .issue_yfs_rpc = yfs_fs_rename,
2036 .success = afs_rename_success,
2037 .edit_dir = afs_rename_edit_dir,
2038 .put = afs_rename_put,
2039 };
2040
2041 #if 0 /* Autoswitched in yfs_fs_rename_replace(). */
2042 static const struct afs_operation_ops afs_rename_replace_operation = {
2043 .issue_afs_rpc = NULL,
2044 .issue_yfs_rpc = yfs_fs_rename_replace,
2045 .success = afs_rename_success,
2046 .edit_dir = afs_rename_edit_dir,
2047 .put = afs_rename_put,
2048 };
2049 #endif
2050
2051 static const struct afs_operation_ops afs_rename_noreplace_operation = {
2052 .issue_afs_rpc = NULL,
2053 .issue_yfs_rpc = yfs_fs_rename_noreplace,
2054 .success = afs_rename_success,
2055 .edit_dir = afs_rename_edit_dir,
2056 .put = afs_rename_put,
2057 };
2058
2059 static const struct afs_operation_ops afs_rename_exchange_operation = {
2060 .issue_afs_rpc = NULL,
2061 .issue_yfs_rpc = yfs_fs_rename_exchange,
2062 .success = afs_rename_success,
2063 .edit_dir = afs_rename_exchange_edit_dir,
2064 .put = afs_rename_put,
2065 };
2066
2067 /*
2068 * rename a file in an AFS filesystem and/or move it between directories
2069 */
afs_rename(struct mnt_idmap * idmap,struct inode * old_dir,struct dentry * old_dentry,struct inode * new_dir,struct dentry * new_dentry,unsigned int flags)2070 static int afs_rename(struct mnt_idmap *idmap, struct inode *old_dir,
2071 struct dentry *old_dentry, struct inode *new_dir,
2072 struct dentry *new_dentry, unsigned int flags)
2073 {
2074 struct afs_operation *op;
2075 struct afs_vnode *orig_dvnode, *new_dvnode, *vnode, *new_vnode = NULL;
2076 int ret;
2077
2078 if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE))
2079 return -EINVAL;
2080
2081 /* Don't allow silly-rename files be moved around. */
2082 if (old_dentry->d_flags & DCACHE_NFSFS_RENAMED)
2083 return -EINVAL;
2084
2085 vnode = AFS_FS_I(d_inode(old_dentry));
2086 orig_dvnode = AFS_FS_I(old_dir);
2087 new_dvnode = AFS_FS_I(new_dir);
2088 if (d_is_positive(new_dentry))
2089 new_vnode = AFS_FS_I(d_inode(new_dentry));
2090
2091 _enter("{%llx:%llu},{%llx:%llu},{%llx:%llu},{%pd}",
2092 orig_dvnode->fid.vid, orig_dvnode->fid.vnode,
2093 vnode->fid.vid, vnode->fid.vnode,
2094 new_dvnode->fid.vid, new_dvnode->fid.vnode,
2095 new_dentry);
2096
2097 op = afs_alloc_operation(NULL, orig_dvnode->volume);
2098 if (IS_ERR(op))
2099 return PTR_ERR(op);
2100
2101 fscache_use_cookie(afs_vnode_cache(orig_dvnode), true);
2102 if (new_dvnode != orig_dvnode)
2103 fscache_use_cookie(afs_vnode_cache(new_dvnode), true);
2104
2105 ret = afs_validate(vnode, op->key);
2106 afs_op_set_error(op, ret);
2107 if (ret < 0)
2108 goto error;
2109
2110 ret = -ENOMEM;
2111 op->more_files = kvzalloc_objs(struct afs_vnode_param, 2);
2112 if (!op->more_files)
2113 goto error;
2114
2115 afs_op_set_vnode(op, 0, orig_dvnode);
2116 afs_op_set_vnode(op, 1, new_dvnode); /* May be same as orig_dvnode */
2117 op->file[0].dv_delta = 1;
2118 op->file[1].dv_delta = 1;
2119 op->file[0].modification = true;
2120 op->file[1].modification = true;
2121 op->file[0].update_ctime = true;
2122 op->file[1].update_ctime = true;
2123 op->more_files[0].vnode = vnode;
2124 op->more_files[0].speculative = true;
2125 op->more_files[1].vnode = new_vnode;
2126 op->more_files[1].speculative = true;
2127 op->nr_files = 4;
2128
2129 op->dentry = old_dentry;
2130 op->dentry_2 = new_dentry;
2131 op->rename.rename_flags = flags;
2132 op->rename.new_negative = d_is_negative(new_dentry);
2133
2134 if (flags & RENAME_NOREPLACE) {
2135 op->ops = &afs_rename_noreplace_operation;
2136 } else if (flags & RENAME_EXCHANGE) {
2137 op->ops = &afs_rename_exchange_operation;
2138 d_drop(new_dentry);
2139 } else {
2140 /* If we might displace the target, we might need to do silly
2141 * rename.
2142 */
2143 op->ops = &afs_rename_operation;
2144
2145 /* For non-directories, check whether the target is busy and if
2146 * so, make a copy of the dentry and then do a silly-rename.
2147 * If the silly-rename succeeds, the copied dentry is hashed
2148 * and becomes the new target.
2149 */
2150 if (d_is_positive(new_dentry) && !d_is_dir(new_dentry)) {
2151 /* To prevent any new references to the target during
2152 * the rename, we unhash the dentry in advance.
2153 */
2154 if (!d_unhashed(new_dentry)) {
2155 d_drop(new_dentry);
2156 op->rename.rehash = new_dentry;
2157 }
2158
2159 if (d_count(new_dentry) > 2) {
2160 /* copy the target dentry's name */
2161 op->rename.tmp = d_alloc(new_dentry->d_parent,
2162 &new_dentry->d_name);
2163 if (!op->rename.tmp) {
2164 afs_op_nomem(op);
2165 goto error;
2166 }
2167
2168 ret = afs_sillyrename(new_dvnode,
2169 AFS_FS_I(d_inode(new_dentry)),
2170 new_dentry, op->key);
2171 if (ret) {
2172 afs_op_set_error(op, ret);
2173 goto error;
2174 }
2175
2176 op->dentry_2 = op->rename.tmp;
2177 op->rename.rehash = NULL;
2178 op->rename.new_negative = true;
2179 }
2180 }
2181 }
2182
2183 /* This bit is potentially nasty as there's a potential race with
2184 * afs_d_revalidate{,_rcu}(). We have to change d_fsdata on the dentry
2185 * to reflect it's new parent's new data_version after the op, but
2186 * d_revalidate may see old_dentry between the op having taken place
2187 * and the version being updated.
2188 *
2189 * So drop the old_dentry for now to make other threads go through
2190 * lookup instead - which we hold a lock against.
2191 */
2192 d_drop(old_dentry);
2193
2194 ret = afs_do_sync_operation(op);
2195 if (ret == -ENOTSUPP)
2196 ret = -EINVAL;
2197 out:
2198 afs_dir_unuse_cookie(orig_dvnode, ret);
2199 if (new_dvnode != orig_dvnode)
2200 afs_dir_unuse_cookie(new_dvnode, ret);
2201 return ret;
2202
2203 error:
2204 ret = afs_put_operation(op);
2205 goto out;
2206 }
2207
2208 /*
2209 * Write the directory contents to the cache as a single blob.
2210 */
afs_dir_writepages(struct address_space * mapping,struct writeback_control * wbc)2211 static int afs_dir_writepages(struct address_space *mapping,
2212 struct writeback_control *wbc)
2213 {
2214 struct afs_vnode *dvnode = AFS_FS_I(mapping->host);
2215 struct iov_iter iter;
2216 int ret = 0;
2217
2218 /* Need to lock to prevent the folio queue and folios from being thrown
2219 * away.
2220 */
2221 if (!down_read_trylock(&dvnode->validate_lock)) {
2222 if (wbc->sync_mode == WB_SYNC_NONE) {
2223 /* The VFS will have undirtied the inode. */
2224 netfs_single_mark_inode_dirty(&dvnode->netfs.inode);
2225 return 0;
2226 }
2227 down_read(&dvnode->validate_lock);
2228 }
2229
2230 if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags)) {
2231 iov_iter_folio_queue(&iter, ITER_SOURCE, dvnode->directory, 0, 0,
2232 i_size_read(&dvnode->netfs.inode));
2233 ret = netfs_writeback_single(mapping, wbc, &iter);
2234 if (ret == 1)
2235 ret = 0; /* Skipped write due to lock conflict. */
2236 }
2237
2238 up_read(&dvnode->validate_lock);
2239 return ret;
2240 }
2241