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