0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021 #include <linux/compat.h>
0022 #include <linux/module.h>
0023 #include <linux/time.h>
0024 #include <linux/errno.h>
0025 #include <linux/stat.h>
0026 #include <linux/fcntl.h>
0027 #include <linux/string.h>
0028 #include <linux/kernel.h>
0029 #include <linux/slab.h>
0030 #include <linux/mm.h>
0031 #include <linux/sunrpc/clnt.h>
0032 #include <linux/nfs_fs.h>
0033 #include <linux/nfs_mount.h>
0034 #include <linux/pagemap.h>
0035 #include <linux/pagevec.h>
0036 #include <linux/namei.h>
0037 #include <linux/mount.h>
0038 #include <linux/swap.h>
0039 #include <linux/sched.h>
0040 #include <linux/kmemleak.h>
0041 #include <linux/xattr.h>
0042 #include <linux/hash.h>
0043
0044 #include "delegation.h"
0045 #include "iostat.h"
0046 #include "internal.h"
0047 #include "fscache.h"
0048
0049 #include "nfstrace.h"
0050
0051
0052
0053 static int nfs_opendir(struct inode *, struct file *);
0054 static int nfs_closedir(struct inode *, struct file *);
0055 static int nfs_readdir(struct file *, struct dir_context *);
0056 static int nfs_fsync_dir(struct file *, loff_t, loff_t, int);
0057 static loff_t nfs_llseek_dir(struct file *, loff_t, int);
0058 static void nfs_readdir_free_folio(struct folio *);
0059
0060 const struct file_operations nfs_dir_operations = {
0061 .llseek = nfs_llseek_dir,
0062 .read = generic_read_dir,
0063 .iterate_shared = nfs_readdir,
0064 .open = nfs_opendir,
0065 .release = nfs_closedir,
0066 .fsync = nfs_fsync_dir,
0067 };
0068
0069 const struct address_space_operations nfs_dir_aops = {
0070 .free_folio = nfs_readdir_free_folio,
0071 };
0072
0073 #define NFS_INIT_DTSIZE PAGE_SIZE
0074
0075 static struct nfs_open_dir_context *
0076 alloc_nfs_open_dir_context(struct inode *dir)
0077 {
0078 struct nfs_inode *nfsi = NFS_I(dir);
0079 struct nfs_open_dir_context *ctx;
0080
0081 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL_ACCOUNT);
0082 if (ctx != NULL) {
0083 ctx->attr_gencount = nfsi->attr_gencount;
0084 ctx->dtsize = NFS_INIT_DTSIZE;
0085 spin_lock(&dir->i_lock);
0086 if (list_empty(&nfsi->open_files) &&
0087 (nfsi->cache_validity & NFS_INO_DATA_INVAL_DEFER))
0088 nfs_set_cache_invalid(dir,
0089 NFS_INO_INVALID_DATA |
0090 NFS_INO_REVAL_FORCED);
0091 list_add_tail_rcu(&ctx->list, &nfsi->open_files);
0092 memcpy(ctx->verf, nfsi->cookieverf, sizeof(ctx->verf));
0093 spin_unlock(&dir->i_lock);
0094 return ctx;
0095 }
0096 return ERR_PTR(-ENOMEM);
0097 }
0098
0099 static void put_nfs_open_dir_context(struct inode *dir, struct nfs_open_dir_context *ctx)
0100 {
0101 spin_lock(&dir->i_lock);
0102 list_del_rcu(&ctx->list);
0103 spin_unlock(&dir->i_lock);
0104 kfree_rcu(ctx, rcu_head);
0105 }
0106
0107
0108
0109
0110 static int
0111 nfs_opendir(struct inode *inode, struct file *filp)
0112 {
0113 int res = 0;
0114 struct nfs_open_dir_context *ctx;
0115
0116 dfprintk(FILE, "NFS: open dir(%pD2)\n", filp);
0117
0118 nfs_inc_stats(inode, NFSIOS_VFSOPEN);
0119
0120 ctx = alloc_nfs_open_dir_context(inode);
0121 if (IS_ERR(ctx)) {
0122 res = PTR_ERR(ctx);
0123 goto out;
0124 }
0125 filp->private_data = ctx;
0126 out:
0127 return res;
0128 }
0129
0130 static int
0131 nfs_closedir(struct inode *inode, struct file *filp)
0132 {
0133 put_nfs_open_dir_context(file_inode(filp), filp->private_data);
0134 return 0;
0135 }
0136
0137 struct nfs_cache_array_entry {
0138 u64 cookie;
0139 u64 ino;
0140 const char *name;
0141 unsigned int name_len;
0142 unsigned char d_type;
0143 };
0144
0145 struct nfs_cache_array {
0146 u64 change_attr;
0147 u64 last_cookie;
0148 unsigned int size;
0149 unsigned char page_full : 1,
0150 page_is_eof : 1,
0151 cookies_are_ordered : 1;
0152 struct nfs_cache_array_entry array[];
0153 };
0154
0155 struct nfs_readdir_descriptor {
0156 struct file *file;
0157 struct page *page;
0158 struct dir_context *ctx;
0159 pgoff_t page_index;
0160 pgoff_t page_index_max;
0161 u64 dir_cookie;
0162 u64 last_cookie;
0163 loff_t current_index;
0164
0165 __be32 verf[NFS_DIR_VERIFIER_SIZE];
0166 unsigned long dir_verifier;
0167 unsigned long timestamp;
0168 unsigned long gencount;
0169 unsigned long attr_gencount;
0170 unsigned int cache_entry_index;
0171 unsigned int buffer_fills;
0172 unsigned int dtsize;
0173 bool clear_cache;
0174 bool plus;
0175 bool eob;
0176 bool eof;
0177 };
0178
0179 static void nfs_set_dtsize(struct nfs_readdir_descriptor *desc, unsigned int sz)
0180 {
0181 struct nfs_server *server = NFS_SERVER(file_inode(desc->file));
0182 unsigned int maxsize = server->dtsize;
0183
0184 if (sz > maxsize)
0185 sz = maxsize;
0186 if (sz < NFS_MIN_FILE_IO_SIZE)
0187 sz = NFS_MIN_FILE_IO_SIZE;
0188 desc->dtsize = sz;
0189 }
0190
0191 static void nfs_shrink_dtsize(struct nfs_readdir_descriptor *desc)
0192 {
0193 nfs_set_dtsize(desc, desc->dtsize >> 1);
0194 }
0195
0196 static void nfs_grow_dtsize(struct nfs_readdir_descriptor *desc)
0197 {
0198 nfs_set_dtsize(desc, desc->dtsize << 1);
0199 }
0200
0201 static void nfs_readdir_page_init_array(struct page *page, u64 last_cookie,
0202 u64 change_attr)
0203 {
0204 struct nfs_cache_array *array;
0205
0206 array = kmap_atomic(page);
0207 array->change_attr = change_attr;
0208 array->last_cookie = last_cookie;
0209 array->size = 0;
0210 array->page_full = 0;
0211 array->page_is_eof = 0;
0212 array->cookies_are_ordered = 1;
0213 kunmap_atomic(array);
0214 }
0215
0216
0217
0218
0219 static void nfs_readdir_clear_array(struct page *page)
0220 {
0221 struct nfs_cache_array *array;
0222 unsigned int i;
0223
0224 array = kmap_atomic(page);
0225 for (i = 0; i < array->size; i++)
0226 kfree(array->array[i].name);
0227 array->size = 0;
0228 kunmap_atomic(array);
0229 }
0230
0231 static void nfs_readdir_free_folio(struct folio *folio)
0232 {
0233 nfs_readdir_clear_array(&folio->page);
0234 }
0235
0236 static void nfs_readdir_page_reinit_array(struct page *page, u64 last_cookie,
0237 u64 change_attr)
0238 {
0239 nfs_readdir_clear_array(page);
0240 nfs_readdir_page_init_array(page, last_cookie, change_attr);
0241 }
0242
0243 static struct page *
0244 nfs_readdir_page_array_alloc(u64 last_cookie, gfp_t gfp_flags)
0245 {
0246 struct page *page = alloc_page(gfp_flags);
0247 if (page)
0248 nfs_readdir_page_init_array(page, last_cookie, 0);
0249 return page;
0250 }
0251
0252 static void nfs_readdir_page_array_free(struct page *page)
0253 {
0254 if (page) {
0255 nfs_readdir_clear_array(page);
0256 put_page(page);
0257 }
0258 }
0259
0260 static u64 nfs_readdir_array_index_cookie(struct nfs_cache_array *array)
0261 {
0262 return array->size == 0 ? array->last_cookie : array->array[0].cookie;
0263 }
0264
0265 static void nfs_readdir_array_set_eof(struct nfs_cache_array *array)
0266 {
0267 array->page_is_eof = 1;
0268 array->page_full = 1;
0269 }
0270
0271 static bool nfs_readdir_array_is_full(struct nfs_cache_array *array)
0272 {
0273 return array->page_full;
0274 }
0275
0276
0277
0278
0279
0280
0281 static const char *nfs_readdir_copy_name(const char *name, unsigned int len)
0282 {
0283 const char *ret = kmemdup_nul(name, len, GFP_KERNEL);
0284
0285
0286
0287
0288
0289 if (ret != NULL)
0290 kmemleak_not_leak(ret);
0291 return ret;
0292 }
0293
0294 static size_t nfs_readdir_array_maxentries(void)
0295 {
0296 return (PAGE_SIZE - sizeof(struct nfs_cache_array)) /
0297 sizeof(struct nfs_cache_array_entry);
0298 }
0299
0300
0301
0302
0303 static int nfs_readdir_array_can_expand(struct nfs_cache_array *array)
0304 {
0305 if (array->page_full)
0306 return -ENOSPC;
0307 if (array->size == nfs_readdir_array_maxentries()) {
0308 array->page_full = 1;
0309 return -ENOSPC;
0310 }
0311 return 0;
0312 }
0313
0314 static int nfs_readdir_page_array_append(struct page *page,
0315 const struct nfs_entry *entry,
0316 u64 *cookie)
0317 {
0318 struct nfs_cache_array *array;
0319 struct nfs_cache_array_entry *cache_entry;
0320 const char *name;
0321 int ret = -ENOMEM;
0322
0323 name = nfs_readdir_copy_name(entry->name, entry->len);
0324
0325 array = kmap_atomic(page);
0326 if (!name)
0327 goto out;
0328 ret = nfs_readdir_array_can_expand(array);
0329 if (ret) {
0330 kfree(name);
0331 goto out;
0332 }
0333
0334 cache_entry = &array->array[array->size];
0335 cache_entry->cookie = array->last_cookie;
0336 cache_entry->ino = entry->ino;
0337 cache_entry->d_type = entry->d_type;
0338 cache_entry->name_len = entry->len;
0339 cache_entry->name = name;
0340 array->last_cookie = entry->cookie;
0341 if (array->last_cookie <= cache_entry->cookie)
0342 array->cookies_are_ordered = 0;
0343 array->size++;
0344 if (entry->eof != 0)
0345 nfs_readdir_array_set_eof(array);
0346 out:
0347 *cookie = array->last_cookie;
0348 kunmap_atomic(array);
0349 return ret;
0350 }
0351
0352 #define NFS_READDIR_COOKIE_MASK (U32_MAX >> 14)
0353
0354
0355
0356
0357
0358
0359
0360
0361
0362
0363
0364 static pgoff_t nfs_readdir_page_cookie_hash(u64 cookie)
0365 {
0366 if (cookie == 0)
0367 return 0;
0368 return hash_64(cookie, 18);
0369 }
0370
0371 static bool nfs_readdir_page_validate(struct page *page, u64 last_cookie,
0372 u64 change_attr)
0373 {
0374 struct nfs_cache_array *array = kmap_atomic(page);
0375 int ret = true;
0376
0377 if (array->change_attr != change_attr)
0378 ret = false;
0379 if (nfs_readdir_array_index_cookie(array) != last_cookie)
0380 ret = false;
0381 kunmap_atomic(array);
0382 return ret;
0383 }
0384
0385 static void nfs_readdir_page_unlock_and_put(struct page *page)
0386 {
0387 unlock_page(page);
0388 put_page(page);
0389 }
0390
0391 static void nfs_readdir_page_init_and_validate(struct page *page, u64 cookie,
0392 u64 change_attr)
0393 {
0394 if (PageUptodate(page)) {
0395 if (nfs_readdir_page_validate(page, cookie, change_attr))
0396 return;
0397 nfs_readdir_clear_array(page);
0398 }
0399 nfs_readdir_page_init_array(page, cookie, change_attr);
0400 SetPageUptodate(page);
0401 }
0402
0403 static struct page *nfs_readdir_page_get_locked(struct address_space *mapping,
0404 u64 cookie, u64 change_attr)
0405 {
0406 pgoff_t index = nfs_readdir_page_cookie_hash(cookie);
0407 struct page *page;
0408
0409 page = grab_cache_page(mapping, index);
0410 if (!page)
0411 return NULL;
0412 nfs_readdir_page_init_and_validate(page, cookie, change_attr);
0413 return page;
0414 }
0415
0416 static u64 nfs_readdir_page_last_cookie(struct page *page)
0417 {
0418 struct nfs_cache_array *array;
0419 u64 ret;
0420
0421 array = kmap_atomic(page);
0422 ret = array->last_cookie;
0423 kunmap_atomic(array);
0424 return ret;
0425 }
0426
0427 static bool nfs_readdir_page_needs_filling(struct page *page)
0428 {
0429 struct nfs_cache_array *array;
0430 bool ret;
0431
0432 array = kmap_atomic(page);
0433 ret = !nfs_readdir_array_is_full(array);
0434 kunmap_atomic(array);
0435 return ret;
0436 }
0437
0438 static void nfs_readdir_page_set_eof(struct page *page)
0439 {
0440 struct nfs_cache_array *array;
0441
0442 array = kmap_atomic(page);
0443 nfs_readdir_array_set_eof(array);
0444 kunmap_atomic(array);
0445 }
0446
0447 static struct page *nfs_readdir_page_get_next(struct address_space *mapping,
0448 u64 cookie, u64 change_attr)
0449 {
0450 pgoff_t index = nfs_readdir_page_cookie_hash(cookie);
0451 struct page *page;
0452
0453 page = grab_cache_page_nowait(mapping, index);
0454 if (!page)
0455 return NULL;
0456 nfs_readdir_page_init_and_validate(page, cookie, change_attr);
0457 if (nfs_readdir_page_last_cookie(page) != cookie)
0458 nfs_readdir_page_reinit_array(page, cookie, change_attr);
0459 return page;
0460 }
0461
0462 static inline
0463 int is_32bit_api(void)
0464 {
0465 #ifdef CONFIG_COMPAT
0466 return in_compat_syscall();
0467 #else
0468 return (BITS_PER_LONG == 32);
0469 #endif
0470 }
0471
0472 static
0473 bool nfs_readdir_use_cookie(const struct file *filp)
0474 {
0475 if ((filp->f_mode & FMODE_32BITHASH) ||
0476 (!(filp->f_mode & FMODE_64BITHASH) && is_32bit_api()))
0477 return false;
0478 return true;
0479 }
0480
0481 static void nfs_readdir_seek_next_array(struct nfs_cache_array *array,
0482 struct nfs_readdir_descriptor *desc)
0483 {
0484 if (array->page_full) {
0485 desc->last_cookie = array->last_cookie;
0486 desc->current_index += array->size;
0487 desc->cache_entry_index = 0;
0488 desc->page_index++;
0489 } else
0490 desc->last_cookie = nfs_readdir_array_index_cookie(array);
0491 }
0492
0493 static void nfs_readdir_rewind_search(struct nfs_readdir_descriptor *desc)
0494 {
0495 desc->current_index = 0;
0496 desc->last_cookie = 0;
0497 desc->page_index = 0;
0498 }
0499
0500 static int nfs_readdir_search_for_pos(struct nfs_cache_array *array,
0501 struct nfs_readdir_descriptor *desc)
0502 {
0503 loff_t diff = desc->ctx->pos - desc->current_index;
0504 unsigned int index;
0505
0506 if (diff < 0)
0507 goto out_eof;
0508 if (diff >= array->size) {
0509 if (array->page_is_eof)
0510 goto out_eof;
0511 nfs_readdir_seek_next_array(array, desc);
0512 return -EAGAIN;
0513 }
0514
0515 index = (unsigned int)diff;
0516 desc->dir_cookie = array->array[index].cookie;
0517 desc->cache_entry_index = index;
0518 return 0;
0519 out_eof:
0520 desc->eof = true;
0521 return -EBADCOOKIE;
0522 }
0523
0524 static bool nfs_readdir_array_cookie_in_range(struct nfs_cache_array *array,
0525 u64 cookie)
0526 {
0527 if (!array->cookies_are_ordered)
0528 return true;
0529
0530 if (cookie >= array->last_cookie)
0531 return false;
0532 if (array->size && cookie < array->array[0].cookie)
0533 return false;
0534 return true;
0535 }
0536
0537 static int nfs_readdir_search_for_cookie(struct nfs_cache_array *array,
0538 struct nfs_readdir_descriptor *desc)
0539 {
0540 unsigned int i;
0541 int status = -EAGAIN;
0542
0543 if (!nfs_readdir_array_cookie_in_range(array, desc->dir_cookie))
0544 goto check_eof;
0545
0546 for (i = 0; i < array->size; i++) {
0547 if (array->array[i].cookie == desc->dir_cookie) {
0548 if (nfs_readdir_use_cookie(desc->file))
0549 desc->ctx->pos = desc->dir_cookie;
0550 else
0551 desc->ctx->pos = desc->current_index + i;
0552 desc->cache_entry_index = i;
0553 return 0;
0554 }
0555 }
0556 check_eof:
0557 if (array->page_is_eof) {
0558 status = -EBADCOOKIE;
0559 if (desc->dir_cookie == array->last_cookie)
0560 desc->eof = true;
0561 } else
0562 nfs_readdir_seek_next_array(array, desc);
0563 return status;
0564 }
0565
0566 static int nfs_readdir_search_array(struct nfs_readdir_descriptor *desc)
0567 {
0568 struct nfs_cache_array *array;
0569 int status;
0570
0571 array = kmap_atomic(desc->page);
0572
0573 if (desc->dir_cookie == 0)
0574 status = nfs_readdir_search_for_pos(array, desc);
0575 else
0576 status = nfs_readdir_search_for_cookie(array, desc);
0577
0578 kunmap_atomic(array);
0579 return status;
0580 }
0581
0582
0583 static int nfs_readdir_xdr_filler(struct nfs_readdir_descriptor *desc,
0584 __be32 *verf, u64 cookie,
0585 struct page **pages, size_t bufsize,
0586 __be32 *verf_res)
0587 {
0588 struct inode *inode = file_inode(desc->file);
0589 struct nfs_readdir_arg arg = {
0590 .dentry = file_dentry(desc->file),
0591 .cred = desc->file->f_cred,
0592 .verf = verf,
0593 .cookie = cookie,
0594 .pages = pages,
0595 .page_len = bufsize,
0596 .plus = desc->plus,
0597 };
0598 struct nfs_readdir_res res = {
0599 .verf = verf_res,
0600 };
0601 unsigned long timestamp, gencount;
0602 int error;
0603
0604 again:
0605 timestamp = jiffies;
0606 gencount = nfs_inc_attr_generation_counter();
0607 desc->dir_verifier = nfs_save_change_attribute(inode);
0608 error = NFS_PROTO(inode)->readdir(&arg, &res);
0609 if (error < 0) {
0610
0611 if (error == -ENOTSUPP && desc->plus) {
0612 NFS_SERVER(inode)->caps &= ~NFS_CAP_READDIRPLUS;
0613 desc->plus = arg.plus = false;
0614 goto again;
0615 }
0616 goto error;
0617 }
0618 desc->timestamp = timestamp;
0619 desc->gencount = gencount;
0620 error:
0621 return error;
0622 }
0623
0624 static int xdr_decode(struct nfs_readdir_descriptor *desc,
0625 struct nfs_entry *entry, struct xdr_stream *xdr)
0626 {
0627 struct inode *inode = file_inode(desc->file);
0628 int error;
0629
0630 error = NFS_PROTO(inode)->decode_dirent(xdr, entry, desc->plus);
0631 if (error)
0632 return error;
0633 entry->fattr->time_start = desc->timestamp;
0634 entry->fattr->gencount = desc->gencount;
0635 return 0;
0636 }
0637
0638
0639
0640
0641 static
0642 int nfs_same_file(struct dentry *dentry, struct nfs_entry *entry)
0643 {
0644 struct inode *inode;
0645 struct nfs_inode *nfsi;
0646
0647 if (d_really_is_negative(dentry))
0648 return 0;
0649
0650 inode = d_inode(dentry);
0651 if (is_bad_inode(inode) || NFS_STALE(inode))
0652 return 0;
0653
0654 nfsi = NFS_I(inode);
0655 if (entry->fattr->fileid != nfsi->fileid)
0656 return 0;
0657 if (entry->fh->size && nfs_compare_fh(entry->fh, &nfsi->fh) != 0)
0658 return 0;
0659 return 1;
0660 }
0661
0662 #define NFS_READDIR_CACHE_USAGE_THRESHOLD (8UL)
0663
0664 static bool nfs_use_readdirplus(struct inode *dir, struct dir_context *ctx,
0665 unsigned int cache_hits,
0666 unsigned int cache_misses)
0667 {
0668 if (!nfs_server_capable(dir, NFS_CAP_READDIRPLUS))
0669 return false;
0670 if (ctx->pos == 0 ||
0671 cache_hits + cache_misses > NFS_READDIR_CACHE_USAGE_THRESHOLD)
0672 return true;
0673 return false;
0674 }
0675
0676
0677
0678
0679
0680
0681 void nfs_readdir_record_entry_cache_hit(struct inode *dir)
0682 {
0683 struct nfs_inode *nfsi = NFS_I(dir);
0684 struct nfs_open_dir_context *ctx;
0685
0686 if (nfs_server_capable(dir, NFS_CAP_READDIRPLUS) &&
0687 S_ISDIR(dir->i_mode)) {
0688 rcu_read_lock();
0689 list_for_each_entry_rcu (ctx, &nfsi->open_files, list)
0690 atomic_inc(&ctx->cache_hits);
0691 rcu_read_unlock();
0692 }
0693 }
0694
0695
0696
0697
0698
0699
0700 void nfs_readdir_record_entry_cache_miss(struct inode *dir)
0701 {
0702 struct nfs_inode *nfsi = NFS_I(dir);
0703 struct nfs_open_dir_context *ctx;
0704
0705 if (nfs_server_capable(dir, NFS_CAP_READDIRPLUS) &&
0706 S_ISDIR(dir->i_mode)) {
0707 rcu_read_lock();
0708 list_for_each_entry_rcu (ctx, &nfsi->open_files, list)
0709 atomic_inc(&ctx->cache_misses);
0710 rcu_read_unlock();
0711 }
0712 }
0713
0714 static void nfs_lookup_advise_force_readdirplus(struct inode *dir,
0715 unsigned int flags)
0716 {
0717 if (nfs_server_capable(dir, NFS_CAP_CASE_INSENSITIVE))
0718 return;
0719 if (flags & (LOOKUP_EXCL | LOOKUP_PARENT | LOOKUP_REVAL))
0720 return;
0721 nfs_readdir_record_entry_cache_miss(dir);
0722 }
0723
0724 static
0725 void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry,
0726 unsigned long dir_verifier)
0727 {
0728 struct qstr filename = QSTR_INIT(entry->name, entry->len);
0729 DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
0730 struct dentry *dentry;
0731 struct dentry *alias;
0732 struct inode *inode;
0733 int status;
0734
0735 if (!(entry->fattr->valid & NFS_ATTR_FATTR_FILEID))
0736 return;
0737 if (!(entry->fattr->valid & NFS_ATTR_FATTR_FSID))
0738 return;
0739 if (filename.len == 0)
0740 return;
0741
0742 if (strnlen(filename.name, filename.len) != filename.len)
0743 return;
0744
0745 if (strnchr(filename.name, filename.len, '/'))
0746 return;
0747 if (filename.name[0] == '.') {
0748 if (filename.len == 1)
0749 return;
0750 if (filename.len == 2 && filename.name[1] == '.')
0751 return;
0752 }
0753 filename.hash = full_name_hash(parent, filename.name, filename.len);
0754
0755 dentry = d_lookup(parent, &filename);
0756 again:
0757 if (!dentry) {
0758 dentry = d_alloc_parallel(parent, &filename, &wq);
0759 if (IS_ERR(dentry))
0760 return;
0761 }
0762 if (!d_in_lookup(dentry)) {
0763
0764 if (!nfs_fsid_equal(&NFS_SB(dentry->d_sb)->fsid,
0765 &entry->fattr->fsid))
0766 goto out;
0767 if (nfs_same_file(dentry, entry)) {
0768 if (!entry->fh->size)
0769 goto out;
0770 nfs_set_verifier(dentry, dir_verifier);
0771 status = nfs_refresh_inode(d_inode(dentry), entry->fattr);
0772 if (!status)
0773 nfs_setsecurity(d_inode(dentry), entry->fattr);
0774 trace_nfs_readdir_lookup_revalidate(d_inode(parent),
0775 dentry, 0, status);
0776 goto out;
0777 } else {
0778 trace_nfs_readdir_lookup_revalidate_failed(
0779 d_inode(parent), dentry, 0);
0780 d_invalidate(dentry);
0781 dput(dentry);
0782 dentry = NULL;
0783 goto again;
0784 }
0785 }
0786 if (!entry->fh->size) {
0787 d_lookup_done(dentry);
0788 goto out;
0789 }
0790
0791 inode = nfs_fhget(dentry->d_sb, entry->fh, entry->fattr);
0792 alias = d_splice_alias(inode, dentry);
0793 d_lookup_done(dentry);
0794 if (alias) {
0795 if (IS_ERR(alias))
0796 goto out;
0797 dput(dentry);
0798 dentry = alias;
0799 }
0800 nfs_set_verifier(dentry, dir_verifier);
0801 trace_nfs_readdir_lookup(d_inode(parent), dentry, 0);
0802 out:
0803 dput(dentry);
0804 }
0805
0806 static int nfs_readdir_entry_decode(struct nfs_readdir_descriptor *desc,
0807 struct nfs_entry *entry,
0808 struct xdr_stream *stream)
0809 {
0810 int ret;
0811
0812 if (entry->fattr->label)
0813 entry->fattr->label->len = NFS4_MAXLABELLEN;
0814 ret = xdr_decode(desc, entry, stream);
0815 if (ret || !desc->plus)
0816 return ret;
0817 nfs_prime_dcache(file_dentry(desc->file), entry, desc->dir_verifier);
0818 return 0;
0819 }
0820
0821
0822 static int nfs_readdir_page_filler(struct nfs_readdir_descriptor *desc,
0823 struct nfs_entry *entry,
0824 struct page **xdr_pages, unsigned int buflen,
0825 struct page **arrays, size_t narrays,
0826 u64 change_attr)
0827 {
0828 struct address_space *mapping = desc->file->f_mapping;
0829 struct xdr_stream stream;
0830 struct xdr_buf buf;
0831 struct page *scratch, *new, *page = *arrays;
0832 u64 cookie;
0833 int status;
0834
0835 scratch = alloc_page(GFP_KERNEL);
0836 if (scratch == NULL)
0837 return -ENOMEM;
0838
0839 xdr_init_decode_pages(&stream, &buf, xdr_pages, buflen);
0840 xdr_set_scratch_page(&stream, scratch);
0841
0842 do {
0843 status = nfs_readdir_entry_decode(desc, entry, &stream);
0844 if (status != 0)
0845 break;
0846
0847 status = nfs_readdir_page_array_append(page, entry, &cookie);
0848 if (status != -ENOSPC)
0849 continue;
0850
0851 if (page->mapping != mapping) {
0852 if (!--narrays)
0853 break;
0854 new = nfs_readdir_page_array_alloc(cookie, GFP_KERNEL);
0855 if (!new)
0856 break;
0857 arrays++;
0858 *arrays = page = new;
0859 } else {
0860 new = nfs_readdir_page_get_next(mapping, cookie,
0861 change_attr);
0862 if (!new)
0863 break;
0864 if (page != *arrays)
0865 nfs_readdir_page_unlock_and_put(page);
0866 page = new;
0867 }
0868 desc->page_index_max++;
0869 status = nfs_readdir_page_array_append(page, entry, &cookie);
0870 } while (!status && !entry->eof);
0871
0872 switch (status) {
0873 case -EBADCOOKIE:
0874 if (!entry->eof)
0875 break;
0876 nfs_readdir_page_set_eof(page);
0877 fallthrough;
0878 case -EAGAIN:
0879 status = 0;
0880 break;
0881 case -ENOSPC:
0882 status = 0;
0883 if (!desc->plus)
0884 break;
0885 while (!nfs_readdir_entry_decode(desc, entry, &stream))
0886 ;
0887 }
0888
0889 if (page != *arrays)
0890 nfs_readdir_page_unlock_and_put(page);
0891
0892 put_page(scratch);
0893 return status;
0894 }
0895
0896 static void nfs_readdir_free_pages(struct page **pages, size_t npages)
0897 {
0898 while (npages--)
0899 put_page(pages[npages]);
0900 kfree(pages);
0901 }
0902
0903
0904
0905
0906
0907 static struct page **nfs_readdir_alloc_pages(size_t npages)
0908 {
0909 struct page **pages;
0910 size_t i;
0911
0912 pages = kmalloc_array(npages, sizeof(*pages), GFP_KERNEL);
0913 if (!pages)
0914 return NULL;
0915 for (i = 0; i < npages; i++) {
0916 struct page *page = alloc_page(GFP_KERNEL);
0917 if (page == NULL)
0918 goto out_freepages;
0919 pages[i] = page;
0920 }
0921 return pages;
0922
0923 out_freepages:
0924 nfs_readdir_free_pages(pages, i);
0925 return NULL;
0926 }
0927
0928 static int nfs_readdir_xdr_to_array(struct nfs_readdir_descriptor *desc,
0929 __be32 *verf_arg, __be32 *verf_res,
0930 struct page **arrays, size_t narrays)
0931 {
0932 u64 change_attr;
0933 struct page **pages;
0934 struct page *page = *arrays;
0935 struct nfs_entry *entry;
0936 size_t array_size;
0937 struct inode *inode = file_inode(desc->file);
0938 unsigned int dtsize = desc->dtsize;
0939 unsigned int pglen;
0940 int status = -ENOMEM;
0941
0942 entry = kzalloc(sizeof(*entry), GFP_KERNEL);
0943 if (!entry)
0944 return -ENOMEM;
0945 entry->cookie = nfs_readdir_page_last_cookie(page);
0946 entry->fh = nfs_alloc_fhandle();
0947 entry->fattr = nfs_alloc_fattr_with_label(NFS_SERVER(inode));
0948 entry->server = NFS_SERVER(inode);
0949 if (entry->fh == NULL || entry->fattr == NULL)
0950 goto out;
0951
0952 array_size = (dtsize + PAGE_SIZE - 1) >> PAGE_SHIFT;
0953 pages = nfs_readdir_alloc_pages(array_size);
0954 if (!pages)
0955 goto out;
0956
0957 change_attr = inode_peek_iversion_raw(inode);
0958 status = nfs_readdir_xdr_filler(desc, verf_arg, entry->cookie, pages,
0959 dtsize, verf_res);
0960 if (status < 0)
0961 goto free_pages;
0962
0963 pglen = status;
0964 if (pglen != 0)
0965 status = nfs_readdir_page_filler(desc, entry, pages, pglen,
0966 arrays, narrays, change_attr);
0967 else
0968 nfs_readdir_page_set_eof(page);
0969 desc->buffer_fills++;
0970
0971 free_pages:
0972 nfs_readdir_free_pages(pages, array_size);
0973 out:
0974 nfs_free_fattr(entry->fattr);
0975 nfs_free_fhandle(entry->fh);
0976 kfree(entry);
0977 return status;
0978 }
0979
0980 static void nfs_readdir_page_put(struct nfs_readdir_descriptor *desc)
0981 {
0982 put_page(desc->page);
0983 desc->page = NULL;
0984 }
0985
0986 static void
0987 nfs_readdir_page_unlock_and_put_cached(struct nfs_readdir_descriptor *desc)
0988 {
0989 unlock_page(desc->page);
0990 nfs_readdir_page_put(desc);
0991 }
0992
0993 static struct page *
0994 nfs_readdir_page_get_cached(struct nfs_readdir_descriptor *desc)
0995 {
0996 struct address_space *mapping = desc->file->f_mapping;
0997 u64 change_attr = inode_peek_iversion_raw(mapping->host);
0998 u64 cookie = desc->last_cookie;
0999 struct page *page;
1000
1001 page = nfs_readdir_page_get_locked(mapping, cookie, change_attr);
1002 if (!page)
1003 return NULL;
1004 if (desc->clear_cache && !nfs_readdir_page_needs_filling(page))
1005 nfs_readdir_page_reinit_array(page, cookie, change_attr);
1006 return page;
1007 }
1008
1009
1010
1011
1012
1013 static int find_and_lock_cache_page(struct nfs_readdir_descriptor *desc)
1014 {
1015 struct inode *inode = file_inode(desc->file);
1016 struct nfs_inode *nfsi = NFS_I(inode);
1017 __be32 verf[NFS_DIR_VERIFIER_SIZE];
1018 int res;
1019
1020 desc->page = nfs_readdir_page_get_cached(desc);
1021 if (!desc->page)
1022 return -ENOMEM;
1023 if (nfs_readdir_page_needs_filling(desc->page)) {
1024
1025 if (desc->page_index == desc->page_index_max)
1026 nfs_grow_dtsize(desc);
1027 desc->page_index_max = desc->page_index;
1028 trace_nfs_readdir_cache_fill(desc->file, nfsi->cookieverf,
1029 desc->last_cookie,
1030 desc->page->index, desc->dtsize);
1031 res = nfs_readdir_xdr_to_array(desc, nfsi->cookieverf, verf,
1032 &desc->page, 1);
1033 if (res < 0) {
1034 nfs_readdir_page_unlock_and_put_cached(desc);
1035 trace_nfs_readdir_cache_fill_done(inode, res);
1036 if (res == -EBADCOOKIE || res == -ENOTSYNC) {
1037 invalidate_inode_pages2(desc->file->f_mapping);
1038 nfs_readdir_rewind_search(desc);
1039 trace_nfs_readdir_invalidate_cache_range(
1040 inode, 0, MAX_LFS_FILESIZE);
1041 return -EAGAIN;
1042 }
1043 return res;
1044 }
1045
1046
1047
1048 if (desc->last_cookie == 0 &&
1049 memcmp(nfsi->cookieverf, verf, sizeof(nfsi->cookieverf))) {
1050 memcpy(nfsi->cookieverf, verf,
1051 sizeof(nfsi->cookieverf));
1052 invalidate_inode_pages2_range(desc->file->f_mapping, 1,
1053 -1);
1054 trace_nfs_readdir_invalidate_cache_range(
1055 inode, 1, MAX_LFS_FILESIZE);
1056 }
1057 desc->clear_cache = false;
1058 }
1059 res = nfs_readdir_search_array(desc);
1060 if (res == 0)
1061 return 0;
1062 nfs_readdir_page_unlock_and_put_cached(desc);
1063 return res;
1064 }
1065
1066
1067 static int readdir_search_pagecache(struct nfs_readdir_descriptor *desc)
1068 {
1069 int res;
1070
1071 do {
1072 res = find_and_lock_cache_page(desc);
1073 } while (res == -EAGAIN);
1074 return res;
1075 }
1076
1077
1078
1079
1080 static void nfs_do_filldir(struct nfs_readdir_descriptor *desc,
1081 const __be32 *verf)
1082 {
1083 struct file *file = desc->file;
1084 struct nfs_cache_array *array;
1085 unsigned int i;
1086
1087 array = kmap_local_page(desc->page);
1088 for (i = desc->cache_entry_index; i < array->size; i++) {
1089 struct nfs_cache_array_entry *ent;
1090
1091 ent = &array->array[i];
1092 if (!dir_emit(desc->ctx, ent->name, ent->name_len,
1093 nfs_compat_user_ino64(ent->ino), ent->d_type)) {
1094 desc->eob = true;
1095 break;
1096 }
1097 memcpy(desc->verf, verf, sizeof(desc->verf));
1098 if (i == array->size - 1) {
1099 desc->dir_cookie = array->last_cookie;
1100 nfs_readdir_seek_next_array(array, desc);
1101 } else {
1102 desc->dir_cookie = array->array[i + 1].cookie;
1103 desc->last_cookie = array->array[0].cookie;
1104 }
1105 if (nfs_readdir_use_cookie(file))
1106 desc->ctx->pos = desc->dir_cookie;
1107 else
1108 desc->ctx->pos++;
1109 }
1110 if (array->page_is_eof)
1111 desc->eof = !desc->eob;
1112
1113 kunmap_local(array);
1114 dfprintk(DIRCACHE, "NFS: nfs_do_filldir() filling ended @ cookie %llu\n",
1115 (unsigned long long)desc->dir_cookie);
1116 }
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130 static int uncached_readdir(struct nfs_readdir_descriptor *desc)
1131 {
1132 struct page **arrays;
1133 size_t i, sz = 512;
1134 __be32 verf[NFS_DIR_VERIFIER_SIZE];
1135 int status = -ENOMEM;
1136
1137 dfprintk(DIRCACHE, "NFS: uncached_readdir() searching for cookie %llu\n",
1138 (unsigned long long)desc->dir_cookie);
1139
1140 arrays = kcalloc(sz, sizeof(*arrays), GFP_KERNEL);
1141 if (!arrays)
1142 goto out;
1143 arrays[0] = nfs_readdir_page_array_alloc(desc->dir_cookie, GFP_KERNEL);
1144 if (!arrays[0])
1145 goto out;
1146
1147 desc->page_index = 0;
1148 desc->cache_entry_index = 0;
1149 desc->last_cookie = desc->dir_cookie;
1150 desc->page_index_max = 0;
1151
1152 trace_nfs_readdir_uncached(desc->file, desc->verf, desc->last_cookie,
1153 -1, desc->dtsize);
1154
1155 status = nfs_readdir_xdr_to_array(desc, desc->verf, verf, arrays, sz);
1156 if (status < 0) {
1157 trace_nfs_readdir_uncached_done(file_inode(desc->file), status);
1158 goto out_free;
1159 }
1160
1161 for (i = 0; !desc->eob && i < sz && arrays[i]; i++) {
1162 desc->page = arrays[i];
1163 nfs_do_filldir(desc, verf);
1164 }
1165 desc->page = NULL;
1166
1167
1168
1169
1170
1171 if (!desc->eof) {
1172 if (!desc->eob)
1173 nfs_grow_dtsize(desc);
1174 else if (desc->buffer_fills == 1 &&
1175 i < (desc->page_index_max >> 1))
1176 nfs_shrink_dtsize(desc);
1177 }
1178 out_free:
1179 for (i = 0; i < sz && arrays[i]; i++)
1180 nfs_readdir_page_array_free(arrays[i]);
1181 out:
1182 if (!nfs_readdir_use_cookie(desc->file))
1183 nfs_readdir_rewind_search(desc);
1184 desc->page_index_max = -1;
1185 kfree(arrays);
1186 dfprintk(DIRCACHE, "NFS: %s: returns %d\n", __func__, status);
1187 return status;
1188 }
1189
1190 #define NFS_READDIR_CACHE_MISS_THRESHOLD (16UL)
1191
1192 static bool nfs_readdir_handle_cache_misses(struct inode *inode,
1193 struct nfs_readdir_descriptor *desc,
1194 unsigned int cache_misses,
1195 bool force_clear)
1196 {
1197 if (desc->ctx->pos == 0 || !desc->plus)
1198 return false;
1199 if (cache_misses <= NFS_READDIR_CACHE_MISS_THRESHOLD && !force_clear)
1200 return false;
1201 trace_nfs_readdir_force_readdirplus(inode);
1202 return true;
1203 }
1204
1205
1206
1207
1208
1209 static int nfs_readdir(struct file *file, struct dir_context *ctx)
1210 {
1211 struct dentry *dentry = file_dentry(file);
1212 struct inode *inode = d_inode(dentry);
1213 struct nfs_inode *nfsi = NFS_I(inode);
1214 struct nfs_open_dir_context *dir_ctx = file->private_data;
1215 struct nfs_readdir_descriptor *desc;
1216 unsigned int cache_hits, cache_misses;
1217 bool force_clear;
1218 int res;
1219
1220 dfprintk(FILE, "NFS: readdir(%pD2) starting at cookie %llu\n",
1221 file, (long long)ctx->pos);
1222 nfs_inc_stats(inode, NFSIOS_VFSGETDENTS);
1223
1224
1225
1226
1227
1228
1229
1230 nfs_revalidate_mapping(inode, file->f_mapping);
1231
1232 res = -ENOMEM;
1233 desc = kzalloc(sizeof(*desc), GFP_KERNEL);
1234 if (!desc)
1235 goto out;
1236 desc->file = file;
1237 desc->ctx = ctx;
1238 desc->page_index_max = -1;
1239
1240 spin_lock(&file->f_lock);
1241 desc->dir_cookie = dir_ctx->dir_cookie;
1242 desc->page_index = dir_ctx->page_index;
1243 desc->last_cookie = dir_ctx->last_cookie;
1244 desc->attr_gencount = dir_ctx->attr_gencount;
1245 desc->eof = dir_ctx->eof;
1246 nfs_set_dtsize(desc, dir_ctx->dtsize);
1247 memcpy(desc->verf, dir_ctx->verf, sizeof(desc->verf));
1248 cache_hits = atomic_xchg(&dir_ctx->cache_hits, 0);
1249 cache_misses = atomic_xchg(&dir_ctx->cache_misses, 0);
1250 force_clear = dir_ctx->force_clear;
1251 spin_unlock(&file->f_lock);
1252
1253 if (desc->eof) {
1254 res = 0;
1255 goto out_free;
1256 }
1257
1258 desc->plus = nfs_use_readdirplus(inode, ctx, cache_hits, cache_misses);
1259 force_clear = nfs_readdir_handle_cache_misses(inode, desc, cache_misses,
1260 force_clear);
1261 desc->clear_cache = force_clear;
1262
1263 do {
1264 res = readdir_search_pagecache(desc);
1265
1266 if (res == -EBADCOOKIE) {
1267 res = 0;
1268
1269 if (desc->dir_cookie && !desc->eof) {
1270
1271 res = uncached_readdir(desc);
1272 if (res == 0)
1273 continue;
1274 if (res == -EBADCOOKIE || res == -ENOTSYNC)
1275 res = 0;
1276 }
1277 break;
1278 }
1279 if (res == -ETOOSMALL && desc->plus) {
1280 nfs_zap_caches(inode);
1281 desc->plus = false;
1282 desc->eof = false;
1283 continue;
1284 }
1285 if (res < 0)
1286 break;
1287
1288 nfs_do_filldir(desc, nfsi->cookieverf);
1289 nfs_readdir_page_unlock_and_put_cached(desc);
1290 if (desc->page_index == desc->page_index_max)
1291 desc->clear_cache = force_clear;
1292 } while (!desc->eob && !desc->eof);
1293
1294 spin_lock(&file->f_lock);
1295 dir_ctx->dir_cookie = desc->dir_cookie;
1296 dir_ctx->last_cookie = desc->last_cookie;
1297 dir_ctx->attr_gencount = desc->attr_gencount;
1298 dir_ctx->page_index = desc->page_index;
1299 dir_ctx->force_clear = force_clear;
1300 dir_ctx->eof = desc->eof;
1301 dir_ctx->dtsize = desc->dtsize;
1302 memcpy(dir_ctx->verf, desc->verf, sizeof(dir_ctx->verf));
1303 spin_unlock(&file->f_lock);
1304 out_free:
1305 kfree(desc);
1306
1307 out:
1308 dfprintk(FILE, "NFS: readdir(%pD2) returns %d\n", file, res);
1309 return res;
1310 }
1311
1312 static loff_t nfs_llseek_dir(struct file *filp, loff_t offset, int whence)
1313 {
1314 struct nfs_open_dir_context *dir_ctx = filp->private_data;
1315
1316 dfprintk(FILE, "NFS: llseek dir(%pD2, %lld, %d)\n",
1317 filp, offset, whence);
1318
1319 switch (whence) {
1320 default:
1321 return -EINVAL;
1322 case SEEK_SET:
1323 if (offset < 0)
1324 return -EINVAL;
1325 spin_lock(&filp->f_lock);
1326 break;
1327 case SEEK_CUR:
1328 if (offset == 0)
1329 return filp->f_pos;
1330 spin_lock(&filp->f_lock);
1331 offset += filp->f_pos;
1332 if (offset < 0) {
1333 spin_unlock(&filp->f_lock);
1334 return -EINVAL;
1335 }
1336 }
1337 if (offset != filp->f_pos) {
1338 filp->f_pos = offset;
1339 dir_ctx->page_index = 0;
1340 if (!nfs_readdir_use_cookie(filp)) {
1341 dir_ctx->dir_cookie = 0;
1342 dir_ctx->last_cookie = 0;
1343 } else {
1344 dir_ctx->dir_cookie = offset;
1345 dir_ctx->last_cookie = offset;
1346 }
1347 dir_ctx->eof = false;
1348 }
1349 spin_unlock(&filp->f_lock);
1350 return offset;
1351 }
1352
1353
1354
1355
1356
1357 static int nfs_fsync_dir(struct file *filp, loff_t start, loff_t end,
1358 int datasync)
1359 {
1360 dfprintk(FILE, "NFS: fsync dir(%pD2) datasync %d\n", filp, datasync);
1361
1362 nfs_inc_stats(file_inode(filp), NFSIOS_VFSFSYNC);
1363 return 0;
1364 }
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379 void nfs_force_lookup_revalidate(struct inode *dir)
1380 {
1381 NFS_I(dir)->cache_change_attribute += 2;
1382 }
1383 EXPORT_SYMBOL_GPL(nfs_force_lookup_revalidate);
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394 static bool nfs_verify_change_attribute(struct inode *dir, unsigned long verf)
1395 {
1396 return (verf & ~1UL) == nfs_save_change_attribute(dir);
1397 }
1398
1399 static void nfs_set_verifier_delegated(unsigned long *verf)
1400 {
1401 *verf |= 1UL;
1402 }
1403
1404 #if IS_ENABLED(CONFIG_NFS_V4)
1405 static void nfs_unset_verifier_delegated(unsigned long *verf)
1406 {
1407 *verf &= ~1UL;
1408 }
1409 #endif
1410
1411 static bool nfs_test_verifier_delegated(unsigned long verf)
1412 {
1413 return verf & 1;
1414 }
1415
1416 static bool nfs_verifier_is_delegated(struct dentry *dentry)
1417 {
1418 return nfs_test_verifier_delegated(dentry->d_time);
1419 }
1420
1421 static void nfs_set_verifier_locked(struct dentry *dentry, unsigned long verf)
1422 {
1423 struct inode *inode = d_inode(dentry);
1424 struct inode *dir = d_inode(dentry->d_parent);
1425
1426 if (!nfs_verify_change_attribute(dir, verf))
1427 return;
1428 if (inode && NFS_PROTO(inode)->have_delegation(inode, FMODE_READ))
1429 nfs_set_verifier_delegated(&verf);
1430 dentry->d_time = verf;
1431 }
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443 void nfs_set_verifier(struct dentry *dentry, unsigned long verf)
1444 {
1445
1446 spin_lock(&dentry->d_lock);
1447 nfs_set_verifier_locked(dentry, verf);
1448 spin_unlock(&dentry->d_lock);
1449 }
1450 EXPORT_SYMBOL_GPL(nfs_set_verifier);
1451
1452 #if IS_ENABLED(CONFIG_NFS_V4)
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463 void nfs_clear_verifier_delegated(struct inode *inode)
1464 {
1465 struct dentry *alias;
1466
1467 if (!inode)
1468 return;
1469 spin_lock(&inode->i_lock);
1470 hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
1471 spin_lock(&alias->d_lock);
1472 nfs_unset_verifier_delegated(&alias->d_time);
1473 spin_unlock(&alias->d_lock);
1474 }
1475 spin_unlock(&inode->i_lock);
1476 }
1477 EXPORT_SYMBOL_GPL(nfs_clear_verifier_delegated);
1478 #endif
1479
1480 static int nfs_dentry_verify_change(struct inode *dir, struct dentry *dentry)
1481 {
1482 if (nfs_server_capable(dir, NFS_CAP_CASE_INSENSITIVE) &&
1483 d_really_is_negative(dentry))
1484 return dentry->d_time == inode_peek_iversion_raw(dir);
1485 return nfs_verify_change_attribute(dir, dentry->d_time);
1486 }
1487
1488
1489
1490
1491
1492
1493
1494 static int nfs_check_verifier(struct inode *dir, struct dentry *dentry,
1495 int rcu_walk)
1496 {
1497 if (IS_ROOT(dentry))
1498 return 1;
1499 if (NFS_SERVER(dir)->flags & NFS_MOUNT_LOOKUP_CACHE_NONE)
1500 return 0;
1501 if (!nfs_dentry_verify_change(dir, dentry))
1502 return 0;
1503
1504 if (nfs_mapping_need_revalidate_inode(dir)) {
1505 if (rcu_walk)
1506 return 0;
1507 if (__nfs_revalidate_inode(NFS_SERVER(dir), dir) < 0)
1508 return 0;
1509 }
1510 if (!nfs_dentry_verify_change(dir, dentry))
1511 return 0;
1512 return 1;
1513 }
1514
1515
1516
1517
1518
1519 static int nfs_is_exclusive_create(struct inode *dir, unsigned int flags)
1520 {
1521 if (NFS_PROTO(dir)->version == 2)
1522 return 0;
1523 return flags & LOOKUP_EXCL;
1524 }
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534 static
1535 int nfs_lookup_verify_inode(struct inode *inode, unsigned int flags)
1536 {
1537 struct nfs_server *server = NFS_SERVER(inode);
1538 int ret;
1539
1540 if (IS_AUTOMOUNT(inode))
1541 return 0;
1542
1543 if (flags & LOOKUP_OPEN) {
1544 switch (inode->i_mode & S_IFMT) {
1545 case S_IFREG:
1546
1547 if (server->caps & NFS_CAP_ATOMIC_OPEN)
1548 goto out;
1549 fallthrough;
1550 case S_IFDIR:
1551 if (server->flags & NFS_MOUNT_NOCTO)
1552 break;
1553
1554 goto out_force;
1555 }
1556 }
1557
1558
1559 if (flags & LOOKUP_REVAL)
1560 goto out_force;
1561 out:
1562 if (inode->i_nlink > 0 ||
1563 (inode->i_nlink == 0 &&
1564 test_bit(NFS_INO_PRESERVE_UNLINKED, &NFS_I(inode)->flags)))
1565 return 0;
1566 else
1567 return -ESTALE;
1568 out_force:
1569 if (flags & LOOKUP_RCU)
1570 return -ECHILD;
1571 ret = __nfs_revalidate_inode(server, inode);
1572 if (ret != 0)
1573 return ret;
1574 goto out;
1575 }
1576
1577 static void nfs_mark_dir_for_revalidate(struct inode *inode)
1578 {
1579 spin_lock(&inode->i_lock);
1580 nfs_set_cache_invalid(inode, NFS_INO_INVALID_CHANGE);
1581 spin_unlock(&inode->i_lock);
1582 }
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597 static inline
1598 int nfs_neg_need_reval(struct inode *dir, struct dentry *dentry,
1599 unsigned int flags)
1600 {
1601 if (flags & (LOOKUP_CREATE | LOOKUP_RENAME_TARGET))
1602 return 0;
1603 if (NFS_SERVER(dir)->flags & NFS_MOUNT_LOOKUP_CACHE_NONEG)
1604 return 1;
1605
1606 if (nfs_server_capable(dir, NFS_CAP_CASE_INSENSITIVE))
1607 return 1;
1608 return !nfs_check_verifier(dir, dentry, flags & LOOKUP_RCU);
1609 }
1610
1611 static int
1612 nfs_lookup_revalidate_done(struct inode *dir, struct dentry *dentry,
1613 struct inode *inode, int error)
1614 {
1615 switch (error) {
1616 case 1:
1617 break;
1618 case 0:
1619
1620
1621
1622
1623
1624
1625 if (inode && IS_ROOT(dentry))
1626 error = 1;
1627 break;
1628 }
1629 trace_nfs_lookup_revalidate_exit(dir, dentry, 0, error);
1630 return error;
1631 }
1632
1633 static int
1634 nfs_lookup_revalidate_negative(struct inode *dir, struct dentry *dentry,
1635 unsigned int flags)
1636 {
1637 int ret = 1;
1638 if (nfs_neg_need_reval(dir, dentry, flags)) {
1639 if (flags & LOOKUP_RCU)
1640 return -ECHILD;
1641 ret = 0;
1642 }
1643 return nfs_lookup_revalidate_done(dir, dentry, NULL, ret);
1644 }
1645
1646 static int
1647 nfs_lookup_revalidate_delegated(struct inode *dir, struct dentry *dentry,
1648 struct inode *inode)
1649 {
1650 nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
1651 return nfs_lookup_revalidate_done(dir, dentry, inode, 1);
1652 }
1653
1654 static int nfs_lookup_revalidate_dentry(struct inode *dir,
1655 struct dentry *dentry,
1656 struct inode *inode, unsigned int flags)
1657 {
1658 struct nfs_fh *fhandle;
1659 struct nfs_fattr *fattr;
1660 unsigned long dir_verifier;
1661 int ret;
1662
1663 trace_nfs_lookup_revalidate_enter(dir, dentry, flags);
1664
1665 ret = -ENOMEM;
1666 fhandle = nfs_alloc_fhandle();
1667 fattr = nfs_alloc_fattr_with_label(NFS_SERVER(inode));
1668 if (fhandle == NULL || fattr == NULL)
1669 goto out;
1670
1671 dir_verifier = nfs_save_change_attribute(dir);
1672 ret = NFS_PROTO(dir)->lookup(dir, dentry, fhandle, fattr);
1673 if (ret < 0) {
1674 switch (ret) {
1675 case -ESTALE:
1676 case -ENOENT:
1677 ret = 0;
1678 break;
1679 case -ETIMEDOUT:
1680 if (NFS_SERVER(inode)->flags & NFS_MOUNT_SOFTREVAL)
1681 ret = 1;
1682 }
1683 goto out;
1684 }
1685
1686
1687 nfs_lookup_advise_force_readdirplus(dir, flags);
1688
1689 ret = 0;
1690 if (nfs_compare_fh(NFS_FH(inode), fhandle))
1691 goto out;
1692 if (nfs_refresh_inode(inode, fattr) < 0)
1693 goto out;
1694
1695 nfs_setsecurity(inode, fattr);
1696 nfs_set_verifier(dentry, dir_verifier);
1697
1698 ret = 1;
1699 out:
1700 nfs_free_fattr(fattr);
1701 nfs_free_fhandle(fhandle);
1702
1703
1704
1705
1706
1707 if (!ret && nfs_dentry_verify_change(dir, dentry))
1708 nfs_mark_dir_for_revalidate(dir);
1709 return nfs_lookup_revalidate_done(dir, dentry, inode, ret);
1710 }
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723 static int
1724 nfs_do_lookup_revalidate(struct inode *dir, struct dentry *dentry,
1725 unsigned int flags)
1726 {
1727 struct inode *inode;
1728 int error;
1729
1730 nfs_inc_stats(dir, NFSIOS_DENTRYREVALIDATE);
1731 inode = d_inode(dentry);
1732
1733 if (!inode)
1734 return nfs_lookup_revalidate_negative(dir, dentry, flags);
1735
1736 if (is_bad_inode(inode)) {
1737 dfprintk(LOOKUPCACHE, "%s: %pd2 has dud inode\n",
1738 __func__, dentry);
1739 goto out_bad;
1740 }
1741
1742 if ((flags & LOOKUP_RENAME_TARGET) && d_count(dentry) < 2 &&
1743 nfs_server_capable(dir, NFS_CAP_CASE_INSENSITIVE))
1744 goto out_bad;
1745
1746 if (nfs_verifier_is_delegated(dentry))
1747 return nfs_lookup_revalidate_delegated(dir, dentry, inode);
1748
1749
1750 if (!(flags & (LOOKUP_EXCL | LOOKUP_REVAL)) &&
1751 nfs_check_verifier(dir, dentry, flags & LOOKUP_RCU)) {
1752 error = nfs_lookup_verify_inode(inode, flags);
1753 if (error) {
1754 if (error == -ESTALE)
1755 nfs_mark_dir_for_revalidate(dir);
1756 goto out_bad;
1757 }
1758 goto out_valid;
1759 }
1760
1761 if (flags & LOOKUP_RCU)
1762 return -ECHILD;
1763
1764 if (NFS_STALE(inode))
1765 goto out_bad;
1766
1767 return nfs_lookup_revalidate_dentry(dir, dentry, inode, flags);
1768 out_valid:
1769 return nfs_lookup_revalidate_done(dir, dentry, inode, 1);
1770 out_bad:
1771 if (flags & LOOKUP_RCU)
1772 return -ECHILD;
1773 return nfs_lookup_revalidate_done(dir, dentry, inode, 0);
1774 }
1775
1776 static int
1777 __nfs_lookup_revalidate(struct dentry *dentry, unsigned int flags,
1778 int (*reval)(struct inode *, struct dentry *, unsigned int))
1779 {
1780 struct dentry *parent;
1781 struct inode *dir;
1782 int ret;
1783
1784 if (flags & LOOKUP_RCU) {
1785 if (dentry->d_fsdata == NFS_FSDATA_BLOCKED)
1786 return -ECHILD;
1787 parent = READ_ONCE(dentry->d_parent);
1788 dir = d_inode_rcu(parent);
1789 if (!dir)
1790 return -ECHILD;
1791 ret = reval(dir, dentry, flags);
1792 if (parent != READ_ONCE(dentry->d_parent))
1793 return -ECHILD;
1794 } else {
1795
1796 wait_var_event(&dentry->d_fsdata,
1797 dentry->d_fsdata != NFS_FSDATA_BLOCKED);
1798 parent = dget_parent(dentry);
1799 ret = reval(d_inode(parent), dentry, flags);
1800 dput(parent);
1801 }
1802 return ret;
1803 }
1804
1805 static int nfs_lookup_revalidate(struct dentry *dentry, unsigned int flags)
1806 {
1807 return __nfs_lookup_revalidate(dentry, flags, nfs_do_lookup_revalidate);
1808 }
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819 static int nfs_weak_revalidate(struct dentry *dentry, unsigned int flags)
1820 {
1821 struct inode *inode = d_inode(dentry);
1822 int error = 0;
1823
1824
1825
1826
1827
1828
1829 if (!inode) {
1830 dfprintk(LOOKUPCACHE, "%s: %pd2 has negative inode\n",
1831 __func__, dentry);
1832 return 1;
1833 }
1834
1835 if (is_bad_inode(inode)) {
1836 dfprintk(LOOKUPCACHE, "%s: %pd2 has dud inode\n",
1837 __func__, dentry);
1838 return 0;
1839 }
1840
1841 error = nfs_lookup_verify_inode(inode, flags);
1842 dfprintk(LOOKUPCACHE, "NFS: %s: inode %lu is %s\n",
1843 __func__, inode->i_ino, error ? "invalid" : "valid");
1844 return !error;
1845 }
1846
1847
1848
1849
1850 static int nfs_dentry_delete(const struct dentry *dentry)
1851 {
1852 dfprintk(VFS, "NFS: dentry_delete(%pd2, %x)\n",
1853 dentry, dentry->d_flags);
1854
1855
1856 if (d_really_is_positive(dentry) && NFS_STALE(d_inode(dentry)))
1857 return 1;
1858
1859 if (dentry->d_flags & DCACHE_NFSFS_RENAMED) {
1860
1861 return 1;
1862 }
1863 if (!(dentry->d_sb->s_flags & SB_ACTIVE)) {
1864
1865
1866 return 1;
1867 }
1868 return 0;
1869
1870 }
1871
1872
1873 static void nfs_drop_nlink(struct inode *inode)
1874 {
1875 spin_lock(&inode->i_lock);
1876
1877 if (inode->i_nlink > 0)
1878 drop_nlink(inode);
1879 NFS_I(inode)->attr_gencount = nfs_inc_attr_generation_counter();
1880 nfs_set_cache_invalid(
1881 inode, NFS_INO_INVALID_CHANGE | NFS_INO_INVALID_CTIME |
1882 NFS_INO_INVALID_NLINK);
1883 spin_unlock(&inode->i_lock);
1884 }
1885
1886
1887
1888
1889
1890 static void nfs_dentry_iput(struct dentry *dentry, struct inode *inode)
1891 {
1892 if (dentry->d_flags & DCACHE_NFSFS_RENAMED) {
1893 nfs_complete_unlink(dentry, inode);
1894 nfs_drop_nlink(inode);
1895 }
1896 iput(inode);
1897 }
1898
1899 static void nfs_d_release(struct dentry *dentry)
1900 {
1901
1902 if (unlikely(dentry->d_fsdata)) {
1903 if (dentry->d_flags & DCACHE_NFSFS_RENAMED)
1904 WARN_ON(1);
1905 else
1906 kfree(dentry->d_fsdata);
1907 }
1908 }
1909
1910 const struct dentry_operations nfs_dentry_operations = {
1911 .d_revalidate = nfs_lookup_revalidate,
1912 .d_weak_revalidate = nfs_weak_revalidate,
1913 .d_delete = nfs_dentry_delete,
1914 .d_iput = nfs_dentry_iput,
1915 .d_automount = nfs_d_automount,
1916 .d_release = nfs_d_release,
1917 };
1918 EXPORT_SYMBOL_GPL(nfs_dentry_operations);
1919
1920 struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, unsigned int flags)
1921 {
1922 struct dentry *res;
1923 struct inode *inode = NULL;
1924 struct nfs_fh *fhandle = NULL;
1925 struct nfs_fattr *fattr = NULL;
1926 unsigned long dir_verifier;
1927 int error;
1928
1929 dfprintk(VFS, "NFS: lookup(%pd2)\n", dentry);
1930 nfs_inc_stats(dir, NFSIOS_VFSLOOKUP);
1931
1932 if (unlikely(dentry->d_name.len > NFS_SERVER(dir)->namelen))
1933 return ERR_PTR(-ENAMETOOLONG);
1934
1935
1936
1937
1938
1939 if (nfs_is_exclusive_create(dir, flags) || flags & LOOKUP_RENAME_TARGET)
1940 return NULL;
1941
1942 res = ERR_PTR(-ENOMEM);
1943 fhandle = nfs_alloc_fhandle();
1944 fattr = nfs_alloc_fattr_with_label(NFS_SERVER(dir));
1945 if (fhandle == NULL || fattr == NULL)
1946 goto out;
1947
1948 dir_verifier = nfs_save_change_attribute(dir);
1949 trace_nfs_lookup_enter(dir, dentry, flags);
1950 error = NFS_PROTO(dir)->lookup(dir, dentry, fhandle, fattr);
1951 if (error == -ENOENT) {
1952 if (nfs_server_capable(dir, NFS_CAP_CASE_INSENSITIVE))
1953 dir_verifier = inode_peek_iversion_raw(dir);
1954 goto no_entry;
1955 }
1956 if (error < 0) {
1957 res = ERR_PTR(error);
1958 goto out;
1959 }
1960 inode = nfs_fhget(dentry->d_sb, fhandle, fattr);
1961 res = ERR_CAST(inode);
1962 if (IS_ERR(res))
1963 goto out;
1964
1965
1966 nfs_lookup_advise_force_readdirplus(dir, flags);
1967
1968 no_entry:
1969 res = d_splice_alias(inode, dentry);
1970 if (res != NULL) {
1971 if (IS_ERR(res))
1972 goto out;
1973 dentry = res;
1974 }
1975 nfs_set_verifier(dentry, dir_verifier);
1976 out:
1977 trace_nfs_lookup_exit(dir, dentry, flags, PTR_ERR_OR_ZERO(res));
1978 nfs_free_fattr(fattr);
1979 nfs_free_fhandle(fhandle);
1980 return res;
1981 }
1982 EXPORT_SYMBOL_GPL(nfs_lookup);
1983
1984 void nfs_d_prune_case_insensitive_aliases(struct inode *inode)
1985 {
1986
1987 if (inode && nfs_server_capable(inode, NFS_CAP_CASE_INSENSITIVE))
1988 d_prune_aliases(inode);
1989 }
1990 EXPORT_SYMBOL_GPL(nfs_d_prune_case_insensitive_aliases);
1991
1992 #if IS_ENABLED(CONFIG_NFS_V4)
1993 static int nfs4_lookup_revalidate(struct dentry *, unsigned int);
1994
1995 const struct dentry_operations nfs4_dentry_operations = {
1996 .d_revalidate = nfs4_lookup_revalidate,
1997 .d_weak_revalidate = nfs_weak_revalidate,
1998 .d_delete = nfs_dentry_delete,
1999 .d_iput = nfs_dentry_iput,
2000 .d_automount = nfs_d_automount,
2001 .d_release = nfs_d_release,
2002 };
2003 EXPORT_SYMBOL_GPL(nfs4_dentry_operations);
2004
2005 static struct nfs_open_context *create_nfs_open_context(struct dentry *dentry, int open_flags, struct file *filp)
2006 {
2007 return alloc_nfs_open_context(dentry, flags_to_mode(open_flags), filp);
2008 }
2009
2010 static int do_open(struct inode *inode, struct file *filp)
2011 {
2012 nfs_fscache_open_file(inode, filp);
2013 return 0;
2014 }
2015
2016 static int nfs_finish_open(struct nfs_open_context *ctx,
2017 struct dentry *dentry,
2018 struct file *file, unsigned open_flags)
2019 {
2020 int err;
2021
2022 err = finish_open(file, dentry, do_open);
2023 if (err)
2024 goto out;
2025 if (S_ISREG(file->f_path.dentry->d_inode->i_mode))
2026 nfs_file_set_open_context(file, ctx);
2027 else
2028 err = -EOPENSTALE;
2029 out:
2030 return err;
2031 }
2032
2033 int nfs_atomic_open(struct inode *dir, struct dentry *dentry,
2034 struct file *file, unsigned open_flags,
2035 umode_t mode)
2036 {
2037 DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
2038 struct nfs_open_context *ctx;
2039 struct dentry *res;
2040 struct iattr attr = { .ia_valid = ATTR_OPEN };
2041 struct inode *inode;
2042 unsigned int lookup_flags = 0;
2043 unsigned long dir_verifier;
2044 bool switched = false;
2045 int created = 0;
2046 int err;
2047
2048
2049 BUG_ON(d_inode(dentry));
2050
2051 dfprintk(VFS, "NFS: atomic_open(%s/%lu), %pd\n",
2052 dir->i_sb->s_id, dir->i_ino, dentry);
2053
2054 err = nfs_check_flags(open_flags);
2055 if (err)
2056 return err;
2057
2058
2059 if ((open_flags & O_DIRECTORY)) {
2060 if (!d_in_lookup(dentry)) {
2061
2062
2063
2064
2065
2066 return -ENOENT;
2067 }
2068 lookup_flags = LOOKUP_OPEN|LOOKUP_DIRECTORY;
2069 goto no_open;
2070 }
2071
2072 if (dentry->d_name.len > NFS_SERVER(dir)->namelen)
2073 return -ENAMETOOLONG;
2074
2075 if (open_flags & O_CREAT) {
2076 struct nfs_server *server = NFS_SERVER(dir);
2077
2078 if (!(server->attr_bitmask[2] & FATTR4_WORD2_MODE_UMASK))
2079 mode &= ~current_umask();
2080
2081 attr.ia_valid |= ATTR_MODE;
2082 attr.ia_mode = mode;
2083 }
2084 if (open_flags & O_TRUNC) {
2085 attr.ia_valid |= ATTR_SIZE;
2086 attr.ia_size = 0;
2087 }
2088
2089 if (!(open_flags & O_CREAT) && !d_in_lookup(dentry)) {
2090 d_drop(dentry);
2091 switched = true;
2092 dentry = d_alloc_parallel(dentry->d_parent,
2093 &dentry->d_name, &wq);
2094 if (IS_ERR(dentry))
2095 return PTR_ERR(dentry);
2096 if (unlikely(!d_in_lookup(dentry)))
2097 return finish_no_open(file, dentry);
2098 }
2099
2100 ctx = create_nfs_open_context(dentry, open_flags, file);
2101 err = PTR_ERR(ctx);
2102 if (IS_ERR(ctx))
2103 goto out;
2104
2105 trace_nfs_atomic_open_enter(dir, ctx, open_flags);
2106 inode = NFS_PROTO(dir)->open_context(dir, ctx, open_flags, &attr, &created);
2107 if (created)
2108 file->f_mode |= FMODE_CREATED;
2109 if (IS_ERR(inode)) {
2110 err = PTR_ERR(inode);
2111 trace_nfs_atomic_open_exit(dir, ctx, open_flags, err);
2112 put_nfs_open_context(ctx);
2113 d_drop(dentry);
2114 switch (err) {
2115 case -ENOENT:
2116 d_splice_alias(NULL, dentry);
2117 if (nfs_server_capable(dir, NFS_CAP_CASE_INSENSITIVE))
2118 dir_verifier = inode_peek_iversion_raw(dir);
2119 else
2120 dir_verifier = nfs_save_change_attribute(dir);
2121 nfs_set_verifier(dentry, dir_verifier);
2122 break;
2123 case -EISDIR:
2124 case -ENOTDIR:
2125 goto no_open;
2126 case -ELOOP:
2127 if (!(open_flags & O_NOFOLLOW))
2128 goto no_open;
2129 break;
2130
2131 default:
2132 break;
2133 }
2134 goto out;
2135 }
2136 file->f_mode |= FMODE_CAN_ODIRECT;
2137
2138 err = nfs_finish_open(ctx, ctx->dentry, file, open_flags);
2139 trace_nfs_atomic_open_exit(dir, ctx, open_flags, err);
2140 put_nfs_open_context(ctx);
2141 out:
2142 if (unlikely(switched)) {
2143 d_lookup_done(dentry);
2144 dput(dentry);
2145 }
2146 return err;
2147
2148 no_open:
2149 res = nfs_lookup(dir, dentry, lookup_flags);
2150 if (!res) {
2151 inode = d_inode(dentry);
2152 if ((lookup_flags & LOOKUP_DIRECTORY) && inode &&
2153 !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)))
2154 res = ERR_PTR(-ENOTDIR);
2155 else if (inode && S_ISREG(inode->i_mode))
2156 res = ERR_PTR(-EOPENSTALE);
2157 } else if (!IS_ERR(res)) {
2158 inode = d_inode(res);
2159 if ((lookup_flags & LOOKUP_DIRECTORY) && inode &&
2160 !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) {
2161 dput(res);
2162 res = ERR_PTR(-ENOTDIR);
2163 } else if (inode && S_ISREG(inode->i_mode)) {
2164 dput(res);
2165 res = ERR_PTR(-EOPENSTALE);
2166 }
2167 }
2168 if (switched) {
2169 d_lookup_done(dentry);
2170 if (!res)
2171 res = dentry;
2172 else
2173 dput(dentry);
2174 }
2175 if (IS_ERR(res))
2176 return PTR_ERR(res);
2177 return finish_no_open(file, res);
2178 }
2179 EXPORT_SYMBOL_GPL(nfs_atomic_open);
2180
2181 static int
2182 nfs4_do_lookup_revalidate(struct inode *dir, struct dentry *dentry,
2183 unsigned int flags)
2184 {
2185 struct inode *inode;
2186
2187 if (!(flags & LOOKUP_OPEN) || (flags & LOOKUP_DIRECTORY))
2188 goto full_reval;
2189 if (d_mountpoint(dentry))
2190 goto full_reval;
2191
2192 inode = d_inode(dentry);
2193
2194
2195
2196
2197 if (inode == NULL)
2198 goto full_reval;
2199
2200 if (nfs_verifier_is_delegated(dentry))
2201 return nfs_lookup_revalidate_delegated(dir, dentry, inode);
2202
2203
2204 if (!S_ISREG(inode->i_mode))
2205 goto full_reval;
2206
2207
2208 if (flags & (LOOKUP_EXCL | LOOKUP_REVAL))
2209 goto reval_dentry;
2210
2211
2212 if (!nfs_check_verifier(dir, dentry, flags & LOOKUP_RCU))
2213 goto reval_dentry;
2214
2215
2216 return 1;
2217 reval_dentry:
2218 if (flags & LOOKUP_RCU)
2219 return -ECHILD;
2220 return nfs_lookup_revalidate_dentry(dir, dentry, inode, flags);
2221
2222 full_reval:
2223 return nfs_do_lookup_revalidate(dir, dentry, flags);
2224 }
2225
2226 static int nfs4_lookup_revalidate(struct dentry *dentry, unsigned int flags)
2227 {
2228 return __nfs_lookup_revalidate(dentry, flags,
2229 nfs4_do_lookup_revalidate);
2230 }
2231
2232 #endif
2233
2234 struct dentry *
2235 nfs_add_or_obtain(struct dentry *dentry, struct nfs_fh *fhandle,
2236 struct nfs_fattr *fattr)
2237 {
2238 struct dentry *parent = dget_parent(dentry);
2239 struct inode *dir = d_inode(parent);
2240 struct inode *inode;
2241 struct dentry *d;
2242 int error;
2243
2244 d_drop(dentry);
2245
2246 if (fhandle->size == 0) {
2247 error = NFS_PROTO(dir)->lookup(dir, dentry, fhandle, fattr);
2248 if (error)
2249 goto out_error;
2250 }
2251 nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
2252 if (!(fattr->valid & NFS_ATTR_FATTR)) {
2253 struct nfs_server *server = NFS_SB(dentry->d_sb);
2254 error = server->nfs_client->rpc_ops->getattr(server, fhandle,
2255 fattr, NULL);
2256 if (error < 0)
2257 goto out_error;
2258 }
2259 inode = nfs_fhget(dentry->d_sb, fhandle, fattr);
2260 d = d_splice_alias(inode, dentry);
2261 out:
2262 dput(parent);
2263 return d;
2264 out_error:
2265 d = ERR_PTR(error);
2266 goto out;
2267 }
2268 EXPORT_SYMBOL_GPL(nfs_add_or_obtain);
2269
2270
2271
2272
2273 int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fhandle,
2274 struct nfs_fattr *fattr)
2275 {
2276 struct dentry *d;
2277
2278 d = nfs_add_or_obtain(dentry, fhandle, fattr);
2279 if (IS_ERR(d))
2280 return PTR_ERR(d);
2281
2282
2283 dput(d);
2284 return 0;
2285 }
2286 EXPORT_SYMBOL_GPL(nfs_instantiate);
2287
2288
2289
2290
2291
2292
2293
2294 int nfs_create(struct user_namespace *mnt_userns, struct inode *dir,
2295 struct dentry *dentry, umode_t mode, bool excl)
2296 {
2297 struct iattr attr;
2298 int open_flags = excl ? O_CREAT | O_EXCL : O_CREAT;
2299 int error;
2300
2301 dfprintk(VFS, "NFS: create(%s/%lu), %pd\n",
2302 dir->i_sb->s_id, dir->i_ino, dentry);
2303
2304 attr.ia_mode = mode;
2305 attr.ia_valid = ATTR_MODE;
2306
2307 trace_nfs_create_enter(dir, dentry, open_flags);
2308 error = NFS_PROTO(dir)->create(dir, dentry, &attr, open_flags);
2309 trace_nfs_create_exit(dir, dentry, open_flags, error);
2310 if (error != 0)
2311 goto out_err;
2312 return 0;
2313 out_err:
2314 d_drop(dentry);
2315 return error;
2316 }
2317 EXPORT_SYMBOL_GPL(nfs_create);
2318
2319
2320
2321
2322 int
2323 nfs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
2324 struct dentry *dentry, umode_t mode, dev_t rdev)
2325 {
2326 struct iattr attr;
2327 int status;
2328
2329 dfprintk(VFS, "NFS: mknod(%s/%lu), %pd\n",
2330 dir->i_sb->s_id, dir->i_ino, dentry);
2331
2332 attr.ia_mode = mode;
2333 attr.ia_valid = ATTR_MODE;
2334
2335 trace_nfs_mknod_enter(dir, dentry);
2336 status = NFS_PROTO(dir)->mknod(dir, dentry, &attr, rdev);
2337 trace_nfs_mknod_exit(dir, dentry, status);
2338 if (status != 0)
2339 goto out_err;
2340 return 0;
2341 out_err:
2342 d_drop(dentry);
2343 return status;
2344 }
2345 EXPORT_SYMBOL_GPL(nfs_mknod);
2346
2347
2348
2349
2350 int nfs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
2351 struct dentry *dentry, umode_t mode)
2352 {
2353 struct iattr attr;
2354 int error;
2355
2356 dfprintk(VFS, "NFS: mkdir(%s/%lu), %pd\n",
2357 dir->i_sb->s_id, dir->i_ino, dentry);
2358
2359 attr.ia_valid = ATTR_MODE;
2360 attr.ia_mode = mode | S_IFDIR;
2361
2362 trace_nfs_mkdir_enter(dir, dentry);
2363 error = NFS_PROTO(dir)->mkdir(dir, dentry, &attr);
2364 trace_nfs_mkdir_exit(dir, dentry, error);
2365 if (error != 0)
2366 goto out_err;
2367 return 0;
2368 out_err:
2369 d_drop(dentry);
2370 return error;
2371 }
2372 EXPORT_SYMBOL_GPL(nfs_mkdir);
2373
2374 static void nfs_dentry_handle_enoent(struct dentry *dentry)
2375 {
2376 if (simple_positive(dentry))
2377 d_delete(dentry);
2378 }
2379
2380 static void nfs_dentry_remove_handle_error(struct inode *dir,
2381 struct dentry *dentry, int error)
2382 {
2383 switch (error) {
2384 case -ENOENT:
2385 if (d_really_is_positive(dentry))
2386 d_delete(dentry);
2387 nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
2388 break;
2389 case 0:
2390 nfs_d_prune_case_insensitive_aliases(d_inode(dentry));
2391 nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
2392 }
2393 }
2394
2395 int nfs_rmdir(struct inode *dir, struct dentry *dentry)
2396 {
2397 int error;
2398
2399 dfprintk(VFS, "NFS: rmdir(%s/%lu), %pd\n",
2400 dir->i_sb->s_id, dir->i_ino, dentry);
2401
2402 trace_nfs_rmdir_enter(dir, dentry);
2403 if (d_really_is_positive(dentry)) {
2404 down_write(&NFS_I(d_inode(dentry))->rmdir_sem);
2405 error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name);
2406
2407 switch (error) {
2408 case 0:
2409 clear_nlink(d_inode(dentry));
2410 break;
2411 case -ENOENT:
2412 nfs_dentry_handle_enoent(dentry);
2413 }
2414 up_write(&NFS_I(d_inode(dentry))->rmdir_sem);
2415 } else
2416 error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name);
2417 nfs_dentry_remove_handle_error(dir, dentry, error);
2418 trace_nfs_rmdir_exit(dir, dentry, error);
2419
2420 return error;
2421 }
2422 EXPORT_SYMBOL_GPL(nfs_rmdir);
2423
2424
2425
2426
2427
2428
2429
2430
2431 static int nfs_safe_remove(struct dentry *dentry)
2432 {
2433 struct inode *dir = d_inode(dentry->d_parent);
2434 struct inode *inode = d_inode(dentry);
2435 int error = -EBUSY;
2436
2437 dfprintk(VFS, "NFS: safe_remove(%pd2)\n", dentry);
2438
2439
2440 if (dentry->d_flags & DCACHE_NFSFS_RENAMED) {
2441 error = 0;
2442 goto out;
2443 }
2444
2445 trace_nfs_remove_enter(dir, dentry);
2446 if (inode != NULL) {
2447 error = NFS_PROTO(dir)->remove(dir, dentry);
2448 if (error == 0)
2449 nfs_drop_nlink(inode);
2450 } else
2451 error = NFS_PROTO(dir)->remove(dir, dentry);
2452 if (error == -ENOENT)
2453 nfs_dentry_handle_enoent(dentry);
2454 trace_nfs_remove_exit(dir, dentry, error);
2455 out:
2456 return error;
2457 }
2458
2459
2460
2461
2462
2463
2464 int nfs_unlink(struct inode *dir, struct dentry *dentry)
2465 {
2466 int error;
2467
2468 dfprintk(VFS, "NFS: unlink(%s/%lu, %pd)\n", dir->i_sb->s_id,
2469 dir->i_ino, dentry);
2470
2471 trace_nfs_unlink_enter(dir, dentry);
2472 spin_lock(&dentry->d_lock);
2473 if (d_count(dentry) > 1 && !test_bit(NFS_INO_PRESERVE_UNLINKED,
2474 &NFS_I(d_inode(dentry))->flags)) {
2475 spin_unlock(&dentry->d_lock);
2476
2477 write_inode_now(d_inode(dentry), 0);
2478 error = nfs_sillyrename(dir, dentry);
2479 goto out;
2480 }
2481
2482
2483
2484
2485
2486 error = -ETXTBSY;
2487 if (WARN_ON(dentry->d_flags & DCACHE_NFSFS_RENAMED) ||
2488 WARN_ON(dentry->d_fsdata == NFS_FSDATA_BLOCKED)) {
2489 spin_unlock(&dentry->d_lock);
2490 goto out;
2491 }
2492 if (dentry->d_fsdata)
2493
2494 kfree(dentry->d_fsdata);
2495 dentry->d_fsdata = NFS_FSDATA_BLOCKED;
2496
2497 spin_unlock(&dentry->d_lock);
2498 error = nfs_safe_remove(dentry);
2499 nfs_dentry_remove_handle_error(dir, dentry, error);
2500 dentry->d_fsdata = NULL;
2501 wake_up_var(&dentry->d_fsdata);
2502 out:
2503 trace_nfs_unlink_exit(dir, dentry, error);
2504 return error;
2505 }
2506 EXPORT_SYMBOL_GPL(nfs_unlink);
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523 int nfs_symlink(struct user_namespace *mnt_userns, struct inode *dir,
2524 struct dentry *dentry, const char *symname)
2525 {
2526 struct page *page;
2527 char *kaddr;
2528 struct iattr attr;
2529 unsigned int pathlen = strlen(symname);
2530 int error;
2531
2532 dfprintk(VFS, "NFS: symlink(%s/%lu, %pd, %s)\n", dir->i_sb->s_id,
2533 dir->i_ino, dentry, symname);
2534
2535 if (pathlen > PAGE_SIZE)
2536 return -ENAMETOOLONG;
2537
2538 attr.ia_mode = S_IFLNK | S_IRWXUGO;
2539 attr.ia_valid = ATTR_MODE;
2540
2541 page = alloc_page(GFP_USER);
2542 if (!page)
2543 return -ENOMEM;
2544
2545 kaddr = page_address(page);
2546 memcpy(kaddr, symname, pathlen);
2547 if (pathlen < PAGE_SIZE)
2548 memset(kaddr + pathlen, 0, PAGE_SIZE - pathlen);
2549
2550 trace_nfs_symlink_enter(dir, dentry);
2551 error = NFS_PROTO(dir)->symlink(dir, dentry, page, pathlen, &attr);
2552 trace_nfs_symlink_exit(dir, dentry, error);
2553 if (error != 0) {
2554 dfprintk(VFS, "NFS: symlink(%s/%lu, %pd, %s) error %d\n",
2555 dir->i_sb->s_id, dir->i_ino,
2556 dentry, symname, error);
2557 d_drop(dentry);
2558 __free_page(page);
2559 return error;
2560 }
2561
2562 nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
2563
2564
2565
2566
2567
2568 if (!add_to_page_cache_lru(page, d_inode(dentry)->i_mapping, 0,
2569 GFP_KERNEL)) {
2570 SetPageUptodate(page);
2571 unlock_page(page);
2572
2573
2574
2575
2576 put_page(page);
2577 } else
2578 __free_page(page);
2579
2580 return 0;
2581 }
2582 EXPORT_SYMBOL_GPL(nfs_symlink);
2583
2584 int
2585 nfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
2586 {
2587 struct inode *inode = d_inode(old_dentry);
2588 int error;
2589
2590 dfprintk(VFS, "NFS: link(%pd2 -> %pd2)\n",
2591 old_dentry, dentry);
2592
2593 trace_nfs_link_enter(inode, dir, dentry);
2594 d_drop(dentry);
2595 if (S_ISREG(inode->i_mode))
2596 nfs_sync_inode(inode);
2597 error = NFS_PROTO(dir)->link(inode, dir, &dentry->d_name);
2598 if (error == 0) {
2599 nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
2600 ihold(inode);
2601 d_add(dentry, inode);
2602 }
2603 trace_nfs_link_exit(inode, dir, dentry, error);
2604 return error;
2605 }
2606 EXPORT_SYMBOL_GPL(nfs_link);
2607
2608 static void
2609 nfs_unblock_rename(struct rpc_task *task, struct nfs_renamedata *data)
2610 {
2611 struct dentry *new_dentry = data->new_dentry;
2612
2613 new_dentry->d_fsdata = NULL;
2614 wake_up_var(&new_dentry->d_fsdata);
2615 }
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641 int nfs_rename(struct user_namespace *mnt_userns, struct inode *old_dir,
2642 struct dentry *old_dentry, struct inode *new_dir,
2643 struct dentry *new_dentry, unsigned int flags)
2644 {
2645 struct inode *old_inode = d_inode(old_dentry);
2646 struct inode *new_inode = d_inode(new_dentry);
2647 struct dentry *dentry = NULL;
2648 struct rpc_task *task;
2649 bool must_unblock = false;
2650 int error = -EBUSY;
2651
2652 if (flags)
2653 return -EINVAL;
2654
2655 dfprintk(VFS, "NFS: rename(%pd2 -> %pd2, ct=%d)\n",
2656 old_dentry, new_dentry,
2657 d_count(new_dentry));
2658
2659 trace_nfs_rename_enter(old_dir, old_dentry, new_dir, new_dentry);
2660
2661
2662
2663
2664
2665
2666 if (new_inode && !S_ISDIR(new_inode->i_mode)) {
2667
2668
2669
2670
2671
2672 error = -ETXTBSY;
2673 if (WARN_ON(new_dentry->d_flags & DCACHE_NFSFS_RENAMED) ||
2674 WARN_ON(new_dentry->d_fsdata == NFS_FSDATA_BLOCKED))
2675 goto out;
2676 if (new_dentry->d_fsdata) {
2677
2678 kfree(new_dentry->d_fsdata);
2679 new_dentry->d_fsdata = NULL;
2680 }
2681
2682 spin_lock(&new_dentry->d_lock);
2683 if (d_count(new_dentry) > 2) {
2684 int err;
2685
2686 spin_unlock(&new_dentry->d_lock);
2687
2688
2689 dentry = d_alloc(new_dentry->d_parent,
2690 &new_dentry->d_name);
2691 if (!dentry)
2692 goto out;
2693
2694
2695 err = nfs_sillyrename(new_dir, new_dentry);
2696 if (err)
2697 goto out;
2698
2699 new_dentry = dentry;
2700 new_inode = NULL;
2701 } else {
2702 new_dentry->d_fsdata = NFS_FSDATA_BLOCKED;
2703 must_unblock = true;
2704 spin_unlock(&new_dentry->d_lock);
2705 }
2706
2707 }
2708
2709 if (S_ISREG(old_inode->i_mode))
2710 nfs_sync_inode(old_inode);
2711 task = nfs_async_rename(old_dir, new_dir, old_dentry, new_dentry,
2712 must_unblock ? nfs_unblock_rename : NULL);
2713 if (IS_ERR(task)) {
2714 error = PTR_ERR(task);
2715 goto out;
2716 }
2717
2718 error = rpc_wait_for_completion_task(task);
2719 if (error != 0) {
2720 ((struct nfs_renamedata *)task->tk_calldata)->cancelled = 1;
2721
2722 smp_wmb();
2723 } else
2724 error = task->tk_status;
2725 rpc_put_task(task);
2726
2727 if (error == 0) {
2728 spin_lock(&old_inode->i_lock);
2729 NFS_I(old_inode)->attr_gencount = nfs_inc_attr_generation_counter();
2730 nfs_set_cache_invalid(old_inode, NFS_INO_INVALID_CHANGE |
2731 NFS_INO_INVALID_CTIME |
2732 NFS_INO_REVAL_FORCED);
2733 spin_unlock(&old_inode->i_lock);
2734 }
2735 out:
2736 trace_nfs_rename_exit(old_dir, old_dentry,
2737 new_dir, new_dentry, error);
2738 if (!error) {
2739 if (new_inode != NULL)
2740 nfs_drop_nlink(new_inode);
2741
2742
2743
2744
2745
2746
2747 d_move(old_dentry, new_dentry);
2748 nfs_set_verifier(old_dentry,
2749 nfs_save_change_attribute(new_dir));
2750 } else if (error == -ENOENT)
2751 nfs_dentry_handle_enoent(old_dentry);
2752
2753
2754 if (dentry)
2755 dput(dentry);
2756 return error;
2757 }
2758 EXPORT_SYMBOL_GPL(nfs_rename);
2759
2760 static DEFINE_SPINLOCK(nfs_access_lru_lock);
2761 static LIST_HEAD(nfs_access_lru_list);
2762 static atomic_long_t nfs_access_nr_entries;
2763
2764 static unsigned long nfs_access_max_cachesize = 4*1024*1024;
2765 module_param(nfs_access_max_cachesize, ulong, 0644);
2766 MODULE_PARM_DESC(nfs_access_max_cachesize, "NFS access maximum total cache length");
2767
2768 static void nfs_access_free_entry(struct nfs_access_entry *entry)
2769 {
2770 put_group_info(entry->group_info);
2771 kfree_rcu(entry, rcu_head);
2772 smp_mb__before_atomic();
2773 atomic_long_dec(&nfs_access_nr_entries);
2774 smp_mb__after_atomic();
2775 }
2776
2777 static void nfs_access_free_list(struct list_head *head)
2778 {
2779 struct nfs_access_entry *cache;
2780
2781 while (!list_empty(head)) {
2782 cache = list_entry(head->next, struct nfs_access_entry, lru);
2783 list_del(&cache->lru);
2784 nfs_access_free_entry(cache);
2785 }
2786 }
2787
2788 static unsigned long
2789 nfs_do_access_cache_scan(unsigned int nr_to_scan)
2790 {
2791 LIST_HEAD(head);
2792 struct nfs_inode *nfsi, *next;
2793 struct nfs_access_entry *cache;
2794 long freed = 0;
2795
2796 spin_lock(&nfs_access_lru_lock);
2797 list_for_each_entry_safe(nfsi, next, &nfs_access_lru_list, access_cache_inode_lru) {
2798 struct inode *inode;
2799
2800 if (nr_to_scan-- == 0)
2801 break;
2802 inode = &nfsi->vfs_inode;
2803 spin_lock(&inode->i_lock);
2804 if (list_empty(&nfsi->access_cache_entry_lru))
2805 goto remove_lru_entry;
2806 cache = list_entry(nfsi->access_cache_entry_lru.next,
2807 struct nfs_access_entry, lru);
2808 list_move(&cache->lru, &head);
2809 rb_erase(&cache->rb_node, &nfsi->access_cache);
2810 freed++;
2811 if (!list_empty(&nfsi->access_cache_entry_lru))
2812 list_move_tail(&nfsi->access_cache_inode_lru,
2813 &nfs_access_lru_list);
2814 else {
2815 remove_lru_entry:
2816 list_del_init(&nfsi->access_cache_inode_lru);
2817 smp_mb__before_atomic();
2818 clear_bit(NFS_INO_ACL_LRU_SET, &nfsi->flags);
2819 smp_mb__after_atomic();
2820 }
2821 spin_unlock(&inode->i_lock);
2822 }
2823 spin_unlock(&nfs_access_lru_lock);
2824 nfs_access_free_list(&head);
2825 return freed;
2826 }
2827
2828 unsigned long
2829 nfs_access_cache_scan(struct shrinker *shrink, struct shrink_control *sc)
2830 {
2831 int nr_to_scan = sc->nr_to_scan;
2832 gfp_t gfp_mask = sc->gfp_mask;
2833
2834 if ((gfp_mask & GFP_KERNEL) != GFP_KERNEL)
2835 return SHRINK_STOP;
2836 return nfs_do_access_cache_scan(nr_to_scan);
2837 }
2838
2839
2840 unsigned long
2841 nfs_access_cache_count(struct shrinker *shrink, struct shrink_control *sc)
2842 {
2843 return vfs_pressure_ratio(atomic_long_read(&nfs_access_nr_entries));
2844 }
2845
2846 static void
2847 nfs_access_cache_enforce_limit(void)
2848 {
2849 long nr_entries = atomic_long_read(&nfs_access_nr_entries);
2850 unsigned long diff;
2851 unsigned int nr_to_scan;
2852
2853 if (nr_entries < 0 || nr_entries <= nfs_access_max_cachesize)
2854 return;
2855 nr_to_scan = 100;
2856 diff = nr_entries - nfs_access_max_cachesize;
2857 if (diff < nr_to_scan)
2858 nr_to_scan = diff;
2859 nfs_do_access_cache_scan(nr_to_scan);
2860 }
2861
2862 static void __nfs_access_zap_cache(struct nfs_inode *nfsi, struct list_head *head)
2863 {
2864 struct rb_root *root_node = &nfsi->access_cache;
2865 struct rb_node *n;
2866 struct nfs_access_entry *entry;
2867
2868
2869 while ((n = rb_first(root_node)) != NULL) {
2870 entry = rb_entry(n, struct nfs_access_entry, rb_node);
2871 rb_erase(n, root_node);
2872 list_move(&entry->lru, head);
2873 }
2874 nfsi->cache_validity &= ~NFS_INO_INVALID_ACCESS;
2875 }
2876
2877 void nfs_access_zap_cache(struct inode *inode)
2878 {
2879 LIST_HEAD(head);
2880
2881 if (test_bit(NFS_INO_ACL_LRU_SET, &NFS_I(inode)->flags) == 0)
2882 return;
2883
2884 spin_lock(&nfs_access_lru_lock);
2885 if (test_and_clear_bit(NFS_INO_ACL_LRU_SET, &NFS_I(inode)->flags))
2886 list_del_init(&NFS_I(inode)->access_cache_inode_lru);
2887
2888 spin_lock(&inode->i_lock);
2889 __nfs_access_zap_cache(NFS_I(inode), &head);
2890 spin_unlock(&inode->i_lock);
2891 spin_unlock(&nfs_access_lru_lock);
2892 nfs_access_free_list(&head);
2893 }
2894 EXPORT_SYMBOL_GPL(nfs_access_zap_cache);
2895
2896 static int access_cmp(const struct cred *a, const struct nfs_access_entry *b)
2897 {
2898 struct group_info *ga, *gb;
2899 int g;
2900
2901 if (uid_lt(a->fsuid, b->fsuid))
2902 return -1;
2903 if (uid_gt(a->fsuid, b->fsuid))
2904 return 1;
2905
2906 if (gid_lt(a->fsgid, b->fsgid))
2907 return -1;
2908 if (gid_gt(a->fsgid, b->fsgid))
2909 return 1;
2910
2911 ga = a->group_info;
2912 gb = b->group_info;
2913 if (ga == gb)
2914 return 0;
2915 if (ga == NULL)
2916 return -1;
2917 if (gb == NULL)
2918 return 1;
2919 if (ga->ngroups < gb->ngroups)
2920 return -1;
2921 if (ga->ngroups > gb->ngroups)
2922 return 1;
2923
2924 for (g = 0; g < ga->ngroups; g++) {
2925 if (gid_lt(ga->gid[g], gb->gid[g]))
2926 return -1;
2927 if (gid_gt(ga->gid[g], gb->gid[g]))
2928 return 1;
2929 }
2930 return 0;
2931 }
2932
2933 static struct nfs_access_entry *nfs_access_search_rbtree(struct inode *inode, const struct cred *cred)
2934 {
2935 struct rb_node *n = NFS_I(inode)->access_cache.rb_node;
2936
2937 while (n != NULL) {
2938 struct nfs_access_entry *entry =
2939 rb_entry(n, struct nfs_access_entry, rb_node);
2940 int cmp = access_cmp(cred, entry);
2941
2942 if (cmp < 0)
2943 n = n->rb_left;
2944 else if (cmp > 0)
2945 n = n->rb_right;
2946 else
2947 return entry;
2948 }
2949 return NULL;
2950 }
2951
2952 static int nfs_access_get_cached_locked(struct inode *inode, const struct cred *cred, u32 *mask, bool may_block)
2953 {
2954 struct nfs_inode *nfsi = NFS_I(inode);
2955 struct nfs_access_entry *cache;
2956 bool retry = true;
2957 int err;
2958
2959 spin_lock(&inode->i_lock);
2960 for(;;) {
2961 if (nfsi->cache_validity & NFS_INO_INVALID_ACCESS)
2962 goto out_zap;
2963 cache = nfs_access_search_rbtree(inode, cred);
2964 err = -ENOENT;
2965 if (cache == NULL)
2966 goto out;
2967
2968 if (!nfs_check_cache_invalid(inode, NFS_INO_INVALID_ACCESS))
2969 break;
2970 if (!retry)
2971 break;
2972 err = -ECHILD;
2973 if (!may_block)
2974 goto out;
2975 spin_unlock(&inode->i_lock);
2976 err = __nfs_revalidate_inode(NFS_SERVER(inode), inode);
2977 if (err)
2978 return err;
2979 spin_lock(&inode->i_lock);
2980 retry = false;
2981 }
2982 *mask = cache->mask;
2983 list_move_tail(&cache->lru, &nfsi->access_cache_entry_lru);
2984 err = 0;
2985 out:
2986 spin_unlock(&inode->i_lock);
2987 return err;
2988 out_zap:
2989 spin_unlock(&inode->i_lock);
2990 nfs_access_zap_cache(inode);
2991 return -ENOENT;
2992 }
2993
2994 static int nfs_access_get_cached_rcu(struct inode *inode, const struct cred *cred, u32 *mask)
2995 {
2996
2997
2998
2999 struct nfs_inode *nfsi = NFS_I(inode);
3000 struct nfs_access_entry *cache;
3001 int err = -ECHILD;
3002 struct list_head *lh;
3003
3004 rcu_read_lock();
3005 if (nfsi->cache_validity & NFS_INO_INVALID_ACCESS)
3006 goto out;
3007 lh = rcu_dereference(list_tail_rcu(&nfsi->access_cache_entry_lru));
3008 cache = list_entry(lh, struct nfs_access_entry, lru);
3009 if (lh == &nfsi->access_cache_entry_lru ||
3010 access_cmp(cred, cache) != 0)
3011 cache = NULL;
3012 if (cache == NULL)
3013 goto out;
3014 if (nfs_check_cache_invalid(inode, NFS_INO_INVALID_ACCESS))
3015 goto out;
3016 *mask = cache->mask;
3017 err = 0;
3018 out:
3019 rcu_read_unlock();
3020 return err;
3021 }
3022
3023 int nfs_access_get_cached(struct inode *inode, const struct cred *cred,
3024 u32 *mask, bool may_block)
3025 {
3026 int status;
3027
3028 status = nfs_access_get_cached_rcu(inode, cred, mask);
3029 if (status != 0)
3030 status = nfs_access_get_cached_locked(inode, cred, mask,
3031 may_block);
3032
3033 return status;
3034 }
3035 EXPORT_SYMBOL_GPL(nfs_access_get_cached);
3036
3037 static void nfs_access_add_rbtree(struct inode *inode,
3038 struct nfs_access_entry *set,
3039 const struct cred *cred)
3040 {
3041 struct nfs_inode *nfsi = NFS_I(inode);
3042 struct rb_root *root_node = &nfsi->access_cache;
3043 struct rb_node **p = &root_node->rb_node;
3044 struct rb_node *parent = NULL;
3045 struct nfs_access_entry *entry;
3046 int cmp;
3047
3048 spin_lock(&inode->i_lock);
3049 while (*p != NULL) {
3050 parent = *p;
3051 entry = rb_entry(parent, struct nfs_access_entry, rb_node);
3052 cmp = access_cmp(cred, entry);
3053
3054 if (cmp < 0)
3055 p = &parent->rb_left;
3056 else if (cmp > 0)
3057 p = &parent->rb_right;
3058 else
3059 goto found;
3060 }
3061 rb_link_node(&set->rb_node, parent, p);
3062 rb_insert_color(&set->rb_node, root_node);
3063 list_add_tail(&set->lru, &nfsi->access_cache_entry_lru);
3064 spin_unlock(&inode->i_lock);
3065 return;
3066 found:
3067 rb_replace_node(parent, &set->rb_node, root_node);
3068 list_add_tail(&set->lru, &nfsi->access_cache_entry_lru);
3069 list_del(&entry->lru);
3070 spin_unlock(&inode->i_lock);
3071 nfs_access_free_entry(entry);
3072 }
3073
3074 void nfs_access_add_cache(struct inode *inode, struct nfs_access_entry *set,
3075 const struct cred *cred)
3076 {
3077 struct nfs_access_entry *cache = kmalloc(sizeof(*cache), GFP_KERNEL);
3078 if (cache == NULL)
3079 return;
3080 RB_CLEAR_NODE(&cache->rb_node);
3081 cache->fsuid = cred->fsuid;
3082 cache->fsgid = cred->fsgid;
3083 cache->group_info = get_group_info(cred->group_info);
3084 cache->mask = set->mask;
3085
3086
3087
3088
3089
3090 smp_wmb();
3091 nfs_access_add_rbtree(inode, cache, cred);
3092
3093
3094 smp_mb__before_atomic();
3095 atomic_long_inc(&nfs_access_nr_entries);
3096 smp_mb__after_atomic();
3097
3098
3099 if (!test_bit(NFS_INO_ACL_LRU_SET, &NFS_I(inode)->flags)) {
3100 spin_lock(&nfs_access_lru_lock);
3101 if (!test_and_set_bit(NFS_INO_ACL_LRU_SET, &NFS_I(inode)->flags))
3102 list_add_tail(&NFS_I(inode)->access_cache_inode_lru,
3103 &nfs_access_lru_list);
3104 spin_unlock(&nfs_access_lru_lock);
3105 }
3106 nfs_access_cache_enforce_limit();
3107 }
3108 EXPORT_SYMBOL_GPL(nfs_access_add_cache);
3109
3110 #define NFS_MAY_READ (NFS_ACCESS_READ)
3111 #define NFS_MAY_WRITE (NFS_ACCESS_MODIFY | \
3112 NFS_ACCESS_EXTEND | \
3113 NFS_ACCESS_DELETE)
3114 #define NFS_FILE_MAY_WRITE (NFS_ACCESS_MODIFY | \
3115 NFS_ACCESS_EXTEND)
3116 #define NFS_DIR_MAY_WRITE NFS_MAY_WRITE
3117 #define NFS_MAY_LOOKUP (NFS_ACCESS_LOOKUP)
3118 #define NFS_MAY_EXECUTE (NFS_ACCESS_EXECUTE)
3119 static int
3120 nfs_access_calc_mask(u32 access_result, umode_t umode)
3121 {
3122 int mask = 0;
3123
3124 if (access_result & NFS_MAY_READ)
3125 mask |= MAY_READ;
3126 if (S_ISDIR(umode)) {
3127 if ((access_result & NFS_DIR_MAY_WRITE) == NFS_DIR_MAY_WRITE)
3128 mask |= MAY_WRITE;
3129 if ((access_result & NFS_MAY_LOOKUP) == NFS_MAY_LOOKUP)
3130 mask |= MAY_EXEC;
3131 } else if (S_ISREG(umode)) {
3132 if ((access_result & NFS_FILE_MAY_WRITE) == NFS_FILE_MAY_WRITE)
3133 mask |= MAY_WRITE;
3134 if ((access_result & NFS_MAY_EXECUTE) == NFS_MAY_EXECUTE)
3135 mask |= MAY_EXEC;
3136 } else if (access_result & NFS_MAY_WRITE)
3137 mask |= MAY_WRITE;
3138 return mask;
3139 }
3140
3141 void nfs_access_set_mask(struct nfs_access_entry *entry, u32 access_result)
3142 {
3143 entry->mask = access_result;
3144 }
3145 EXPORT_SYMBOL_GPL(nfs_access_set_mask);
3146
3147 static int nfs_do_access(struct inode *inode, const struct cred *cred, int mask)
3148 {
3149 struct nfs_access_entry cache;
3150 bool may_block = (mask & MAY_NOT_BLOCK) == 0;
3151 int cache_mask = -1;
3152 int status;
3153
3154 trace_nfs_access_enter(inode);
3155
3156 status = nfs_access_get_cached(inode, cred, &cache.mask, may_block);
3157 if (status == 0)
3158 goto out_cached;
3159
3160 status = -ECHILD;
3161 if (!may_block)
3162 goto out;
3163
3164
3165
3166
3167 cache.mask = NFS_ACCESS_READ | NFS_ACCESS_MODIFY | NFS_ACCESS_EXTEND |
3168 nfs_access_xattr_mask(NFS_SERVER(inode));
3169 if (S_ISDIR(inode->i_mode))
3170 cache.mask |= NFS_ACCESS_DELETE | NFS_ACCESS_LOOKUP;
3171 else
3172 cache.mask |= NFS_ACCESS_EXECUTE;
3173 status = NFS_PROTO(inode)->access(inode, &cache, cred);
3174 if (status != 0) {
3175 if (status == -ESTALE) {
3176 if (!S_ISDIR(inode->i_mode))
3177 nfs_set_inode_stale(inode);
3178 else
3179 nfs_zap_caches(inode);
3180 }
3181 goto out;
3182 }
3183 nfs_access_add_cache(inode, &cache, cred);
3184 out_cached:
3185 cache_mask = nfs_access_calc_mask(cache.mask, inode->i_mode);
3186 if ((mask & ~cache_mask & (MAY_READ | MAY_WRITE | MAY_EXEC)) != 0)
3187 status = -EACCES;
3188 out:
3189 trace_nfs_access_exit(inode, mask, cache_mask, status);
3190 return status;
3191 }
3192
3193 static int nfs_open_permission_mask(int openflags)
3194 {
3195 int mask = 0;
3196
3197 if (openflags & __FMODE_EXEC) {
3198
3199 mask = MAY_EXEC;
3200 } else {
3201 if ((openflags & O_ACCMODE) != O_WRONLY)
3202 mask |= MAY_READ;
3203 if ((openflags & O_ACCMODE) != O_RDONLY)
3204 mask |= MAY_WRITE;
3205 }
3206
3207 return mask;
3208 }
3209
3210 int nfs_may_open(struct inode *inode, const struct cred *cred, int openflags)
3211 {
3212 return nfs_do_access(inode, cred, nfs_open_permission_mask(openflags));
3213 }
3214 EXPORT_SYMBOL_GPL(nfs_may_open);
3215
3216 static int nfs_execute_ok(struct inode *inode, int mask)
3217 {
3218 struct nfs_server *server = NFS_SERVER(inode);
3219 int ret = 0;
3220
3221 if (S_ISDIR(inode->i_mode))
3222 return 0;
3223 if (nfs_check_cache_invalid(inode, NFS_INO_INVALID_MODE)) {
3224 if (mask & MAY_NOT_BLOCK)
3225 return -ECHILD;
3226 ret = __nfs_revalidate_inode(server, inode);
3227 }
3228 if (ret == 0 && !execute_ok(inode))
3229 ret = -EACCES;
3230 return ret;
3231 }
3232
3233 int nfs_permission(struct user_namespace *mnt_userns,
3234 struct inode *inode,
3235 int mask)
3236 {
3237 const struct cred *cred = current_cred();
3238 int res = 0;
3239
3240 nfs_inc_stats(inode, NFSIOS_VFSACCESS);
3241
3242 if ((mask & (MAY_READ | MAY_WRITE | MAY_EXEC)) == 0)
3243 goto out;
3244
3245 if (mask & (MAY_ACCESS | MAY_CHDIR))
3246 goto force_lookup;
3247
3248 switch (inode->i_mode & S_IFMT) {
3249 case S_IFLNK:
3250 goto out;
3251 case S_IFREG:
3252 if ((mask & MAY_OPEN) &&
3253 nfs_server_capable(inode, NFS_CAP_ATOMIC_OPEN))
3254 return 0;
3255 break;
3256 case S_IFDIR:
3257
3258
3259
3260
3261 if ((mask & MAY_WRITE) && !(mask & MAY_READ))
3262 goto out;
3263 }
3264
3265 force_lookup:
3266 if (!NFS_PROTO(inode)->access)
3267 goto out_notsup;
3268
3269 res = nfs_do_access(inode, cred, mask);
3270 out:
3271 if (!res && (mask & MAY_EXEC))
3272 res = nfs_execute_ok(inode, mask);
3273
3274 dfprintk(VFS, "NFS: permission(%s/%lu), mask=0x%x, res=%d\n",
3275 inode->i_sb->s_id, inode->i_ino, mask, res);
3276 return res;
3277 out_notsup:
3278 if (mask & MAY_NOT_BLOCK)
3279 return -ECHILD;
3280
3281 res = nfs_revalidate_inode(inode, NFS_INO_INVALID_MODE |
3282 NFS_INO_INVALID_OTHER);
3283 if (res == 0)
3284 res = generic_permission(&init_user_ns, inode, mask);
3285 goto out;
3286 }
3287 EXPORT_SYMBOL_GPL(nfs_permission);