This source file includes following definitions.
- alloc_nfs_open_dir_context
- put_nfs_open_dir_context
- nfs_opendir
- nfs_closedir
- nfs_readdir_init_array
- nfs_readdir_clear_array
- nfs_readdir_make_qstr
- nfs_readdir_add_to_array
- nfs_readdir_search_for_pos
- nfs_readdir_inode_mapping_valid
- nfs_readdir_search_for_cookie
- nfs_readdir_search_array
- nfs_readdir_xdr_filler
- xdr_decode
- nfs_same_file
- nfs_use_readdirplus
- nfs_advise_use_readdirplus
- nfs_force_use_readdirplus
- nfs_prime_dcache
- nfs_readdir_page_filler
- nfs_readdir_free_pages
- nfs_readdir_alloc_pages
- nfs_readdir_xdr_to_array
- nfs_readdir_filler
- cache_page_release
- get_cache_page
- find_and_lock_cache_page
- readdir_search_pagecache
- nfs_do_filldir
- uncached_readdir
- nfs_readdir
- nfs_llseek_dir
- nfs_fsync_dir
- nfs_force_lookup_revalidate
- nfs_check_verifier
- nfs_is_exclusive_create
- nfs_lookup_verify_inode
- nfs_neg_need_reval
- nfs_lookup_revalidate_done
- nfs_lookup_revalidate_negative
- nfs_lookup_revalidate_delegated
- nfs_lookup_revalidate_dentry
- nfs_do_lookup_revalidate
- __nfs_lookup_revalidate
- nfs_lookup_revalidate
- nfs_weak_revalidate
- nfs_dentry_delete
- nfs_drop_nlink
- nfs_dentry_iput
- nfs_d_release
- nfs_lookup
- flags_to_mode
- create_nfs_open_context
- do_open
- nfs_finish_open
- nfs_atomic_open
- nfs4_do_lookup_revalidate
- nfs4_lookup_revalidate
- nfs_add_or_obtain
- nfs_instantiate
- nfs_create
- nfs_mknod
- nfs_mkdir
- nfs_dentry_handle_enoent
- nfs_rmdir
- nfs_safe_remove
- nfs_unlink
- nfs_symlink
- nfs_link
- nfs_rename
- nfs_access_free_entry
- nfs_access_free_list
- nfs_do_access_cache_scan
- nfs_access_cache_scan
- nfs_access_cache_count
- nfs_access_cache_enforce_limit
- __nfs_access_zap_cache
- nfs_access_zap_cache
- nfs_access_search_rbtree
- nfs_access_get_cached
- nfs_access_get_cached_rcu
- nfs_access_add_rbtree
- nfs_access_add_cache
- nfs_access_calc_mask
- nfs_access_set_mask
- nfs_do_access
- nfs_open_permission_mask
- nfs_may_open
- nfs_execute_ok
- nfs_permission
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #include <linux/module.h>
22 #include <linux/time.h>
23 #include <linux/errno.h>
24 #include <linux/stat.h>
25 #include <linux/fcntl.h>
26 #include <linux/string.h>
27 #include <linux/kernel.h>
28 #include <linux/slab.h>
29 #include <linux/mm.h>
30 #include <linux/sunrpc/clnt.h>
31 #include <linux/nfs_fs.h>
32 #include <linux/nfs_mount.h>
33 #include <linux/pagemap.h>
34 #include <linux/pagevec.h>
35 #include <linux/namei.h>
36 #include <linux/mount.h>
37 #include <linux/swap.h>
38 #include <linux/sched.h>
39 #include <linux/kmemleak.h>
40 #include <linux/xattr.h>
41
42 #include "delegation.h"
43 #include "iostat.h"
44 #include "internal.h"
45 #include "fscache.h"
46
47 #include "nfstrace.h"
48
49
50
51 static int nfs_opendir(struct inode *, struct file *);
52 static int nfs_closedir(struct inode *, struct file *);
53 static int nfs_readdir(struct file *, struct dir_context *);
54 static int nfs_fsync_dir(struct file *, loff_t, loff_t, int);
55 static loff_t nfs_llseek_dir(struct file *, loff_t, int);
56 static void nfs_readdir_clear_array(struct page*);
57
58 const struct file_operations nfs_dir_operations = {
59 .llseek = nfs_llseek_dir,
60 .read = generic_read_dir,
61 .iterate = nfs_readdir,
62 .open = nfs_opendir,
63 .release = nfs_closedir,
64 .fsync = nfs_fsync_dir,
65 };
66
67 const struct address_space_operations nfs_dir_aops = {
68 .freepage = nfs_readdir_clear_array,
69 };
70
71 static struct nfs_open_dir_context *alloc_nfs_open_dir_context(struct inode *dir, const struct cred *cred)
72 {
73 struct nfs_inode *nfsi = NFS_I(dir);
74 struct nfs_open_dir_context *ctx;
75 ctx = kmalloc(sizeof(*ctx), GFP_KERNEL);
76 if (ctx != NULL) {
77 ctx->duped = 0;
78 ctx->attr_gencount = nfsi->attr_gencount;
79 ctx->dir_cookie = 0;
80 ctx->dup_cookie = 0;
81 ctx->cred = get_cred(cred);
82 spin_lock(&dir->i_lock);
83 if (list_empty(&nfsi->open_files) &&
84 (nfsi->cache_validity & NFS_INO_DATA_INVAL_DEFER))
85 nfsi->cache_validity |= NFS_INO_INVALID_DATA |
86 NFS_INO_REVAL_FORCED;
87 list_add(&ctx->list, &nfsi->open_files);
88 spin_unlock(&dir->i_lock);
89 return ctx;
90 }
91 return ERR_PTR(-ENOMEM);
92 }
93
94 static void put_nfs_open_dir_context(struct inode *dir, struct nfs_open_dir_context *ctx)
95 {
96 spin_lock(&dir->i_lock);
97 list_del(&ctx->list);
98 spin_unlock(&dir->i_lock);
99 put_cred(ctx->cred);
100 kfree(ctx);
101 }
102
103
104
105
106 static int
107 nfs_opendir(struct inode *inode, struct file *filp)
108 {
109 int res = 0;
110 struct nfs_open_dir_context *ctx;
111
112 dfprintk(FILE, "NFS: open dir(%pD2)\n", filp);
113
114 nfs_inc_stats(inode, NFSIOS_VFSOPEN);
115
116 ctx = alloc_nfs_open_dir_context(inode, current_cred());
117 if (IS_ERR(ctx)) {
118 res = PTR_ERR(ctx);
119 goto out;
120 }
121 filp->private_data = ctx;
122 out:
123 return res;
124 }
125
126 static int
127 nfs_closedir(struct inode *inode, struct file *filp)
128 {
129 put_nfs_open_dir_context(file_inode(filp), filp->private_data);
130 return 0;
131 }
132
133 struct nfs_cache_array_entry {
134 u64 cookie;
135 u64 ino;
136 struct qstr string;
137 unsigned char d_type;
138 };
139
140 struct nfs_cache_array {
141 int size;
142 int eof_index;
143 u64 last_cookie;
144 struct nfs_cache_array_entry array[0];
145 };
146
147 typedef int (*decode_dirent_t)(struct xdr_stream *, struct nfs_entry *, bool);
148 typedef struct {
149 struct file *file;
150 struct page *page;
151 struct dir_context *ctx;
152 unsigned long page_index;
153 u64 *dir_cookie;
154 u64 last_cookie;
155 loff_t current_index;
156 decode_dirent_t decode;
157
158 unsigned long timestamp;
159 unsigned long gencount;
160 unsigned int cache_entry_index;
161 bool plus;
162 bool eof;
163 } nfs_readdir_descriptor_t;
164
165 static
166 void nfs_readdir_init_array(struct page *page)
167 {
168 struct nfs_cache_array *array;
169
170 array = kmap_atomic(page);
171 memset(array, 0, sizeof(struct nfs_cache_array));
172 array->eof_index = -1;
173 kunmap_atomic(array);
174 }
175
176
177
178
179 static
180 void nfs_readdir_clear_array(struct page *page)
181 {
182 struct nfs_cache_array *array;
183 int i;
184
185 array = kmap_atomic(page);
186 for (i = 0; i < array->size; i++)
187 kfree(array->array[i].string.name);
188 array->size = 0;
189 kunmap_atomic(array);
190 }
191
192
193
194
195
196
197 static
198 int nfs_readdir_make_qstr(struct qstr *string, const char *name, unsigned int len)
199 {
200 string->len = len;
201 string->name = kmemdup(name, len, GFP_KERNEL);
202 if (string->name == NULL)
203 return -ENOMEM;
204
205
206
207
208 kmemleak_not_leak(string->name);
209 string->hash = full_name_hash(NULL, name, len);
210 return 0;
211 }
212
213 static
214 int nfs_readdir_add_to_array(struct nfs_entry *entry, struct page *page)
215 {
216 struct nfs_cache_array *array = kmap(page);
217 struct nfs_cache_array_entry *cache_entry;
218 int ret;
219
220 cache_entry = &array->array[array->size];
221
222
223 ret = -ENOSPC;
224 if ((char *)&cache_entry[1] - (char *)page_address(page) > PAGE_SIZE)
225 goto out;
226
227 cache_entry->cookie = entry->prev_cookie;
228 cache_entry->ino = entry->ino;
229 cache_entry->d_type = entry->d_type;
230 ret = nfs_readdir_make_qstr(&cache_entry->string, entry->name, entry->len);
231 if (ret)
232 goto out;
233 array->last_cookie = entry->cookie;
234 array->size++;
235 if (entry->eof != 0)
236 array->eof_index = array->size;
237 out:
238 kunmap(page);
239 return ret;
240 }
241
242 static
243 int nfs_readdir_search_for_pos(struct nfs_cache_array *array, nfs_readdir_descriptor_t *desc)
244 {
245 loff_t diff = desc->ctx->pos - desc->current_index;
246 unsigned int index;
247
248 if (diff < 0)
249 goto out_eof;
250 if (diff >= array->size) {
251 if (array->eof_index >= 0)
252 goto out_eof;
253 return -EAGAIN;
254 }
255
256 index = (unsigned int)diff;
257 *desc->dir_cookie = array->array[index].cookie;
258 desc->cache_entry_index = index;
259 return 0;
260 out_eof:
261 desc->eof = true;
262 return -EBADCOOKIE;
263 }
264
265 static bool
266 nfs_readdir_inode_mapping_valid(struct nfs_inode *nfsi)
267 {
268 if (nfsi->cache_validity & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA))
269 return false;
270 smp_rmb();
271 return !test_bit(NFS_INO_INVALIDATING, &nfsi->flags);
272 }
273
274 static
275 int nfs_readdir_search_for_cookie(struct nfs_cache_array *array, nfs_readdir_descriptor_t *desc)
276 {
277 int i;
278 loff_t new_pos;
279 int status = -EAGAIN;
280
281 for (i = 0; i < array->size; i++) {
282 if (array->array[i].cookie == *desc->dir_cookie) {
283 struct nfs_inode *nfsi = NFS_I(file_inode(desc->file));
284 struct nfs_open_dir_context *ctx = desc->file->private_data;
285
286 new_pos = desc->current_index + i;
287 if (ctx->attr_gencount != nfsi->attr_gencount ||
288 !nfs_readdir_inode_mapping_valid(nfsi)) {
289 ctx->duped = 0;
290 ctx->attr_gencount = nfsi->attr_gencount;
291 } else if (new_pos < desc->ctx->pos) {
292 if (ctx->duped > 0
293 && ctx->dup_cookie == *desc->dir_cookie) {
294 if (printk_ratelimit()) {
295 pr_notice("NFS: directory %pD2 contains a readdir loop."
296 "Please contact your server vendor. "
297 "The file: %.*s has duplicate cookie %llu\n",
298 desc->file, array->array[i].string.len,
299 array->array[i].string.name, *desc->dir_cookie);
300 }
301 status = -ELOOP;
302 goto out;
303 }
304 ctx->dup_cookie = *desc->dir_cookie;
305 ctx->duped = -1;
306 }
307 desc->ctx->pos = new_pos;
308 desc->cache_entry_index = i;
309 return 0;
310 }
311 }
312 if (array->eof_index >= 0) {
313 status = -EBADCOOKIE;
314 if (*desc->dir_cookie == array->last_cookie)
315 desc->eof = true;
316 }
317 out:
318 return status;
319 }
320
321 static
322 int nfs_readdir_search_array(nfs_readdir_descriptor_t *desc)
323 {
324 struct nfs_cache_array *array;
325 int status;
326
327 array = kmap(desc->page);
328
329 if (*desc->dir_cookie == 0)
330 status = nfs_readdir_search_for_pos(array, desc);
331 else
332 status = nfs_readdir_search_for_cookie(array, desc);
333
334 if (status == -EAGAIN) {
335 desc->last_cookie = array->last_cookie;
336 desc->current_index += array->size;
337 desc->page_index++;
338 }
339 kunmap(desc->page);
340 return status;
341 }
342
343
344 static
345 int nfs_readdir_xdr_filler(struct page **pages, nfs_readdir_descriptor_t *desc,
346 struct nfs_entry *entry, struct file *file, struct inode *inode)
347 {
348 struct nfs_open_dir_context *ctx = file->private_data;
349 const struct cred *cred = ctx->cred;
350 unsigned long timestamp, gencount;
351 int error;
352
353 again:
354 timestamp = jiffies;
355 gencount = nfs_inc_attr_generation_counter();
356 error = NFS_PROTO(inode)->readdir(file_dentry(file), cred, entry->cookie, pages,
357 NFS_SERVER(inode)->dtsize, desc->plus);
358 if (error < 0) {
359
360 if (error == -ENOTSUPP && desc->plus) {
361 NFS_SERVER(inode)->caps &= ~NFS_CAP_READDIRPLUS;
362 clear_bit(NFS_INO_ADVISE_RDPLUS, &NFS_I(inode)->flags);
363 desc->plus = false;
364 goto again;
365 }
366 goto error;
367 }
368 desc->timestamp = timestamp;
369 desc->gencount = gencount;
370 error:
371 return error;
372 }
373
374 static int xdr_decode(nfs_readdir_descriptor_t *desc,
375 struct nfs_entry *entry, struct xdr_stream *xdr)
376 {
377 int error;
378
379 error = desc->decode(xdr, entry, desc->plus);
380 if (error)
381 return error;
382 entry->fattr->time_start = desc->timestamp;
383 entry->fattr->gencount = desc->gencount;
384 return 0;
385 }
386
387
388
389
390 static
391 int nfs_same_file(struct dentry *dentry, struct nfs_entry *entry)
392 {
393 struct inode *inode;
394 struct nfs_inode *nfsi;
395
396 if (d_really_is_negative(dentry))
397 return 0;
398
399 inode = d_inode(dentry);
400 if (is_bad_inode(inode) || NFS_STALE(inode))
401 return 0;
402
403 nfsi = NFS_I(inode);
404 if (entry->fattr->fileid != nfsi->fileid)
405 return 0;
406 if (entry->fh->size && nfs_compare_fh(entry->fh, &nfsi->fh) != 0)
407 return 0;
408 return 1;
409 }
410
411 static
412 bool nfs_use_readdirplus(struct inode *dir, struct dir_context *ctx)
413 {
414 if (!nfs_server_capable(dir, NFS_CAP_READDIRPLUS))
415 return false;
416 if (test_and_clear_bit(NFS_INO_ADVISE_RDPLUS, &NFS_I(dir)->flags))
417 return true;
418 if (ctx->pos == 0)
419 return true;
420 return false;
421 }
422
423
424
425
426
427
428 void nfs_advise_use_readdirplus(struct inode *dir)
429 {
430 struct nfs_inode *nfsi = NFS_I(dir);
431
432 if (nfs_server_capable(dir, NFS_CAP_READDIRPLUS) &&
433 !list_empty(&nfsi->open_files))
434 set_bit(NFS_INO_ADVISE_RDPLUS, &nfsi->flags);
435 }
436
437
438
439
440
441
442
443
444
445 void nfs_force_use_readdirplus(struct inode *dir)
446 {
447 struct nfs_inode *nfsi = NFS_I(dir);
448
449 if (nfs_server_capable(dir, NFS_CAP_READDIRPLUS) &&
450 !list_empty(&nfsi->open_files)) {
451 set_bit(NFS_INO_ADVISE_RDPLUS, &nfsi->flags);
452 invalidate_mapping_pages(dir->i_mapping, 0, -1);
453 }
454 }
455
456 static
457 void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry)
458 {
459 struct qstr filename = QSTR_INIT(entry->name, entry->len);
460 DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
461 struct dentry *dentry;
462 struct dentry *alias;
463 struct inode *dir = d_inode(parent);
464 struct inode *inode;
465 int status;
466
467 if (!(entry->fattr->valid & NFS_ATTR_FATTR_FILEID))
468 return;
469 if (!(entry->fattr->valid & NFS_ATTR_FATTR_FSID))
470 return;
471 if (filename.len == 0)
472 return;
473
474 if (strnlen(filename.name, filename.len) != filename.len)
475 return;
476
477 if (strnchr(filename.name, filename.len, '/'))
478 return;
479 if (filename.name[0] == '.') {
480 if (filename.len == 1)
481 return;
482 if (filename.len == 2 && filename.name[1] == '.')
483 return;
484 }
485 filename.hash = full_name_hash(parent, filename.name, filename.len);
486
487 dentry = d_lookup(parent, &filename);
488 again:
489 if (!dentry) {
490 dentry = d_alloc_parallel(parent, &filename, &wq);
491 if (IS_ERR(dentry))
492 return;
493 }
494 if (!d_in_lookup(dentry)) {
495
496 if (!nfs_fsid_equal(&NFS_SB(dentry->d_sb)->fsid,
497 &entry->fattr->fsid))
498 goto out;
499 if (nfs_same_file(dentry, entry)) {
500 if (!entry->fh->size)
501 goto out;
502 nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
503 status = nfs_refresh_inode(d_inode(dentry), entry->fattr);
504 if (!status)
505 nfs_setsecurity(d_inode(dentry), entry->fattr, entry->label);
506 goto out;
507 } else {
508 d_invalidate(dentry);
509 dput(dentry);
510 dentry = NULL;
511 goto again;
512 }
513 }
514 if (!entry->fh->size) {
515 d_lookup_done(dentry);
516 goto out;
517 }
518
519 inode = nfs_fhget(dentry->d_sb, entry->fh, entry->fattr, entry->label);
520 alias = d_splice_alias(inode, dentry);
521 d_lookup_done(dentry);
522 if (alias) {
523 if (IS_ERR(alias))
524 goto out;
525 dput(dentry);
526 dentry = alias;
527 }
528 nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
529 out:
530 dput(dentry);
531 }
532
533
534 static
535 int nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *entry,
536 struct page **xdr_pages, struct page *page, unsigned int buflen)
537 {
538 struct xdr_stream stream;
539 struct xdr_buf buf;
540 struct page *scratch;
541 struct nfs_cache_array *array;
542 unsigned int count = 0;
543 int status;
544
545 scratch = alloc_page(GFP_KERNEL);
546 if (scratch == NULL)
547 return -ENOMEM;
548
549 if (buflen == 0)
550 goto out_nopages;
551
552 xdr_init_decode_pages(&stream, &buf, xdr_pages, buflen);
553 xdr_set_scratch_buffer(&stream, page_address(scratch), PAGE_SIZE);
554
555 do {
556 status = xdr_decode(desc, entry, &stream);
557 if (status != 0) {
558 if (status == -EAGAIN)
559 status = 0;
560 break;
561 }
562
563 count++;
564
565 if (desc->plus)
566 nfs_prime_dcache(file_dentry(desc->file), entry);
567
568 status = nfs_readdir_add_to_array(entry, page);
569 if (status != 0)
570 break;
571 } while (!entry->eof);
572
573 out_nopages:
574 if (count == 0 || (status == -EBADCOOKIE && entry->eof != 0)) {
575 array = kmap(page);
576 array->eof_index = array->size;
577 status = 0;
578 kunmap(page);
579 }
580
581 put_page(scratch);
582 return status;
583 }
584
585 static
586 void nfs_readdir_free_pages(struct page **pages, unsigned int npages)
587 {
588 unsigned int i;
589 for (i = 0; i < npages; i++)
590 put_page(pages[i]);
591 }
592
593
594
595
596
597 static
598 int nfs_readdir_alloc_pages(struct page **pages, unsigned int npages)
599 {
600 unsigned int i;
601
602 for (i = 0; i < npages; i++) {
603 struct page *page = alloc_page(GFP_KERNEL);
604 if (page == NULL)
605 goto out_freepages;
606 pages[i] = page;
607 }
608 return 0;
609
610 out_freepages:
611 nfs_readdir_free_pages(pages, i);
612 return -ENOMEM;
613 }
614
615 static
616 int nfs_readdir_xdr_to_array(nfs_readdir_descriptor_t *desc, struct page *page, struct inode *inode)
617 {
618 struct page *pages[NFS_MAX_READDIR_PAGES];
619 struct nfs_entry entry;
620 struct file *file = desc->file;
621 struct nfs_cache_array *array;
622 int status = -ENOMEM;
623 unsigned int array_size = ARRAY_SIZE(pages);
624
625 nfs_readdir_init_array(page);
626
627 entry.prev_cookie = 0;
628 entry.cookie = desc->last_cookie;
629 entry.eof = 0;
630 entry.fh = nfs_alloc_fhandle();
631 entry.fattr = nfs_alloc_fattr();
632 entry.server = NFS_SERVER(inode);
633 if (entry.fh == NULL || entry.fattr == NULL)
634 goto out;
635
636 entry.label = nfs4_label_alloc(NFS_SERVER(inode), GFP_NOWAIT);
637 if (IS_ERR(entry.label)) {
638 status = PTR_ERR(entry.label);
639 goto out;
640 }
641
642 array = kmap(page);
643
644 status = nfs_readdir_alloc_pages(pages, array_size);
645 if (status < 0)
646 goto out_release_array;
647 do {
648 unsigned int pglen;
649 status = nfs_readdir_xdr_filler(pages, desc, &entry, file, inode);
650
651 if (status < 0)
652 break;
653 pglen = status;
654 status = nfs_readdir_page_filler(desc, &entry, pages, page, pglen);
655 if (status < 0) {
656 if (status == -ENOSPC)
657 status = 0;
658 break;
659 }
660 } while (array->eof_index < 0);
661
662 nfs_readdir_free_pages(pages, array_size);
663 out_release_array:
664 kunmap(page);
665 nfs4_label_free(entry.label);
666 out:
667 nfs_free_fattr(entry.fattr);
668 nfs_free_fhandle(entry.fh);
669 return status;
670 }
671
672
673
674
675
676
677
678 static
679 int nfs_readdir_filler(void *data, struct page* page)
680 {
681 nfs_readdir_descriptor_t *desc = data;
682 struct inode *inode = file_inode(desc->file);
683 int ret;
684
685 ret = nfs_readdir_xdr_to_array(desc, page, inode);
686 if (ret < 0)
687 goto error;
688 SetPageUptodate(page);
689
690 if (invalidate_inode_pages2_range(inode->i_mapping, page->index + 1, -1) < 0) {
691
692 nfs_zap_mapping(inode, inode->i_mapping);
693 }
694 unlock_page(page);
695 return 0;
696 error:
697 nfs_readdir_clear_array(page);
698 unlock_page(page);
699 return ret;
700 }
701
702 static
703 void cache_page_release(nfs_readdir_descriptor_t *desc)
704 {
705 put_page(desc->page);
706 desc->page = NULL;
707 }
708
709 static
710 struct page *get_cache_page(nfs_readdir_descriptor_t *desc)
711 {
712 return read_cache_page(desc->file->f_mapping, desc->page_index,
713 nfs_readdir_filler, desc);
714 }
715
716
717
718
719
720 static
721 int find_and_lock_cache_page(nfs_readdir_descriptor_t *desc)
722 {
723 int res;
724
725 desc->page = get_cache_page(desc);
726 if (IS_ERR(desc->page))
727 return PTR_ERR(desc->page);
728 res = lock_page_killable(desc->page);
729 if (res != 0)
730 goto error;
731 res = -EAGAIN;
732 if (desc->page->mapping != NULL) {
733 res = nfs_readdir_search_array(desc);
734 if (res == 0)
735 return 0;
736 }
737 unlock_page(desc->page);
738 error:
739 cache_page_release(desc);
740 return res;
741 }
742
743
744 static inline
745 int readdir_search_pagecache(nfs_readdir_descriptor_t *desc)
746 {
747 int res;
748
749 if (desc->page_index == 0) {
750 desc->current_index = 0;
751 desc->last_cookie = 0;
752 }
753 do {
754 res = find_and_lock_cache_page(desc);
755 } while (res == -EAGAIN);
756 return res;
757 }
758
759
760
761
762 static
763 int nfs_do_filldir(nfs_readdir_descriptor_t *desc)
764 {
765 struct file *file = desc->file;
766 int i = 0;
767 int res = 0;
768 struct nfs_cache_array *array = NULL;
769 struct nfs_open_dir_context *ctx = file->private_data;
770
771 array = kmap(desc->page);
772 for (i = desc->cache_entry_index; i < array->size; i++) {
773 struct nfs_cache_array_entry *ent;
774
775 ent = &array->array[i];
776 if (!dir_emit(desc->ctx, ent->string.name, ent->string.len,
777 nfs_compat_user_ino64(ent->ino), ent->d_type)) {
778 desc->eof = true;
779 break;
780 }
781 desc->ctx->pos++;
782 if (i < (array->size-1))
783 *desc->dir_cookie = array->array[i+1].cookie;
784 else
785 *desc->dir_cookie = array->last_cookie;
786 if (ctx->duped != 0)
787 ctx->duped = 1;
788 }
789 if (array->eof_index >= 0)
790 desc->eof = true;
791
792 kunmap(desc->page);
793 dfprintk(DIRCACHE, "NFS: nfs_do_filldir() filling ended @ cookie %Lu; returning = %d\n",
794 (unsigned long long)*desc->dir_cookie, res);
795 return res;
796 }
797
798
799
800
801
802
803
804
805
806
807
808
809
810 static inline
811 int uncached_readdir(nfs_readdir_descriptor_t *desc)
812 {
813 struct page *page = NULL;
814 int status;
815 struct inode *inode = file_inode(desc->file);
816 struct nfs_open_dir_context *ctx = desc->file->private_data;
817
818 dfprintk(DIRCACHE, "NFS: uncached_readdir() searching for cookie %Lu\n",
819 (unsigned long long)*desc->dir_cookie);
820
821 page = alloc_page(GFP_HIGHUSER);
822 if (!page) {
823 status = -ENOMEM;
824 goto out;
825 }
826
827 desc->page_index = 0;
828 desc->last_cookie = *desc->dir_cookie;
829 desc->page = page;
830 ctx->duped = 0;
831
832 status = nfs_readdir_xdr_to_array(desc, page, inode);
833 if (status < 0)
834 goto out_release;
835
836 status = nfs_do_filldir(desc);
837
838 out_release:
839 nfs_readdir_clear_array(desc->page);
840 cache_page_release(desc);
841 out:
842 dfprintk(DIRCACHE, "NFS: %s: returns %d\n",
843 __func__, status);
844 return status;
845 }
846
847
848
849
850
851 static int nfs_readdir(struct file *file, struct dir_context *ctx)
852 {
853 struct dentry *dentry = file_dentry(file);
854 struct inode *inode = d_inode(dentry);
855 nfs_readdir_descriptor_t my_desc,
856 *desc = &my_desc;
857 struct nfs_open_dir_context *dir_ctx = file->private_data;
858 int res = 0;
859
860 dfprintk(FILE, "NFS: readdir(%pD2) starting at cookie %llu\n",
861 file, (long long)ctx->pos);
862 nfs_inc_stats(inode, NFSIOS_VFSGETDENTS);
863
864
865
866
867
868
869
870 memset(desc, 0, sizeof(*desc));
871
872 desc->file = file;
873 desc->ctx = ctx;
874 desc->dir_cookie = &dir_ctx->dir_cookie;
875 desc->decode = NFS_PROTO(inode)->decode_dirent;
876 desc->plus = nfs_use_readdirplus(inode, ctx);
877
878 if (ctx->pos == 0 || nfs_attribute_cache_expired(inode))
879 res = nfs_revalidate_mapping(inode, file->f_mapping);
880 if (res < 0)
881 goto out;
882
883 do {
884 res = readdir_search_pagecache(desc);
885
886 if (res == -EBADCOOKIE) {
887 res = 0;
888
889 if (*desc->dir_cookie && !desc->eof) {
890
891 res = uncached_readdir(desc);
892 if (res == 0)
893 continue;
894 }
895 break;
896 }
897 if (res == -ETOOSMALL && desc->plus) {
898 clear_bit(NFS_INO_ADVISE_RDPLUS, &NFS_I(inode)->flags);
899 nfs_zap_caches(inode);
900 desc->page_index = 0;
901 desc->plus = false;
902 desc->eof = false;
903 continue;
904 }
905 if (res < 0)
906 break;
907
908 res = nfs_do_filldir(desc);
909 unlock_page(desc->page);
910 cache_page_release(desc);
911 if (res < 0)
912 break;
913 } while (!desc->eof);
914 out:
915 if (res > 0)
916 res = 0;
917 dfprintk(FILE, "NFS: readdir(%pD2) returns %d\n", file, res);
918 return res;
919 }
920
921 static loff_t nfs_llseek_dir(struct file *filp, loff_t offset, int whence)
922 {
923 struct inode *inode = file_inode(filp);
924 struct nfs_open_dir_context *dir_ctx = filp->private_data;
925
926 dfprintk(FILE, "NFS: llseek dir(%pD2, %lld, %d)\n",
927 filp, offset, whence);
928
929 switch (whence) {
930 default:
931 return -EINVAL;
932 case SEEK_SET:
933 if (offset < 0)
934 return -EINVAL;
935 inode_lock(inode);
936 break;
937 case SEEK_CUR:
938 if (offset == 0)
939 return filp->f_pos;
940 inode_lock(inode);
941 offset += filp->f_pos;
942 if (offset < 0) {
943 inode_unlock(inode);
944 return -EINVAL;
945 }
946 }
947 if (offset != filp->f_pos) {
948 filp->f_pos = offset;
949 dir_ctx->dir_cookie = 0;
950 dir_ctx->duped = 0;
951 }
952 inode_unlock(inode);
953 return offset;
954 }
955
956
957
958
959
960 static int nfs_fsync_dir(struct file *filp, loff_t start, loff_t end,
961 int datasync)
962 {
963 struct inode *inode = file_inode(filp);
964
965 dfprintk(FILE, "NFS: fsync dir(%pD2) datasync %d\n", filp, datasync);
966
967 inode_lock(inode);
968 nfs_inc_stats(inode, NFSIOS_VFSFSYNC);
969 inode_unlock(inode);
970 return 0;
971 }
972
973
974
975
976
977
978
979
980
981
982
983 void nfs_force_lookup_revalidate(struct inode *dir)
984 {
985 NFS_I(dir)->cache_change_attribute++;
986 }
987 EXPORT_SYMBOL_GPL(nfs_force_lookup_revalidate);
988
989
990
991
992
993
994
995 static int nfs_check_verifier(struct inode *dir, struct dentry *dentry,
996 int rcu_walk)
997 {
998 if (IS_ROOT(dentry))
999 return 1;
1000 if (NFS_SERVER(dir)->flags & NFS_MOUNT_LOOKUP_CACHE_NONE)
1001 return 0;
1002 if (!nfs_verify_change_attribute(dir, dentry->d_time))
1003 return 0;
1004
1005 if (nfs_mapping_need_revalidate_inode(dir)) {
1006 if (rcu_walk)
1007 return 0;
1008 if (__nfs_revalidate_inode(NFS_SERVER(dir), dir) < 0)
1009 return 0;
1010 }
1011 if (!nfs_verify_change_attribute(dir, dentry->d_time))
1012 return 0;
1013 return 1;
1014 }
1015
1016
1017
1018
1019
1020 static int nfs_is_exclusive_create(struct inode *dir, unsigned int flags)
1021 {
1022 if (NFS_PROTO(dir)->version == 2)
1023 return 0;
1024 return flags & LOOKUP_EXCL;
1025 }
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035 static
1036 int nfs_lookup_verify_inode(struct inode *inode, unsigned int flags)
1037 {
1038 struct nfs_server *server = NFS_SERVER(inode);
1039 int ret;
1040
1041 if (IS_AUTOMOUNT(inode))
1042 return 0;
1043
1044 if (flags & LOOKUP_OPEN) {
1045 switch (inode->i_mode & S_IFMT) {
1046 case S_IFREG:
1047
1048 if (server->caps & NFS_CAP_ATOMIC_OPEN)
1049 goto out;
1050
1051 case S_IFDIR:
1052 if (server->flags & NFS_MOUNT_NOCTO)
1053 break;
1054
1055 goto out_force;
1056 }
1057 }
1058
1059
1060 if (flags & LOOKUP_REVAL)
1061 goto out_force;
1062 out:
1063 return (inode->i_nlink == 0) ? -ESTALE : 0;
1064 out_force:
1065 if (flags & LOOKUP_RCU)
1066 return -ECHILD;
1067 ret = __nfs_revalidate_inode(server, inode);
1068 if (ret != 0)
1069 return ret;
1070 goto out;
1071 }
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086 static inline
1087 int nfs_neg_need_reval(struct inode *dir, struct dentry *dentry,
1088 unsigned int flags)
1089 {
1090 if (flags & (LOOKUP_CREATE | LOOKUP_RENAME_TARGET))
1091 return 0;
1092 if (NFS_SERVER(dir)->flags & NFS_MOUNT_LOOKUP_CACHE_NONEG)
1093 return 1;
1094 return !nfs_check_verifier(dir, dentry, flags & LOOKUP_RCU);
1095 }
1096
1097 static int
1098 nfs_lookup_revalidate_done(struct inode *dir, struct dentry *dentry,
1099 struct inode *inode, int error)
1100 {
1101 switch (error) {
1102 case 1:
1103 dfprintk(LOOKUPCACHE, "NFS: %s(%pd2) is valid\n",
1104 __func__, dentry);
1105 return 1;
1106 case 0:
1107 nfs_mark_for_revalidate(dir);
1108 if (inode && S_ISDIR(inode->i_mode)) {
1109
1110 nfs_zap_caches(inode);
1111
1112
1113
1114
1115
1116
1117 if (IS_ROOT(dentry))
1118 return 1;
1119 }
1120 dfprintk(LOOKUPCACHE, "NFS: %s(%pd2) is invalid\n",
1121 __func__, dentry);
1122 return 0;
1123 }
1124 dfprintk(LOOKUPCACHE, "NFS: %s(%pd2) lookup returned error %d\n",
1125 __func__, dentry, error);
1126 return error;
1127 }
1128
1129 static int
1130 nfs_lookup_revalidate_negative(struct inode *dir, struct dentry *dentry,
1131 unsigned int flags)
1132 {
1133 int ret = 1;
1134 if (nfs_neg_need_reval(dir, dentry, flags)) {
1135 if (flags & LOOKUP_RCU)
1136 return -ECHILD;
1137 ret = 0;
1138 }
1139 return nfs_lookup_revalidate_done(dir, dentry, NULL, ret);
1140 }
1141
1142 static int
1143 nfs_lookup_revalidate_delegated(struct inode *dir, struct dentry *dentry,
1144 struct inode *inode)
1145 {
1146 nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
1147 return nfs_lookup_revalidate_done(dir, dentry, inode, 1);
1148 }
1149
1150 static int
1151 nfs_lookup_revalidate_dentry(struct inode *dir, struct dentry *dentry,
1152 struct inode *inode)
1153 {
1154 struct nfs_fh *fhandle;
1155 struct nfs_fattr *fattr;
1156 struct nfs4_label *label;
1157 int ret;
1158
1159 ret = -ENOMEM;
1160 fhandle = nfs_alloc_fhandle();
1161 fattr = nfs_alloc_fattr();
1162 label = nfs4_label_alloc(NFS_SERVER(inode), GFP_KERNEL);
1163 if (fhandle == NULL || fattr == NULL || IS_ERR(label))
1164 goto out;
1165
1166 ret = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, fhandle, fattr, label);
1167 if (ret < 0) {
1168 if (ret == -ESTALE || ret == -ENOENT)
1169 ret = 0;
1170 goto out;
1171 }
1172 ret = 0;
1173 if (nfs_compare_fh(NFS_FH(inode), fhandle))
1174 goto out;
1175 if (nfs_refresh_inode(inode, fattr) < 0)
1176 goto out;
1177
1178 nfs_setsecurity(inode, fattr, label);
1179 nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
1180
1181
1182 nfs_force_use_readdirplus(dir);
1183 ret = 1;
1184 out:
1185 nfs_free_fattr(fattr);
1186 nfs_free_fhandle(fhandle);
1187 nfs4_label_free(label);
1188 return nfs_lookup_revalidate_done(dir, dentry, inode, ret);
1189 }
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202 static int
1203 nfs_do_lookup_revalidate(struct inode *dir, struct dentry *dentry,
1204 unsigned int flags)
1205 {
1206 struct inode *inode;
1207 int error;
1208
1209 nfs_inc_stats(dir, NFSIOS_DENTRYREVALIDATE);
1210 inode = d_inode(dentry);
1211
1212 if (!inode)
1213 return nfs_lookup_revalidate_negative(dir, dentry, flags);
1214
1215 if (is_bad_inode(inode)) {
1216 dfprintk(LOOKUPCACHE, "%s: %pd2 has dud inode\n",
1217 __func__, dentry);
1218 goto out_bad;
1219 }
1220
1221 if (NFS_PROTO(dir)->have_delegation(inode, FMODE_READ))
1222 return nfs_lookup_revalidate_delegated(dir, dentry, inode);
1223
1224
1225 if (!(flags & (LOOKUP_EXCL | LOOKUP_REVAL)) &&
1226 nfs_check_verifier(dir, dentry, flags & LOOKUP_RCU)) {
1227 error = nfs_lookup_verify_inode(inode, flags);
1228 if (error) {
1229 if (error == -ESTALE)
1230 nfs_zap_caches(dir);
1231 goto out_bad;
1232 }
1233 nfs_advise_use_readdirplus(dir);
1234 goto out_valid;
1235 }
1236
1237 if (flags & LOOKUP_RCU)
1238 return -ECHILD;
1239
1240 if (NFS_STALE(inode))
1241 goto out_bad;
1242
1243 trace_nfs_lookup_revalidate_enter(dir, dentry, flags);
1244 error = nfs_lookup_revalidate_dentry(dir, dentry, inode);
1245 trace_nfs_lookup_revalidate_exit(dir, dentry, flags, error);
1246 return error;
1247 out_valid:
1248 return nfs_lookup_revalidate_done(dir, dentry, inode, 1);
1249 out_bad:
1250 if (flags & LOOKUP_RCU)
1251 return -ECHILD;
1252 return nfs_lookup_revalidate_done(dir, dentry, inode, 0);
1253 }
1254
1255 static int
1256 __nfs_lookup_revalidate(struct dentry *dentry, unsigned int flags,
1257 int (*reval)(struct inode *, struct dentry *, unsigned int))
1258 {
1259 struct dentry *parent;
1260 struct inode *dir;
1261 int ret;
1262
1263 if (flags & LOOKUP_RCU) {
1264 parent = READ_ONCE(dentry->d_parent);
1265 dir = d_inode_rcu(parent);
1266 if (!dir)
1267 return -ECHILD;
1268 ret = reval(dir, dentry, flags);
1269 if (parent != READ_ONCE(dentry->d_parent))
1270 return -ECHILD;
1271 } else {
1272 parent = dget_parent(dentry);
1273 ret = reval(d_inode(parent), dentry, flags);
1274 dput(parent);
1275 }
1276 return ret;
1277 }
1278
1279 static int nfs_lookup_revalidate(struct dentry *dentry, unsigned int flags)
1280 {
1281 return __nfs_lookup_revalidate(dentry, flags, nfs_do_lookup_revalidate);
1282 }
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293 static int nfs_weak_revalidate(struct dentry *dentry, unsigned int flags)
1294 {
1295 struct inode *inode = d_inode(dentry);
1296 int error = 0;
1297
1298
1299
1300
1301
1302
1303 if (!inode) {
1304 dfprintk(LOOKUPCACHE, "%s: %pd2 has negative inode\n",
1305 __func__, dentry);
1306 return 1;
1307 }
1308
1309 if (is_bad_inode(inode)) {
1310 dfprintk(LOOKUPCACHE, "%s: %pd2 has dud inode\n",
1311 __func__, dentry);
1312 return 0;
1313 }
1314
1315 error = nfs_lookup_verify_inode(inode, flags);
1316 dfprintk(LOOKUPCACHE, "NFS: %s: inode %lu is %s\n",
1317 __func__, inode->i_ino, error ? "invalid" : "valid");
1318 return !error;
1319 }
1320
1321
1322
1323
1324 static int nfs_dentry_delete(const struct dentry *dentry)
1325 {
1326 dfprintk(VFS, "NFS: dentry_delete(%pd2, %x)\n",
1327 dentry, dentry->d_flags);
1328
1329
1330 if (d_really_is_positive(dentry) && NFS_STALE(d_inode(dentry)))
1331 return 1;
1332
1333 if (dentry->d_flags & DCACHE_NFSFS_RENAMED) {
1334
1335 return 1;
1336 }
1337 if (!(dentry->d_sb->s_flags & SB_ACTIVE)) {
1338
1339
1340 return 1;
1341 }
1342 return 0;
1343
1344 }
1345
1346
1347 static void nfs_drop_nlink(struct inode *inode)
1348 {
1349 spin_lock(&inode->i_lock);
1350
1351 if (inode->i_nlink > 0)
1352 drop_nlink(inode);
1353 NFS_I(inode)->attr_gencount = nfs_inc_attr_generation_counter();
1354 NFS_I(inode)->cache_validity |= NFS_INO_INVALID_CHANGE
1355 | NFS_INO_INVALID_CTIME
1356 | NFS_INO_INVALID_OTHER
1357 | NFS_INO_REVAL_FORCED;
1358 spin_unlock(&inode->i_lock);
1359 }
1360
1361
1362
1363
1364
1365 static void nfs_dentry_iput(struct dentry *dentry, struct inode *inode)
1366 {
1367 if (S_ISDIR(inode->i_mode))
1368
1369 NFS_I(inode)->cache_validity |= NFS_INO_INVALID_DATA;
1370
1371 if (dentry->d_flags & DCACHE_NFSFS_RENAMED) {
1372 nfs_complete_unlink(dentry, inode);
1373 nfs_drop_nlink(inode);
1374 }
1375 iput(inode);
1376 }
1377
1378 static void nfs_d_release(struct dentry *dentry)
1379 {
1380
1381 if (unlikely(dentry->d_fsdata)) {
1382 if (dentry->d_flags & DCACHE_NFSFS_RENAMED)
1383 WARN_ON(1);
1384 else
1385 kfree(dentry->d_fsdata);
1386 }
1387 }
1388
1389 const struct dentry_operations nfs_dentry_operations = {
1390 .d_revalidate = nfs_lookup_revalidate,
1391 .d_weak_revalidate = nfs_weak_revalidate,
1392 .d_delete = nfs_dentry_delete,
1393 .d_iput = nfs_dentry_iput,
1394 .d_automount = nfs_d_automount,
1395 .d_release = nfs_d_release,
1396 };
1397 EXPORT_SYMBOL_GPL(nfs_dentry_operations);
1398
1399 struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, unsigned int flags)
1400 {
1401 struct dentry *res;
1402 struct inode *inode = NULL;
1403 struct nfs_fh *fhandle = NULL;
1404 struct nfs_fattr *fattr = NULL;
1405 struct nfs4_label *label = NULL;
1406 int error;
1407
1408 dfprintk(VFS, "NFS: lookup(%pd2)\n", dentry);
1409 nfs_inc_stats(dir, NFSIOS_VFSLOOKUP);
1410
1411 if (unlikely(dentry->d_name.len > NFS_SERVER(dir)->namelen))
1412 return ERR_PTR(-ENAMETOOLONG);
1413
1414
1415
1416
1417
1418 if (nfs_is_exclusive_create(dir, flags) || flags & LOOKUP_RENAME_TARGET)
1419 return NULL;
1420
1421 res = ERR_PTR(-ENOMEM);
1422 fhandle = nfs_alloc_fhandle();
1423 fattr = nfs_alloc_fattr();
1424 if (fhandle == NULL || fattr == NULL)
1425 goto out;
1426
1427 label = nfs4_label_alloc(NFS_SERVER(dir), GFP_NOWAIT);
1428 if (IS_ERR(label))
1429 goto out;
1430
1431 trace_nfs_lookup_enter(dir, dentry, flags);
1432 error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, fhandle, fattr, label);
1433 if (error == -ENOENT)
1434 goto no_entry;
1435 if (error < 0) {
1436 res = ERR_PTR(error);
1437 goto out_label;
1438 }
1439 inode = nfs_fhget(dentry->d_sb, fhandle, fattr, label);
1440 res = ERR_CAST(inode);
1441 if (IS_ERR(res))
1442 goto out_label;
1443
1444
1445 nfs_force_use_readdirplus(dir);
1446
1447 no_entry:
1448 res = d_splice_alias(inode, dentry);
1449 if (res != NULL) {
1450 if (IS_ERR(res))
1451 goto out_label;
1452 dentry = res;
1453 }
1454 nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
1455 out_label:
1456 trace_nfs_lookup_exit(dir, dentry, flags, error);
1457 nfs4_label_free(label);
1458 out:
1459 nfs_free_fattr(fattr);
1460 nfs_free_fhandle(fhandle);
1461 return res;
1462 }
1463 EXPORT_SYMBOL_GPL(nfs_lookup);
1464
1465 #if IS_ENABLED(CONFIG_NFS_V4)
1466 static int nfs4_lookup_revalidate(struct dentry *, unsigned int);
1467
1468 const struct dentry_operations nfs4_dentry_operations = {
1469 .d_revalidate = nfs4_lookup_revalidate,
1470 .d_weak_revalidate = nfs_weak_revalidate,
1471 .d_delete = nfs_dentry_delete,
1472 .d_iput = nfs_dentry_iput,
1473 .d_automount = nfs_d_automount,
1474 .d_release = nfs_d_release,
1475 };
1476 EXPORT_SYMBOL_GPL(nfs4_dentry_operations);
1477
1478 static fmode_t flags_to_mode(int flags)
1479 {
1480 fmode_t res = (__force fmode_t)flags & FMODE_EXEC;
1481 if ((flags & O_ACCMODE) != O_WRONLY)
1482 res |= FMODE_READ;
1483 if ((flags & O_ACCMODE) != O_RDONLY)
1484 res |= FMODE_WRITE;
1485 return res;
1486 }
1487
1488 static struct nfs_open_context *create_nfs_open_context(struct dentry *dentry, int open_flags, struct file *filp)
1489 {
1490 return alloc_nfs_open_context(dentry, flags_to_mode(open_flags), filp);
1491 }
1492
1493 static int do_open(struct inode *inode, struct file *filp)
1494 {
1495 nfs_fscache_open_file(inode, filp);
1496 return 0;
1497 }
1498
1499 static int nfs_finish_open(struct nfs_open_context *ctx,
1500 struct dentry *dentry,
1501 struct file *file, unsigned open_flags)
1502 {
1503 int err;
1504
1505 err = finish_open(file, dentry, do_open);
1506 if (err)
1507 goto out;
1508 if (S_ISREG(file->f_path.dentry->d_inode->i_mode))
1509 nfs_file_set_open_context(file, ctx);
1510 else
1511 err = -EOPENSTALE;
1512 out:
1513 return err;
1514 }
1515
1516 int nfs_atomic_open(struct inode *dir, struct dentry *dentry,
1517 struct file *file, unsigned open_flags,
1518 umode_t mode)
1519 {
1520 DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
1521 struct nfs_open_context *ctx;
1522 struct dentry *res;
1523 struct iattr attr = { .ia_valid = ATTR_OPEN };
1524 struct inode *inode;
1525 unsigned int lookup_flags = 0;
1526 bool switched = false;
1527 int created = 0;
1528 int err;
1529
1530
1531 BUG_ON(d_inode(dentry));
1532
1533 dfprintk(VFS, "NFS: atomic_open(%s/%lu), %pd\n",
1534 dir->i_sb->s_id, dir->i_ino, dentry);
1535
1536 err = nfs_check_flags(open_flags);
1537 if (err)
1538 return err;
1539
1540
1541 if ((open_flags & O_DIRECTORY)) {
1542 if (!d_in_lookup(dentry)) {
1543
1544
1545
1546
1547
1548 return -ENOENT;
1549 }
1550 lookup_flags = LOOKUP_OPEN|LOOKUP_DIRECTORY;
1551 goto no_open;
1552 }
1553
1554 if (dentry->d_name.len > NFS_SERVER(dir)->namelen)
1555 return -ENAMETOOLONG;
1556
1557 if (open_flags & O_CREAT) {
1558 struct nfs_server *server = NFS_SERVER(dir);
1559
1560 if (!(server->attr_bitmask[2] & FATTR4_WORD2_MODE_UMASK))
1561 mode &= ~current_umask();
1562
1563 attr.ia_valid |= ATTR_MODE;
1564 attr.ia_mode = mode;
1565 }
1566 if (open_flags & O_TRUNC) {
1567 attr.ia_valid |= ATTR_SIZE;
1568 attr.ia_size = 0;
1569 }
1570
1571 if (!(open_flags & O_CREAT) && !d_in_lookup(dentry)) {
1572 d_drop(dentry);
1573 switched = true;
1574 dentry = d_alloc_parallel(dentry->d_parent,
1575 &dentry->d_name, &wq);
1576 if (IS_ERR(dentry))
1577 return PTR_ERR(dentry);
1578 if (unlikely(!d_in_lookup(dentry)))
1579 return finish_no_open(file, dentry);
1580 }
1581
1582 ctx = create_nfs_open_context(dentry, open_flags, file);
1583 err = PTR_ERR(ctx);
1584 if (IS_ERR(ctx))
1585 goto out;
1586
1587 trace_nfs_atomic_open_enter(dir, ctx, open_flags);
1588 inode = NFS_PROTO(dir)->open_context(dir, ctx, open_flags, &attr, &created);
1589 if (created)
1590 file->f_mode |= FMODE_CREATED;
1591 if (IS_ERR(inode)) {
1592 err = PTR_ERR(inode);
1593 trace_nfs_atomic_open_exit(dir, ctx, open_flags, err);
1594 put_nfs_open_context(ctx);
1595 d_drop(dentry);
1596 switch (err) {
1597 case -ENOENT:
1598 d_splice_alias(NULL, dentry);
1599 nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
1600 break;
1601 case -EISDIR:
1602 case -ENOTDIR:
1603 goto no_open;
1604 case -ELOOP:
1605 if (!(open_flags & O_NOFOLLOW))
1606 goto no_open;
1607 break;
1608
1609 default:
1610 break;
1611 }
1612 goto out;
1613 }
1614
1615 err = nfs_finish_open(ctx, ctx->dentry, file, open_flags);
1616 trace_nfs_atomic_open_exit(dir, ctx, open_flags, err);
1617 put_nfs_open_context(ctx);
1618 out:
1619 if (unlikely(switched)) {
1620 d_lookup_done(dentry);
1621 dput(dentry);
1622 }
1623 return err;
1624
1625 no_open:
1626 res = nfs_lookup(dir, dentry, lookup_flags);
1627 if (switched) {
1628 d_lookup_done(dentry);
1629 if (!res)
1630 res = dentry;
1631 else
1632 dput(dentry);
1633 }
1634 if (IS_ERR(res))
1635 return PTR_ERR(res);
1636 return finish_no_open(file, res);
1637 }
1638 EXPORT_SYMBOL_GPL(nfs_atomic_open);
1639
1640 static int
1641 nfs4_do_lookup_revalidate(struct inode *dir, struct dentry *dentry,
1642 unsigned int flags)
1643 {
1644 struct inode *inode;
1645
1646 if (!(flags & LOOKUP_OPEN) || (flags & LOOKUP_DIRECTORY))
1647 goto full_reval;
1648 if (d_mountpoint(dentry))
1649 goto full_reval;
1650
1651 inode = d_inode(dentry);
1652
1653
1654
1655
1656 if (inode == NULL)
1657 goto full_reval;
1658
1659 if (NFS_PROTO(dir)->have_delegation(inode, FMODE_READ))
1660 return nfs_lookup_revalidate_delegated(dir, dentry, inode);
1661
1662
1663 if (!S_ISREG(inode->i_mode))
1664 goto full_reval;
1665
1666
1667 if (flags & (LOOKUP_EXCL | LOOKUP_REVAL))
1668 goto reval_dentry;
1669
1670
1671 if (!nfs_check_verifier(dir, dentry, flags & LOOKUP_RCU))
1672 goto reval_dentry;
1673
1674
1675 return 1;
1676 reval_dentry:
1677 if (flags & LOOKUP_RCU)
1678 return -ECHILD;
1679 return nfs_lookup_revalidate_dentry(dir, dentry, inode);
1680
1681 full_reval:
1682 return nfs_do_lookup_revalidate(dir, dentry, flags);
1683 }
1684
1685 static int nfs4_lookup_revalidate(struct dentry *dentry, unsigned int flags)
1686 {
1687 return __nfs_lookup_revalidate(dentry, flags,
1688 nfs4_do_lookup_revalidate);
1689 }
1690
1691 #endif
1692
1693 struct dentry *
1694 nfs_add_or_obtain(struct dentry *dentry, struct nfs_fh *fhandle,
1695 struct nfs_fattr *fattr,
1696 struct nfs4_label *label)
1697 {
1698 struct dentry *parent = dget_parent(dentry);
1699 struct inode *dir = d_inode(parent);
1700 struct inode *inode;
1701 struct dentry *d;
1702 int error;
1703
1704 d_drop(dentry);
1705
1706 if (fhandle->size == 0) {
1707 error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, fhandle, fattr, NULL);
1708 if (error)
1709 goto out_error;
1710 }
1711 nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
1712 if (!(fattr->valid & NFS_ATTR_FATTR)) {
1713 struct nfs_server *server = NFS_SB(dentry->d_sb);
1714 error = server->nfs_client->rpc_ops->getattr(server, fhandle,
1715 fattr, NULL, NULL);
1716 if (error < 0)
1717 goto out_error;
1718 }
1719 inode = nfs_fhget(dentry->d_sb, fhandle, fattr, label);
1720 d = d_splice_alias(inode, dentry);
1721 out:
1722 dput(parent);
1723 return d;
1724 out_error:
1725 nfs_mark_for_revalidate(dir);
1726 d = ERR_PTR(error);
1727 goto out;
1728 }
1729 EXPORT_SYMBOL_GPL(nfs_add_or_obtain);
1730
1731
1732
1733
1734 int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fhandle,
1735 struct nfs_fattr *fattr,
1736 struct nfs4_label *label)
1737 {
1738 struct dentry *d;
1739
1740 d = nfs_add_or_obtain(dentry, fhandle, fattr, label);
1741 if (IS_ERR(d))
1742 return PTR_ERR(d);
1743
1744
1745 dput(d);
1746 return 0;
1747 }
1748 EXPORT_SYMBOL_GPL(nfs_instantiate);
1749
1750
1751
1752
1753
1754
1755
1756 int nfs_create(struct inode *dir, struct dentry *dentry,
1757 umode_t mode, bool excl)
1758 {
1759 struct iattr attr;
1760 int open_flags = excl ? O_CREAT | O_EXCL : O_CREAT;
1761 int error;
1762
1763 dfprintk(VFS, "NFS: create(%s/%lu), %pd\n",
1764 dir->i_sb->s_id, dir->i_ino, dentry);
1765
1766 attr.ia_mode = mode;
1767 attr.ia_valid = ATTR_MODE;
1768
1769 trace_nfs_create_enter(dir, dentry, open_flags);
1770 error = NFS_PROTO(dir)->create(dir, dentry, &attr, open_flags);
1771 trace_nfs_create_exit(dir, dentry, open_flags, error);
1772 if (error != 0)
1773 goto out_err;
1774 return 0;
1775 out_err:
1776 d_drop(dentry);
1777 return error;
1778 }
1779 EXPORT_SYMBOL_GPL(nfs_create);
1780
1781
1782
1783
1784 int
1785 nfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t rdev)
1786 {
1787 struct iattr attr;
1788 int status;
1789
1790 dfprintk(VFS, "NFS: mknod(%s/%lu), %pd\n",
1791 dir->i_sb->s_id, dir->i_ino, dentry);
1792
1793 attr.ia_mode = mode;
1794 attr.ia_valid = ATTR_MODE;
1795
1796 trace_nfs_mknod_enter(dir, dentry);
1797 status = NFS_PROTO(dir)->mknod(dir, dentry, &attr, rdev);
1798 trace_nfs_mknod_exit(dir, dentry, status);
1799 if (status != 0)
1800 goto out_err;
1801 return 0;
1802 out_err:
1803 d_drop(dentry);
1804 return status;
1805 }
1806 EXPORT_SYMBOL_GPL(nfs_mknod);
1807
1808
1809
1810
1811 int nfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
1812 {
1813 struct iattr attr;
1814 int error;
1815
1816 dfprintk(VFS, "NFS: mkdir(%s/%lu), %pd\n",
1817 dir->i_sb->s_id, dir->i_ino, dentry);
1818
1819 attr.ia_valid = ATTR_MODE;
1820 attr.ia_mode = mode | S_IFDIR;
1821
1822 trace_nfs_mkdir_enter(dir, dentry);
1823 error = NFS_PROTO(dir)->mkdir(dir, dentry, &attr);
1824 trace_nfs_mkdir_exit(dir, dentry, error);
1825 if (error != 0)
1826 goto out_err;
1827 return 0;
1828 out_err:
1829 d_drop(dentry);
1830 return error;
1831 }
1832 EXPORT_SYMBOL_GPL(nfs_mkdir);
1833
1834 static void nfs_dentry_handle_enoent(struct dentry *dentry)
1835 {
1836 if (simple_positive(dentry))
1837 d_delete(dentry);
1838 }
1839
1840 int nfs_rmdir(struct inode *dir, struct dentry *dentry)
1841 {
1842 int error;
1843
1844 dfprintk(VFS, "NFS: rmdir(%s/%lu), %pd\n",
1845 dir->i_sb->s_id, dir->i_ino, dentry);
1846
1847 trace_nfs_rmdir_enter(dir, dentry);
1848 if (d_really_is_positive(dentry)) {
1849 down_write(&NFS_I(d_inode(dentry))->rmdir_sem);
1850 error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name);
1851
1852 switch (error) {
1853 case 0:
1854 clear_nlink(d_inode(dentry));
1855 break;
1856 case -ENOENT:
1857 nfs_dentry_handle_enoent(dentry);
1858 }
1859 up_write(&NFS_I(d_inode(dentry))->rmdir_sem);
1860 } else
1861 error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name);
1862 trace_nfs_rmdir_exit(dir, dentry, error);
1863
1864 return error;
1865 }
1866 EXPORT_SYMBOL_GPL(nfs_rmdir);
1867
1868
1869
1870
1871
1872
1873
1874
1875 static int nfs_safe_remove(struct dentry *dentry)
1876 {
1877 struct inode *dir = d_inode(dentry->d_parent);
1878 struct inode *inode = d_inode(dentry);
1879 int error = -EBUSY;
1880
1881 dfprintk(VFS, "NFS: safe_remove(%pd2)\n", dentry);
1882
1883
1884 if (dentry->d_flags & DCACHE_NFSFS_RENAMED) {
1885 error = 0;
1886 goto out;
1887 }
1888
1889 trace_nfs_remove_enter(dir, dentry);
1890 if (inode != NULL) {
1891 error = NFS_PROTO(dir)->remove(dir, dentry);
1892 if (error == 0)
1893 nfs_drop_nlink(inode);
1894 } else
1895 error = NFS_PROTO(dir)->remove(dir, dentry);
1896 if (error == -ENOENT)
1897 nfs_dentry_handle_enoent(dentry);
1898 trace_nfs_remove_exit(dir, dentry, error);
1899 out:
1900 return error;
1901 }
1902
1903
1904
1905
1906
1907
1908 int nfs_unlink(struct inode *dir, struct dentry *dentry)
1909 {
1910 int error;
1911 int need_rehash = 0;
1912
1913 dfprintk(VFS, "NFS: unlink(%s/%lu, %pd)\n", dir->i_sb->s_id,
1914 dir->i_ino, dentry);
1915
1916 trace_nfs_unlink_enter(dir, dentry);
1917 spin_lock(&dentry->d_lock);
1918 if (d_count(dentry) > 1) {
1919 spin_unlock(&dentry->d_lock);
1920
1921 write_inode_now(d_inode(dentry), 0);
1922 error = nfs_sillyrename(dir, dentry);
1923 goto out;
1924 }
1925 if (!d_unhashed(dentry)) {
1926 __d_drop(dentry);
1927 need_rehash = 1;
1928 }
1929 spin_unlock(&dentry->d_lock);
1930 error = nfs_safe_remove(dentry);
1931 if (!error || error == -ENOENT) {
1932 nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
1933 } else if (need_rehash)
1934 d_rehash(dentry);
1935 out:
1936 trace_nfs_unlink_exit(dir, dentry, error);
1937 return error;
1938 }
1939 EXPORT_SYMBOL_GPL(nfs_unlink);
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956 int nfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname)
1957 {
1958 struct page *page;
1959 char *kaddr;
1960 struct iattr attr;
1961 unsigned int pathlen = strlen(symname);
1962 int error;
1963
1964 dfprintk(VFS, "NFS: symlink(%s/%lu, %pd, %s)\n", dir->i_sb->s_id,
1965 dir->i_ino, dentry, symname);
1966
1967 if (pathlen > PAGE_SIZE)
1968 return -ENAMETOOLONG;
1969
1970 attr.ia_mode = S_IFLNK | S_IRWXUGO;
1971 attr.ia_valid = ATTR_MODE;
1972
1973 page = alloc_page(GFP_USER);
1974 if (!page)
1975 return -ENOMEM;
1976
1977 kaddr = page_address(page);
1978 memcpy(kaddr, symname, pathlen);
1979 if (pathlen < PAGE_SIZE)
1980 memset(kaddr + pathlen, 0, PAGE_SIZE - pathlen);
1981
1982 trace_nfs_symlink_enter(dir, dentry);
1983 error = NFS_PROTO(dir)->symlink(dir, dentry, page, pathlen, &attr);
1984 trace_nfs_symlink_exit(dir, dentry, error);
1985 if (error != 0) {
1986 dfprintk(VFS, "NFS: symlink(%s/%lu, %pd, %s) error %d\n",
1987 dir->i_sb->s_id, dir->i_ino,
1988 dentry, symname, error);
1989 d_drop(dentry);
1990 __free_page(page);
1991 return error;
1992 }
1993
1994
1995
1996
1997
1998 if (!add_to_page_cache_lru(page, d_inode(dentry)->i_mapping, 0,
1999 GFP_KERNEL)) {
2000 SetPageUptodate(page);
2001 unlock_page(page);
2002
2003
2004
2005
2006 put_page(page);
2007 } else
2008 __free_page(page);
2009
2010 return 0;
2011 }
2012 EXPORT_SYMBOL_GPL(nfs_symlink);
2013
2014 int
2015 nfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
2016 {
2017 struct inode *inode = d_inode(old_dentry);
2018 int error;
2019
2020 dfprintk(VFS, "NFS: link(%pd2 -> %pd2)\n",
2021 old_dentry, dentry);
2022
2023 trace_nfs_link_enter(inode, dir, dentry);
2024 d_drop(dentry);
2025 error = NFS_PROTO(dir)->link(inode, dir, &dentry->d_name);
2026 if (error == 0) {
2027 ihold(inode);
2028 d_add(dentry, inode);
2029 }
2030 trace_nfs_link_exit(inode, dir, dentry, error);
2031 return error;
2032 }
2033 EXPORT_SYMBOL_GPL(nfs_link);
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059 int nfs_rename(struct inode *old_dir, struct dentry *old_dentry,
2060 struct inode *new_dir, struct dentry *new_dentry,
2061 unsigned int flags)
2062 {
2063 struct inode *old_inode = d_inode(old_dentry);
2064 struct inode *new_inode = d_inode(new_dentry);
2065 struct dentry *dentry = NULL, *rehash = NULL;
2066 struct rpc_task *task;
2067 int error = -EBUSY;
2068
2069 if (flags)
2070 return -EINVAL;
2071
2072 dfprintk(VFS, "NFS: rename(%pd2 -> %pd2, ct=%d)\n",
2073 old_dentry, new_dentry,
2074 d_count(new_dentry));
2075
2076 trace_nfs_rename_enter(old_dir, old_dentry, new_dir, new_dentry);
2077
2078
2079
2080
2081
2082
2083 if (new_inode && !S_ISDIR(new_inode->i_mode)) {
2084
2085
2086
2087
2088 if (!d_unhashed(new_dentry)) {
2089 d_drop(new_dentry);
2090 rehash = new_dentry;
2091 }
2092
2093 if (d_count(new_dentry) > 2) {
2094 int err;
2095
2096
2097 dentry = d_alloc(new_dentry->d_parent,
2098 &new_dentry->d_name);
2099 if (!dentry)
2100 goto out;
2101
2102
2103 err = nfs_sillyrename(new_dir, new_dentry);
2104 if (err)
2105 goto out;
2106
2107 new_dentry = dentry;
2108 rehash = NULL;
2109 new_inode = NULL;
2110 }
2111 }
2112
2113 task = nfs_async_rename(old_dir, new_dir, old_dentry, new_dentry, NULL);
2114 if (IS_ERR(task)) {
2115 error = PTR_ERR(task);
2116 goto out;
2117 }
2118
2119 error = rpc_wait_for_completion_task(task);
2120 if (error != 0) {
2121 ((struct nfs_renamedata *)task->tk_calldata)->cancelled = 1;
2122
2123 smp_wmb();
2124 } else
2125 error = task->tk_status;
2126 rpc_put_task(task);
2127
2128 if (error == 0) {
2129 spin_lock(&old_inode->i_lock);
2130 NFS_I(old_inode)->attr_gencount = nfs_inc_attr_generation_counter();
2131 NFS_I(old_inode)->cache_validity |= NFS_INO_INVALID_CHANGE
2132 | NFS_INO_INVALID_CTIME
2133 | NFS_INO_REVAL_FORCED;
2134 spin_unlock(&old_inode->i_lock);
2135 }
2136 out:
2137 if (rehash)
2138 d_rehash(rehash);
2139 trace_nfs_rename_exit(old_dir, old_dentry,
2140 new_dir, new_dentry, error);
2141 if (!error) {
2142 if (new_inode != NULL)
2143 nfs_drop_nlink(new_inode);
2144
2145
2146
2147
2148
2149
2150 d_move(old_dentry, new_dentry);
2151 nfs_set_verifier(old_dentry,
2152 nfs_save_change_attribute(new_dir));
2153 } else if (error == -ENOENT)
2154 nfs_dentry_handle_enoent(old_dentry);
2155
2156
2157 if (dentry)
2158 dput(dentry);
2159 return error;
2160 }
2161 EXPORT_SYMBOL_GPL(nfs_rename);
2162
2163 static DEFINE_SPINLOCK(nfs_access_lru_lock);
2164 static LIST_HEAD(nfs_access_lru_list);
2165 static atomic_long_t nfs_access_nr_entries;
2166
2167 static unsigned long nfs_access_max_cachesize = ULONG_MAX;
2168 module_param(nfs_access_max_cachesize, ulong, 0644);
2169 MODULE_PARM_DESC(nfs_access_max_cachesize, "NFS access maximum total cache length");
2170
2171 static void nfs_access_free_entry(struct nfs_access_entry *entry)
2172 {
2173 put_cred(entry->cred);
2174 kfree_rcu(entry, rcu_head);
2175 smp_mb__before_atomic();
2176 atomic_long_dec(&nfs_access_nr_entries);
2177 smp_mb__after_atomic();
2178 }
2179
2180 static void nfs_access_free_list(struct list_head *head)
2181 {
2182 struct nfs_access_entry *cache;
2183
2184 while (!list_empty(head)) {
2185 cache = list_entry(head->next, struct nfs_access_entry, lru);
2186 list_del(&cache->lru);
2187 nfs_access_free_entry(cache);
2188 }
2189 }
2190
2191 static unsigned long
2192 nfs_do_access_cache_scan(unsigned int nr_to_scan)
2193 {
2194 LIST_HEAD(head);
2195 struct nfs_inode *nfsi, *next;
2196 struct nfs_access_entry *cache;
2197 long freed = 0;
2198
2199 spin_lock(&nfs_access_lru_lock);
2200 list_for_each_entry_safe(nfsi, next, &nfs_access_lru_list, access_cache_inode_lru) {
2201 struct inode *inode;
2202
2203 if (nr_to_scan-- == 0)
2204 break;
2205 inode = &nfsi->vfs_inode;
2206 spin_lock(&inode->i_lock);
2207 if (list_empty(&nfsi->access_cache_entry_lru))
2208 goto remove_lru_entry;
2209 cache = list_entry(nfsi->access_cache_entry_lru.next,
2210 struct nfs_access_entry, lru);
2211 list_move(&cache->lru, &head);
2212 rb_erase(&cache->rb_node, &nfsi->access_cache);
2213 freed++;
2214 if (!list_empty(&nfsi->access_cache_entry_lru))
2215 list_move_tail(&nfsi->access_cache_inode_lru,
2216 &nfs_access_lru_list);
2217 else {
2218 remove_lru_entry:
2219 list_del_init(&nfsi->access_cache_inode_lru);
2220 smp_mb__before_atomic();
2221 clear_bit(NFS_INO_ACL_LRU_SET, &nfsi->flags);
2222 smp_mb__after_atomic();
2223 }
2224 spin_unlock(&inode->i_lock);
2225 }
2226 spin_unlock(&nfs_access_lru_lock);
2227 nfs_access_free_list(&head);
2228 return freed;
2229 }
2230
2231 unsigned long
2232 nfs_access_cache_scan(struct shrinker *shrink, struct shrink_control *sc)
2233 {
2234 int nr_to_scan = sc->nr_to_scan;
2235 gfp_t gfp_mask = sc->gfp_mask;
2236
2237 if ((gfp_mask & GFP_KERNEL) != GFP_KERNEL)
2238 return SHRINK_STOP;
2239 return nfs_do_access_cache_scan(nr_to_scan);
2240 }
2241
2242
2243 unsigned long
2244 nfs_access_cache_count(struct shrinker *shrink, struct shrink_control *sc)
2245 {
2246 return vfs_pressure_ratio(atomic_long_read(&nfs_access_nr_entries));
2247 }
2248
2249 static void
2250 nfs_access_cache_enforce_limit(void)
2251 {
2252 long nr_entries = atomic_long_read(&nfs_access_nr_entries);
2253 unsigned long diff;
2254 unsigned int nr_to_scan;
2255
2256 if (nr_entries < 0 || nr_entries <= nfs_access_max_cachesize)
2257 return;
2258 nr_to_scan = 100;
2259 diff = nr_entries - nfs_access_max_cachesize;
2260 if (diff < nr_to_scan)
2261 nr_to_scan = diff;
2262 nfs_do_access_cache_scan(nr_to_scan);
2263 }
2264
2265 static void __nfs_access_zap_cache(struct nfs_inode *nfsi, struct list_head *head)
2266 {
2267 struct rb_root *root_node = &nfsi->access_cache;
2268 struct rb_node *n;
2269 struct nfs_access_entry *entry;
2270
2271
2272 while ((n = rb_first(root_node)) != NULL) {
2273 entry = rb_entry(n, struct nfs_access_entry, rb_node);
2274 rb_erase(n, root_node);
2275 list_move(&entry->lru, head);
2276 }
2277 nfsi->cache_validity &= ~NFS_INO_INVALID_ACCESS;
2278 }
2279
2280 void nfs_access_zap_cache(struct inode *inode)
2281 {
2282 LIST_HEAD(head);
2283
2284 if (test_bit(NFS_INO_ACL_LRU_SET, &NFS_I(inode)->flags) == 0)
2285 return;
2286
2287 spin_lock(&nfs_access_lru_lock);
2288 if (test_and_clear_bit(NFS_INO_ACL_LRU_SET, &NFS_I(inode)->flags))
2289 list_del_init(&NFS_I(inode)->access_cache_inode_lru);
2290
2291 spin_lock(&inode->i_lock);
2292 __nfs_access_zap_cache(NFS_I(inode), &head);
2293 spin_unlock(&inode->i_lock);
2294 spin_unlock(&nfs_access_lru_lock);
2295 nfs_access_free_list(&head);
2296 }
2297 EXPORT_SYMBOL_GPL(nfs_access_zap_cache);
2298
2299 static struct nfs_access_entry *nfs_access_search_rbtree(struct inode *inode, const struct cred *cred)
2300 {
2301 struct rb_node *n = NFS_I(inode)->access_cache.rb_node;
2302
2303 while (n != NULL) {
2304 struct nfs_access_entry *entry =
2305 rb_entry(n, struct nfs_access_entry, rb_node);
2306 int cmp = cred_fscmp(cred, entry->cred);
2307
2308 if (cmp < 0)
2309 n = n->rb_left;
2310 else if (cmp > 0)
2311 n = n->rb_right;
2312 else
2313 return entry;
2314 }
2315 return NULL;
2316 }
2317
2318 static int nfs_access_get_cached(struct inode *inode, const struct cred *cred, struct nfs_access_entry *res, bool may_block)
2319 {
2320 struct nfs_inode *nfsi = NFS_I(inode);
2321 struct nfs_access_entry *cache;
2322 bool retry = true;
2323 int err;
2324
2325 spin_lock(&inode->i_lock);
2326 for(;;) {
2327 if (nfsi->cache_validity & NFS_INO_INVALID_ACCESS)
2328 goto out_zap;
2329 cache = nfs_access_search_rbtree(inode, cred);
2330 err = -ENOENT;
2331 if (cache == NULL)
2332 goto out;
2333
2334 if (!nfs_check_cache_invalid(inode, NFS_INO_INVALID_ACCESS))
2335 break;
2336 err = -ECHILD;
2337 if (!may_block)
2338 goto out;
2339 if (!retry)
2340 goto out_zap;
2341 spin_unlock(&inode->i_lock);
2342 err = __nfs_revalidate_inode(NFS_SERVER(inode), inode);
2343 if (err)
2344 return err;
2345 spin_lock(&inode->i_lock);
2346 retry = false;
2347 }
2348 res->cred = cache->cred;
2349 res->mask = cache->mask;
2350 list_move_tail(&cache->lru, &nfsi->access_cache_entry_lru);
2351 err = 0;
2352 out:
2353 spin_unlock(&inode->i_lock);
2354 return err;
2355 out_zap:
2356 spin_unlock(&inode->i_lock);
2357 nfs_access_zap_cache(inode);
2358 return -ENOENT;
2359 }
2360
2361 static int nfs_access_get_cached_rcu(struct inode *inode, const struct cred *cred, struct nfs_access_entry *res)
2362 {
2363
2364
2365
2366 struct nfs_inode *nfsi = NFS_I(inode);
2367 struct nfs_access_entry *cache;
2368 int err = -ECHILD;
2369 struct list_head *lh;
2370
2371 rcu_read_lock();
2372 if (nfsi->cache_validity & NFS_INO_INVALID_ACCESS)
2373 goto out;
2374 lh = rcu_dereference(nfsi->access_cache_entry_lru.prev);
2375 cache = list_entry(lh, struct nfs_access_entry, lru);
2376 if (lh == &nfsi->access_cache_entry_lru ||
2377 cred != cache->cred)
2378 cache = NULL;
2379 if (cache == NULL)
2380 goto out;
2381 if (nfs_check_cache_invalid(inode, NFS_INO_INVALID_ACCESS))
2382 goto out;
2383 res->cred = cache->cred;
2384 res->mask = cache->mask;
2385 err = 0;
2386 out:
2387 rcu_read_unlock();
2388 return err;
2389 }
2390
2391 static void nfs_access_add_rbtree(struct inode *inode, struct nfs_access_entry *set)
2392 {
2393 struct nfs_inode *nfsi = NFS_I(inode);
2394 struct rb_root *root_node = &nfsi->access_cache;
2395 struct rb_node **p = &root_node->rb_node;
2396 struct rb_node *parent = NULL;
2397 struct nfs_access_entry *entry;
2398 int cmp;
2399
2400 spin_lock(&inode->i_lock);
2401 while (*p != NULL) {
2402 parent = *p;
2403 entry = rb_entry(parent, struct nfs_access_entry, rb_node);
2404 cmp = cred_fscmp(set->cred, entry->cred);
2405
2406 if (cmp < 0)
2407 p = &parent->rb_left;
2408 else if (cmp > 0)
2409 p = &parent->rb_right;
2410 else
2411 goto found;
2412 }
2413 rb_link_node(&set->rb_node, parent, p);
2414 rb_insert_color(&set->rb_node, root_node);
2415 list_add_tail(&set->lru, &nfsi->access_cache_entry_lru);
2416 spin_unlock(&inode->i_lock);
2417 return;
2418 found:
2419 rb_replace_node(parent, &set->rb_node, root_node);
2420 list_add_tail(&set->lru, &nfsi->access_cache_entry_lru);
2421 list_del(&entry->lru);
2422 spin_unlock(&inode->i_lock);
2423 nfs_access_free_entry(entry);
2424 }
2425
2426 void nfs_access_add_cache(struct inode *inode, struct nfs_access_entry *set)
2427 {
2428 struct nfs_access_entry *cache = kmalloc(sizeof(*cache), GFP_KERNEL);
2429 if (cache == NULL)
2430 return;
2431 RB_CLEAR_NODE(&cache->rb_node);
2432 cache->cred = get_cred(set->cred);
2433 cache->mask = set->mask;
2434
2435
2436
2437
2438
2439 smp_wmb();
2440 nfs_access_add_rbtree(inode, cache);
2441
2442
2443 smp_mb__before_atomic();
2444 atomic_long_inc(&nfs_access_nr_entries);
2445 smp_mb__after_atomic();
2446
2447
2448 if (!test_bit(NFS_INO_ACL_LRU_SET, &NFS_I(inode)->flags)) {
2449 spin_lock(&nfs_access_lru_lock);
2450 if (!test_and_set_bit(NFS_INO_ACL_LRU_SET, &NFS_I(inode)->flags))
2451 list_add_tail(&NFS_I(inode)->access_cache_inode_lru,
2452 &nfs_access_lru_list);
2453 spin_unlock(&nfs_access_lru_lock);
2454 }
2455 nfs_access_cache_enforce_limit();
2456 }
2457 EXPORT_SYMBOL_GPL(nfs_access_add_cache);
2458
2459 #define NFS_MAY_READ (NFS_ACCESS_READ)
2460 #define NFS_MAY_WRITE (NFS_ACCESS_MODIFY | \
2461 NFS_ACCESS_EXTEND | \
2462 NFS_ACCESS_DELETE)
2463 #define NFS_FILE_MAY_WRITE (NFS_ACCESS_MODIFY | \
2464 NFS_ACCESS_EXTEND)
2465 #define NFS_DIR_MAY_WRITE NFS_MAY_WRITE
2466 #define NFS_MAY_LOOKUP (NFS_ACCESS_LOOKUP)
2467 #define NFS_MAY_EXECUTE (NFS_ACCESS_EXECUTE)
2468 static int
2469 nfs_access_calc_mask(u32 access_result, umode_t umode)
2470 {
2471 int mask = 0;
2472
2473 if (access_result & NFS_MAY_READ)
2474 mask |= MAY_READ;
2475 if (S_ISDIR(umode)) {
2476 if ((access_result & NFS_DIR_MAY_WRITE) == NFS_DIR_MAY_WRITE)
2477 mask |= MAY_WRITE;
2478 if ((access_result & NFS_MAY_LOOKUP) == NFS_MAY_LOOKUP)
2479 mask |= MAY_EXEC;
2480 } else if (S_ISREG(umode)) {
2481 if ((access_result & NFS_FILE_MAY_WRITE) == NFS_FILE_MAY_WRITE)
2482 mask |= MAY_WRITE;
2483 if ((access_result & NFS_MAY_EXECUTE) == NFS_MAY_EXECUTE)
2484 mask |= MAY_EXEC;
2485 } else if (access_result & NFS_MAY_WRITE)
2486 mask |= MAY_WRITE;
2487 return mask;
2488 }
2489
2490 void nfs_access_set_mask(struct nfs_access_entry *entry, u32 access_result)
2491 {
2492 entry->mask = access_result;
2493 }
2494 EXPORT_SYMBOL_GPL(nfs_access_set_mask);
2495
2496 static int nfs_do_access(struct inode *inode, const struct cred *cred, int mask)
2497 {
2498 struct nfs_access_entry cache;
2499 bool may_block = (mask & MAY_NOT_BLOCK) == 0;
2500 int cache_mask;
2501 int status;
2502
2503 trace_nfs_access_enter(inode);
2504
2505 status = nfs_access_get_cached_rcu(inode, cred, &cache);
2506 if (status != 0)
2507 status = nfs_access_get_cached(inode, cred, &cache, may_block);
2508 if (status == 0)
2509 goto out_cached;
2510
2511 status = -ECHILD;
2512 if (!may_block)
2513 goto out;
2514
2515
2516
2517
2518 cache.mask = NFS_ACCESS_READ | NFS_ACCESS_MODIFY | NFS_ACCESS_EXTEND;
2519 if (S_ISDIR(inode->i_mode))
2520 cache.mask |= NFS_ACCESS_DELETE | NFS_ACCESS_LOOKUP;
2521 else
2522 cache.mask |= NFS_ACCESS_EXECUTE;
2523 cache.cred = cred;
2524 status = NFS_PROTO(inode)->access(inode, &cache);
2525 if (status != 0) {
2526 if (status == -ESTALE) {
2527 nfs_zap_caches(inode);
2528 if (!S_ISDIR(inode->i_mode))
2529 set_bit(NFS_INO_STALE, &NFS_I(inode)->flags);
2530 }
2531 goto out;
2532 }
2533 nfs_access_add_cache(inode, &cache);
2534 out_cached:
2535 cache_mask = nfs_access_calc_mask(cache.mask, inode->i_mode);
2536 if ((mask & ~cache_mask & (MAY_READ | MAY_WRITE | MAY_EXEC)) != 0)
2537 status = -EACCES;
2538 out:
2539 trace_nfs_access_exit(inode, status);
2540 return status;
2541 }
2542
2543 static int nfs_open_permission_mask(int openflags)
2544 {
2545 int mask = 0;
2546
2547 if (openflags & __FMODE_EXEC) {
2548
2549 mask = MAY_EXEC;
2550 } else {
2551 if ((openflags & O_ACCMODE) != O_WRONLY)
2552 mask |= MAY_READ;
2553 if ((openflags & O_ACCMODE) != O_RDONLY)
2554 mask |= MAY_WRITE;
2555 }
2556
2557 return mask;
2558 }
2559
2560 int nfs_may_open(struct inode *inode, const struct cred *cred, int openflags)
2561 {
2562 return nfs_do_access(inode, cred, nfs_open_permission_mask(openflags));
2563 }
2564 EXPORT_SYMBOL_GPL(nfs_may_open);
2565
2566 static int nfs_execute_ok(struct inode *inode, int mask)
2567 {
2568 struct nfs_server *server = NFS_SERVER(inode);
2569 int ret = 0;
2570
2571 if (S_ISDIR(inode->i_mode))
2572 return 0;
2573 if (nfs_check_cache_invalid(inode, NFS_INO_INVALID_OTHER)) {
2574 if (mask & MAY_NOT_BLOCK)
2575 return -ECHILD;
2576 ret = __nfs_revalidate_inode(server, inode);
2577 }
2578 if (ret == 0 && !execute_ok(inode))
2579 ret = -EACCES;
2580 return ret;
2581 }
2582
2583 int nfs_permission(struct inode *inode, int mask)
2584 {
2585 const struct cred *cred = current_cred();
2586 int res = 0;
2587
2588 nfs_inc_stats(inode, NFSIOS_VFSACCESS);
2589
2590 if ((mask & (MAY_READ | MAY_WRITE | MAY_EXEC)) == 0)
2591 goto out;
2592
2593 if (mask & (MAY_ACCESS | MAY_CHDIR))
2594 goto force_lookup;
2595
2596 switch (inode->i_mode & S_IFMT) {
2597 case S_IFLNK:
2598 goto out;
2599 case S_IFREG:
2600 if ((mask & MAY_OPEN) &&
2601 nfs_server_capable(inode, NFS_CAP_ATOMIC_OPEN))
2602 return 0;
2603 break;
2604 case S_IFDIR:
2605
2606
2607
2608
2609 if ((mask & MAY_WRITE) && !(mask & MAY_READ))
2610 goto out;
2611 }
2612
2613 force_lookup:
2614 if (!NFS_PROTO(inode)->access)
2615 goto out_notsup;
2616
2617
2618 rcu_read_lock();
2619 res = nfs_do_access(inode, cred, mask|MAY_NOT_BLOCK);
2620 rcu_read_unlock();
2621 if (res == -ECHILD && !(mask & MAY_NOT_BLOCK)) {
2622
2623 res = nfs_do_access(inode, cred, mask);
2624 }
2625 out:
2626 if (!res && (mask & MAY_EXEC))
2627 res = nfs_execute_ok(inode, mask);
2628
2629 dfprintk(VFS, "NFS: permission(%s/%lu), mask=0x%x, res=%d\n",
2630 inode->i_sb->s_id, inode->i_ino, mask, res);
2631 return res;
2632 out_notsup:
2633 if (mask & MAY_NOT_BLOCK)
2634 return -ECHILD;
2635
2636 res = nfs_revalidate_inode(NFS_SERVER(inode), inode);
2637 if (res == 0)
2638 res = generic_permission(inode, mask);
2639 goto out;
2640 }
2641 EXPORT_SYMBOL_GPL(nfs_permission);
2642
2643
2644
2645
2646
2647
2648