1 /* 2 * linux/fs/nfs/dir.c 3 * 4 * Copyright (C) 1992 Rick Sladkey 5 * 6 * nfs directory handling functions 7 * 8 * 10 Apr 1996 Added silly rename for unlink --okir 9 * 28 Sep 1996 Improved directory cache --okir 10 * 23 Aug 1997 Claus Heine claus@momo.math.rwth-aachen.de 11 * Re-implemented silly rename for unlink, newly implemented 12 * silly rename for nfs_rename() following the suggestions 13 * of Olaf Kirch (okir) found in this file. 14 * Following Linus comments on my original hack, this version 15 * depends only on the dcache stuff and doesn't touch the inode 16 * layer (iput() and friends). 17 * 6 Jun 1999 Cache readdir lookups in the page cache. -DaveM 18 */ 19 20 #include <linux/time.h> 21 #include <linux/errno.h> 22 #include <linux/stat.h> 23 #include <linux/fcntl.h> 24 #include <linux/string.h> 25 #include <linux/kernel.h> 26 #include <linux/slab.h> 27 #include <linux/mm.h> 28 #include <linux/sunrpc/clnt.h> 29 #include <linux/nfs_fs.h> 30 #include <linux/nfs_mount.h> 31 #include <linux/pagemap.h> 32 #include <linux/smp_lock.h> 33 #include <linux/namei.h> 34 35 #include "delegation.h" 36 37 #define NFS_PARANOIA 1 38 /* #define NFS_DEBUG_VERBOSE 1 */ 39 40 static int nfs_opendir(struct inode *, struct file *); 41 static int nfs_readdir(struct file *, void *, filldir_t); 42 static struct dentry *nfs_lookup(struct inode *, struct dentry *, struct nameidata *); 43 static int nfs_create(struct inode *, struct dentry *, int, struct nameidata *); 44 static int nfs_mkdir(struct inode *, struct dentry *, int); 45 static int nfs_rmdir(struct inode *, struct dentry *); 46 static int nfs_unlink(struct inode *, struct dentry *); 47 static int nfs_symlink(struct inode *, struct dentry *, const char *); 48 static int nfs_link(struct dentry *, struct inode *, struct dentry *); 49 static int nfs_mknod(struct inode *, struct dentry *, int, dev_t); 50 static int nfs_rename(struct inode *, struct dentry *, 51 struct inode *, struct dentry *); 52 static int nfs_fsync_dir(struct file *, struct dentry *, int); 53 54 struct file_operations nfs_dir_operations = { 55 .read = generic_read_dir, 56 .readdir = nfs_readdir, 57 .open = nfs_opendir, 58 .release = nfs_release, 59 .fsync = nfs_fsync_dir, 60 }; 61 62 struct inode_operations nfs_dir_inode_operations = { 63 .create = nfs_create, 64 .lookup = nfs_lookup, 65 .link = nfs_link, 66 .unlink = nfs_unlink, 67 .symlink = nfs_symlink, 68 .mkdir = nfs_mkdir, 69 .rmdir = nfs_rmdir, 70 .mknod = nfs_mknod, 71 .rename = nfs_rename, 72 .permission = nfs_permission, 73 .getattr = nfs_getattr, 74 .setattr = nfs_setattr, 75 }; 76 77 #ifdef CONFIG_NFS_V4 78 79 static struct dentry *nfs_atomic_lookup(struct inode *, struct dentry *, struct nameidata *); 80 struct inode_operations nfs4_dir_inode_operations = { 81 .create = nfs_create, 82 .lookup = nfs_atomic_lookup, 83 .link = nfs_link, 84 .unlink = nfs_unlink, 85 .symlink = nfs_symlink, 86 .mkdir = nfs_mkdir, 87 .rmdir = nfs_rmdir, 88 .mknod = nfs_mknod, 89 .rename = nfs_rename, 90 .permission = nfs_permission, 91 .getattr = nfs_getattr, 92 .setattr = nfs_setattr, 93 }; 94 95 #endif /* CONFIG_NFS_V4 */ 96 97 /* 98 * Open file 99 */ 100 static int 101 nfs_opendir(struct inode *inode, struct file *filp) 102 { 103 int res = 0; 104 105 lock_kernel(); 106 /* Call generic open code in order to cache credentials */ 107 if (!res) 108 res = nfs_open(inode, filp); 109 unlock_kernel(); 110 return res; 111 } 112 113 typedef u32 * (*decode_dirent_t)(u32 *, struct nfs_entry *, int); 114 typedef struct { 115 struct file *file; 116 struct page *page; 117 unsigned long page_index; 118 u32 *ptr; 119 u64 target; 120 struct nfs_entry *entry; 121 decode_dirent_t decode; 122 int plus; 123 int error; 124 } nfs_readdir_descriptor_t; 125 126 /* Now we cache directories properly, by stuffing the dirent 127 * data directly in the page cache. 128 * 129 * Inode invalidation due to refresh etc. takes care of 130 * _everything_, no sloppy entry flushing logic, no extraneous 131 * copying, network direct to page cache, the way it was meant 132 * to be. 133 * 134 * NOTE: Dirent information verification is done always by the 135 * page-in of the RPC reply, nowhere else, this simplies 136 * things substantially. 137 */ 138 static 139 int nfs_readdir_filler(nfs_readdir_descriptor_t *desc, struct page *page) 140 { 141 struct file *file = desc->file; 142 struct inode *inode = file->f_dentry->d_inode; 143 struct rpc_cred *cred = nfs_file_cred(file); 144 unsigned long timestamp; 145 int error; 146 147 dfprintk(VFS, "NFS: nfs_readdir_filler() reading cookie %Lu into page %lu.\n", (long long)desc->entry->cookie, page->index); 148 149 again: 150 timestamp = jiffies; 151 error = NFS_PROTO(inode)->readdir(file->f_dentry, cred, desc->entry->cookie, page, 152 NFS_SERVER(inode)->dtsize, desc->plus); 153 if (error < 0) { 154 /* We requested READDIRPLUS, but the server doesn't grok it */ 155 if (error == -ENOTSUPP && desc->plus) { 156 NFS_SERVER(inode)->caps &= ~NFS_CAP_READDIRPLUS; 157 NFS_FLAGS(inode) &= ~NFS_INO_ADVISE_RDPLUS; 158 desc->plus = 0; 159 goto again; 160 } 161 goto error; 162 } 163 SetPageUptodate(page); 164 NFS_FLAGS(inode) |= NFS_INO_INVALID_ATIME; 165 /* Ensure consistent page alignment of the data. 166 * Note: assumes we have exclusive access to this mapping either 167 * throught inode->i_sem or some other mechanism. 168 */ 169 if (page->index == 0) { 170 invalidate_inode_pages(inode->i_mapping); 171 NFS_I(inode)->readdir_timestamp = timestamp; 172 } 173 unlock_page(page); 174 return 0; 175 error: 176 SetPageError(page); 177 unlock_page(page); 178 nfs_zap_caches(inode); 179 desc->error = error; 180 return -EIO; 181 } 182 183 static inline 184 int dir_decode(nfs_readdir_descriptor_t *desc) 185 { 186 u32 *p = desc->ptr; 187 p = desc->decode(p, desc->entry, desc->plus); 188 if (IS_ERR(p)) 189 return PTR_ERR(p); 190 desc->ptr = p; 191 return 0; 192 } 193 194 static inline 195 void dir_page_release(nfs_readdir_descriptor_t *desc) 196 { 197 kunmap(desc->page); 198 page_cache_release(desc->page); 199 desc->page = NULL; 200 desc->ptr = NULL; 201 } 202 203 /* 204 * Given a pointer to a buffer that has already been filled by a call 205 * to readdir, find the next entry. 206 * 207 * If the end of the buffer has been reached, return -EAGAIN, if not, 208 * return the offset within the buffer of the next entry to be 209 * read. 210 */ 211 static inline 212 int find_dirent(nfs_readdir_descriptor_t *desc, struct page *page) 213 { 214 struct nfs_entry *entry = desc->entry; 215 int loop_count = 0, 216 status; 217 218 while((status = dir_decode(desc)) == 0) { 219 dfprintk(VFS, "NFS: found cookie %Lu\n", (long long)entry->cookie); 220 if (entry->prev_cookie == desc->target) 221 break; 222 if (loop_count++ > 200) { 223 loop_count = 0; 224 schedule(); 225 } 226 } 227 dfprintk(VFS, "NFS: find_dirent() returns %d\n", status); 228 return status; 229 } 230 231 /* 232 * Find the given page, and call find_dirent() in order to try to 233 * return the next entry. 234 */ 235 static inline 236 int find_dirent_page(nfs_readdir_descriptor_t *desc) 237 { 238 struct inode *inode = desc->file->f_dentry->d_inode; 239 struct page *page; 240 int status; 241 242 dfprintk(VFS, "NFS: find_dirent_page() searching directory page %ld\n", desc->page_index); 243 244 page = read_cache_page(inode->i_mapping, desc->page_index, 245 (filler_t *)nfs_readdir_filler, desc); 246 if (IS_ERR(page)) { 247 status = PTR_ERR(page); 248 goto out; 249 } 250 if (!PageUptodate(page)) 251 goto read_error; 252 253 /* NOTE: Someone else may have changed the READDIRPLUS flag */ 254 desc->page = page; 255 desc->ptr = kmap(page); /* matching kunmap in nfs_do_filldir */ 256 status = find_dirent(desc, page); 257 if (status < 0) 258 dir_page_release(desc); 259 out: 260 dfprintk(VFS, "NFS: find_dirent_page() returns %d\n", status); 261 return status; 262 read_error: 263 page_cache_release(page); 264 return -EIO; 265 } 266 267 /* 268 * Recurse through the page cache pages, and return a 269 * filled nfs_entry structure of the next directory entry if possible. 270 * 271 * The target for the search is 'desc->target'. 272 */ 273 static inline 274 int readdir_search_pagecache(nfs_readdir_descriptor_t *desc) 275 { 276 int loop_count = 0; 277 int res; 278 279 dfprintk(VFS, "NFS: readdir_search_pagecache() searching for cookie %Lu\n", (long long)desc->target); 280 for (;;) { 281 res = find_dirent_page(desc); 282 if (res != -EAGAIN) 283 break; 284 /* Align to beginning of next page */ 285 desc->page_index ++; 286 if (loop_count++ > 200) { 287 loop_count = 0; 288 schedule(); 289 } 290 } 291 dfprintk(VFS, "NFS: readdir_search_pagecache() returned %d\n", res); 292 return res; 293 } 294 295 static inline unsigned int dt_type(struct inode *inode) 296 { 297 return (inode->i_mode >> 12) & 15; 298 } 299 300 static struct dentry *nfs_readdir_lookup(nfs_readdir_descriptor_t *desc); 301 302 /* 303 * Once we've found the start of the dirent within a page: fill 'er up... 304 */ 305 static 306 int nfs_do_filldir(nfs_readdir_descriptor_t *desc, void *dirent, 307 filldir_t filldir) 308 { 309 struct file *file = desc->file; 310 struct nfs_entry *entry = desc->entry; 311 struct dentry *dentry = NULL; 312 unsigned long fileid; 313 int loop_count = 0, 314 res; 315 316 dfprintk(VFS, "NFS: nfs_do_filldir() filling starting @ cookie %Lu\n", (long long)desc->target); 317 318 for(;;) { 319 unsigned d_type = DT_UNKNOWN; 320 /* Note: entry->prev_cookie contains the cookie for 321 * retrieving the current dirent on the server */ 322 fileid = nfs_fileid_to_ino_t(entry->ino); 323 324 /* Get a dentry if we have one */ 325 if (dentry != NULL) 326 dput(dentry); 327 dentry = nfs_readdir_lookup(desc); 328 329 /* Use readdirplus info */ 330 if (dentry != NULL && dentry->d_inode != NULL) { 331 d_type = dt_type(dentry->d_inode); 332 fileid = dentry->d_inode->i_ino; 333 } 334 335 res = filldir(dirent, entry->name, entry->len, 336 entry->prev_cookie, fileid, d_type); 337 if (res < 0) 338 break; 339 file->f_pos = desc->target = entry->cookie; 340 if (dir_decode(desc) != 0) { 341 desc->page_index ++; 342 break; 343 } 344 if (loop_count++ > 200) { 345 loop_count = 0; 346 schedule(); 347 } 348 } 349 dir_page_release(desc); 350 if (dentry != NULL) 351 dput(dentry); 352 dfprintk(VFS, "NFS: nfs_do_filldir() filling ended @ cookie %Lu; returning = %d\n", (long long)desc->target, res); 353 return res; 354 } 355 356 /* 357 * If we cannot find a cookie in our cache, we suspect that this is 358 * because it points to a deleted file, so we ask the server to return 359 * whatever it thinks is the next entry. We then feed this to filldir. 360 * If all goes well, we should then be able to find our way round the 361 * cache on the next call to readdir_search_pagecache(); 362 * 363 * NOTE: we cannot add the anonymous page to the pagecache because 364 * the data it contains might not be page aligned. Besides, 365 * we should already have a complete representation of the 366 * directory in the page cache by the time we get here. 367 */ 368 static inline 369 int uncached_readdir(nfs_readdir_descriptor_t *desc, void *dirent, 370 filldir_t filldir) 371 { 372 struct file *file = desc->file; 373 struct inode *inode = file->f_dentry->d_inode; 374 struct rpc_cred *cred = nfs_file_cred(file); 375 struct page *page = NULL; 376 int status; 377 378 dfprintk(VFS, "NFS: uncached_readdir() searching for cookie %Lu\n", (long long)desc->target); 379 380 page = alloc_page(GFP_HIGHUSER); 381 if (!page) { 382 status = -ENOMEM; 383 goto out; 384 } 385 desc->error = NFS_PROTO(inode)->readdir(file->f_dentry, cred, desc->target, 386 page, 387 NFS_SERVER(inode)->dtsize, 388 desc->plus); 389 NFS_FLAGS(inode) |= NFS_INO_INVALID_ATIME; 390 desc->page = page; 391 desc->ptr = kmap(page); /* matching kunmap in nfs_do_filldir */ 392 if (desc->error >= 0) { 393 if ((status = dir_decode(desc)) == 0) 394 desc->entry->prev_cookie = desc->target; 395 } else 396 status = -EIO; 397 if (status < 0) 398 goto out_release; 399 400 status = nfs_do_filldir(desc, dirent, filldir); 401 402 /* Reset read descriptor so it searches the page cache from 403 * the start upon the next call to readdir_search_pagecache() */ 404 desc->page_index = 0; 405 desc->entry->cookie = desc->entry->prev_cookie = 0; 406 desc->entry->eof = 0; 407 out: 408 dfprintk(VFS, "NFS: uncached_readdir() returns %d\n", status); 409 return status; 410 out_release: 411 dir_page_release(desc); 412 goto out; 413 } 414 415 /* The file offset position is now represented as a true offset into the 416 * page cache as is the case in most of the other filesystems. 417 */ 418 static int nfs_readdir(struct file *filp, void *dirent, filldir_t filldir) 419 { 420 struct dentry *dentry = filp->f_dentry; 421 struct inode *inode = dentry->d_inode; 422 nfs_readdir_descriptor_t my_desc, 423 *desc = &my_desc; 424 struct nfs_entry my_entry; 425 struct nfs_fh fh; 426 struct nfs_fattr fattr; 427 long res; 428 429 lock_kernel(); 430 431 res = nfs_revalidate_inode(NFS_SERVER(inode), inode); 432 if (res < 0) { 433 unlock_kernel(); 434 return res; 435 } 436 437 /* 438 * filp->f_pos points to the file offset in the page cache. 439 * but if the cache has meanwhile been zapped, we need to 440 * read from the last dirent to revalidate f_pos 441 * itself. 442 */ 443 memset(desc, 0, sizeof(*desc)); 444 445 desc->file = filp; 446 desc->target = filp->f_pos; 447 desc->decode = NFS_PROTO(inode)->decode_dirent; 448 desc->plus = NFS_USE_READDIRPLUS(inode); 449 450 my_entry.cookie = my_entry.prev_cookie = 0; 451 my_entry.eof = 0; 452 my_entry.fh = &fh; 453 my_entry.fattr = &fattr; 454 desc->entry = &my_entry; 455 456 while(!desc->entry->eof) { 457 res = readdir_search_pagecache(desc); 458 if (res == -EBADCOOKIE) { 459 /* This means either end of directory */ 460 if (desc->entry->cookie != desc->target) { 461 /* Or that the server has 'lost' a cookie */ 462 res = uncached_readdir(desc, dirent, filldir); 463 if (res >= 0) 464 continue; 465 } 466 res = 0; 467 break; 468 } 469 if (res == -ETOOSMALL && desc->plus) { 470 NFS_FLAGS(inode) &= ~NFS_INO_ADVISE_RDPLUS; 471 nfs_zap_caches(inode); 472 desc->plus = 0; 473 desc->entry->eof = 0; 474 continue; 475 } 476 if (res < 0) 477 break; 478 479 res = nfs_do_filldir(desc, dirent, filldir); 480 if (res < 0) { 481 res = 0; 482 break; 483 } 484 } 485 unlock_kernel(); 486 if (desc->error < 0) 487 return desc->error; 488 if (res < 0) 489 return res; 490 return 0; 491 } 492 493 /* 494 * All directory operations under NFS are synchronous, so fsync() 495 * is a dummy operation. 496 */ 497 int nfs_fsync_dir(struct file *filp, struct dentry *dentry, int datasync) 498 { 499 return 0; 500 } 501 502 /* 503 * A check for whether or not the parent directory has changed. 504 * In the case it has, we assume that the dentries are untrustworthy 505 * and may need to be looked up again. 506 */ 507 static inline int nfs_check_verifier(struct inode *dir, struct dentry *dentry) 508 { 509 if (IS_ROOT(dentry)) 510 return 1; 511 if ((NFS_FLAGS(dir) & NFS_INO_INVALID_ATTR) != 0 512 || nfs_attribute_timeout(dir)) 513 return 0; 514 return nfs_verify_change_attribute(dir, (unsigned long)dentry->d_fsdata); 515 } 516 517 static inline void nfs_set_verifier(struct dentry * dentry, unsigned long verf) 518 { 519 dentry->d_fsdata = (void *)verf; 520 } 521 522 /* 523 * Whenever an NFS operation succeeds, we know that the dentry 524 * is valid, so we update the revalidation timestamp. 525 */ 526 static inline void nfs_renew_times(struct dentry * dentry) 527 { 528 dentry->d_time = jiffies; 529 } 530 531 /* 532 * Return the intent data that applies to this particular path component 533 * 534 * Note that the current set of intents only apply to the very last 535 * component of the path. 536 * We check for this using LOOKUP_CONTINUE and LOOKUP_PARENT. 537 */ 538 static inline unsigned int nfs_lookup_check_intent(struct nameidata *nd, unsigned int mask) 539 { 540 if (nd->flags & (LOOKUP_CONTINUE|LOOKUP_PARENT)) 541 return 0; 542 return nd->flags & mask; 543 } 544 545 /* 546 * Inode and filehandle revalidation for lookups. 547 * 548 * We force revalidation in the cases where the VFS sets LOOKUP_REVAL, 549 * or if the intent information indicates that we're about to open this 550 * particular file and the "nocto" mount flag is not set. 551 * 552 */ 553 static inline 554 int nfs_lookup_verify_inode(struct inode *inode, struct nameidata *nd) 555 { 556 struct nfs_server *server = NFS_SERVER(inode); 557 558 if (nd != NULL) { 559 /* VFS wants an on-the-wire revalidation */ 560 if (nd->flags & LOOKUP_REVAL) 561 goto out_force; 562 /* This is an open(2) */ 563 if (nfs_lookup_check_intent(nd, LOOKUP_OPEN) != 0 && 564 !(server->flags & NFS_MOUNT_NOCTO)) 565 goto out_force; 566 } 567 return nfs_revalidate_inode(server, inode); 568 out_force: 569 return __nfs_revalidate_inode(server, inode); 570 } 571 572 /* 573 * We judge how long we want to trust negative 574 * dentries by looking at the parent inode mtime. 575 * 576 * If parent mtime has changed, we revalidate, else we wait for a 577 * period corresponding to the parent's attribute cache timeout value. 578 */ 579 static inline 580 int nfs_neg_need_reval(struct inode *dir, struct dentry *dentry, 581 struct nameidata *nd) 582 { 583 /* Don't revalidate a negative dentry if we're creating a new file */ 584 if (nd != NULL && nfs_lookup_check_intent(nd, LOOKUP_CREATE) != 0) 585 return 0; 586 return !nfs_check_verifier(dir, dentry); 587 } 588 589 /* 590 * This is called every time the dcache has a lookup hit, 591 * and we should check whether we can really trust that 592 * lookup. 593 * 594 * NOTE! The hit can be a negative hit too, don't assume 595 * we have an inode! 596 * 597 * If the parent directory is seen to have changed, we throw out the 598 * cached dentry and do a new lookup. 599 */ 600 static int nfs_lookup_revalidate(struct dentry * dentry, struct nameidata *nd) 601 { 602 struct inode *dir; 603 struct inode *inode; 604 struct dentry *parent; 605 int error; 606 struct nfs_fh fhandle; 607 struct nfs_fattr fattr; 608 unsigned long verifier; 609 610 parent = dget_parent(dentry); 611 lock_kernel(); 612 dir = parent->d_inode; 613 inode = dentry->d_inode; 614 615 if (!inode) { 616 if (nfs_neg_need_reval(dir, dentry, nd)) 617 goto out_bad; 618 goto out_valid; 619 } 620 621 if (is_bad_inode(inode)) { 622 dfprintk(VFS, "nfs_lookup_validate: %s/%s has dud inode\n", 623 dentry->d_parent->d_name.name, dentry->d_name.name); 624 goto out_bad; 625 } 626 627 /* Revalidate parent directory attribute cache */ 628 if (nfs_revalidate_inode(NFS_SERVER(dir), dir) < 0) 629 goto out_zap_parent; 630 631 /* Force a full look up iff the parent directory has changed */ 632 if (nfs_check_verifier(dir, dentry)) { 633 if (nfs_lookup_verify_inode(inode, nd)) 634 goto out_zap_parent; 635 goto out_valid; 636 } 637 638 if (NFS_STALE(inode)) 639 goto out_bad; 640 641 verifier = nfs_save_change_attribute(dir); 642 error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, &fhandle, &fattr); 643 if (error) 644 goto out_bad; 645 if (nfs_compare_fh(NFS_FH(inode), &fhandle)) 646 goto out_bad; 647 if ((error = nfs_refresh_inode(inode, &fattr)) != 0) 648 goto out_bad; 649 650 nfs_renew_times(dentry); 651 nfs_set_verifier(dentry, verifier); 652 out_valid: 653 unlock_kernel(); 654 dput(parent); 655 return 1; 656 out_zap_parent: 657 nfs_zap_caches(dir); 658 out_bad: 659 NFS_CACHEINV(dir); 660 if (inode && S_ISDIR(inode->i_mode)) { 661 /* Purge readdir caches. */ 662 nfs_zap_caches(inode); 663 /* If we have submounts, don't unhash ! */ 664 if (have_submounts(dentry)) 665 goto out_valid; 666 shrink_dcache_parent(dentry); 667 } 668 d_drop(dentry); 669 unlock_kernel(); 670 dput(parent); 671 return 0; 672 } 673 674 /* 675 * This is called from dput() when d_count is going to 0. 676 */ 677 static int nfs_dentry_delete(struct dentry *dentry) 678 { 679 dfprintk(VFS, "NFS: dentry_delete(%s/%s, %x)\n", 680 dentry->d_parent->d_name.name, dentry->d_name.name, 681 dentry->d_flags); 682 683 if (dentry->d_flags & DCACHE_NFSFS_RENAMED) { 684 /* Unhash it, so that ->d_iput() would be called */ 685 return 1; 686 } 687 if (!(dentry->d_sb->s_flags & MS_ACTIVE)) { 688 /* Unhash it, so that ancestors of killed async unlink 689 * files will be cleaned up during umount */ 690 return 1; 691 } 692 return 0; 693 694 } 695 696 /* 697 * Called when the dentry loses inode. 698 * We use it to clean up silly-renamed files. 699 */ 700 static void nfs_dentry_iput(struct dentry *dentry, struct inode *inode) 701 { 702 if (dentry->d_flags & DCACHE_NFSFS_RENAMED) { 703 lock_kernel(); 704 inode->i_nlink--; 705 nfs_complete_unlink(dentry); 706 unlock_kernel(); 707 } 708 /* When creating a negative dentry, we want to renew d_time */ 709 nfs_renew_times(dentry); 710 iput(inode); 711 } 712 713 struct dentry_operations nfs_dentry_operations = { 714 .d_revalidate = nfs_lookup_revalidate, 715 .d_delete = nfs_dentry_delete, 716 .d_iput = nfs_dentry_iput, 717 }; 718 719 /* 720 * Use intent information to check whether or not we're going to do 721 * an O_EXCL create using this path component. 722 */ 723 static inline 724 int nfs_is_exclusive_create(struct inode *dir, struct nameidata *nd) 725 { 726 if (NFS_PROTO(dir)->version == 2) 727 return 0; 728 if (nd == NULL || nfs_lookup_check_intent(nd, LOOKUP_CREATE) == 0) 729 return 0; 730 return (nd->intent.open.flags & O_EXCL) != 0; 731 } 732 733 static struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, struct nameidata *nd) 734 { 735 struct dentry *res; 736 struct inode *inode = NULL; 737 int error; 738 struct nfs_fh fhandle; 739 struct nfs_fattr fattr; 740 741 dfprintk(VFS, "NFS: lookup(%s/%s)\n", 742 dentry->d_parent->d_name.name, dentry->d_name.name); 743 744 res = ERR_PTR(-ENAMETOOLONG); 745 if (dentry->d_name.len > NFS_SERVER(dir)->namelen) 746 goto out; 747 748 res = ERR_PTR(-ENOMEM); 749 dentry->d_op = NFS_PROTO(dir)->dentry_ops; 750 751 lock_kernel(); 752 /* Revalidate parent directory attribute cache */ 753 error = nfs_revalidate_inode(NFS_SERVER(dir), dir); 754 if (error < 0) { 755 res = ERR_PTR(error); 756 goto out_unlock; 757 } 758 759 /* If we're doing an exclusive create, optimize away the lookup */ 760 if (nfs_is_exclusive_create(dir, nd)) 761 goto no_entry; 762 763 error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, &fhandle, &fattr); 764 if (error == -ENOENT) 765 goto no_entry; 766 if (error < 0) { 767 res = ERR_PTR(error); 768 goto out_unlock; 769 } 770 res = ERR_PTR(-EACCES); 771 inode = nfs_fhget(dentry->d_sb, &fhandle, &fattr); 772 if (!inode) 773 goto out_unlock; 774 no_entry: 775 res = d_add_unique(dentry, inode); 776 if (res != NULL) 777 dentry = res; 778 nfs_renew_times(dentry); 779 nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); 780 out_unlock: 781 unlock_kernel(); 782 out: 783 return res; 784 } 785 786 #ifdef CONFIG_NFS_V4 787 static int nfs_open_revalidate(struct dentry *, struct nameidata *); 788 789 struct dentry_operations nfs4_dentry_operations = { 790 .d_revalidate = nfs_open_revalidate, 791 .d_delete = nfs_dentry_delete, 792 .d_iput = nfs_dentry_iput, 793 }; 794 795 /* 796 * Use intent information to determine whether we need to substitute 797 * the NFSv4-style stateful OPEN for the LOOKUP call 798 */ 799 static int is_atomic_open(struct inode *dir, struct nameidata *nd) 800 { 801 if (nd == NULL || nfs_lookup_check_intent(nd, LOOKUP_OPEN) == 0) 802 return 0; 803 /* NFS does not (yet) have a stateful open for directories */ 804 if (nd->flags & LOOKUP_DIRECTORY) 805 return 0; 806 /* Are we trying to write to a read only partition? */ 807 if (IS_RDONLY(dir) && (nd->intent.open.flags & (O_CREAT|O_TRUNC|FMODE_WRITE))) 808 return 0; 809 return 1; 810 } 811 812 static struct dentry *nfs_atomic_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) 813 { 814 struct dentry *res = NULL; 815 struct inode *inode = NULL; 816 int error; 817 818 /* Check that we are indeed trying to open this file */ 819 if (!is_atomic_open(dir, nd)) 820 goto no_open; 821 822 if (dentry->d_name.len > NFS_SERVER(dir)->namelen) { 823 res = ERR_PTR(-ENAMETOOLONG); 824 goto out; 825 } 826 dentry->d_op = NFS_PROTO(dir)->dentry_ops; 827 828 /* Let vfs_create() deal with O_EXCL */ 829 if (nd->intent.open.flags & O_EXCL) 830 goto no_entry; 831 832 /* Open the file on the server */ 833 lock_kernel(); 834 /* Revalidate parent directory attribute cache */ 835 error = nfs_revalidate_inode(NFS_SERVER(dir), dir); 836 if (error < 0) { 837 res = ERR_PTR(error); 838 goto out; 839 } 840 841 if (nd->intent.open.flags & O_CREAT) { 842 nfs_begin_data_update(dir); 843 inode = nfs4_atomic_open(dir, dentry, nd); 844 nfs_end_data_update(dir); 845 } else 846 inode = nfs4_atomic_open(dir, dentry, nd); 847 unlock_kernel(); 848 if (IS_ERR(inode)) { 849 error = PTR_ERR(inode); 850 switch (error) { 851 /* Make a negative dentry */ 852 case -ENOENT: 853 inode = NULL; 854 break; 855 /* This turned out not to be a regular file */ 856 case -ELOOP: 857 if (!(nd->intent.open.flags & O_NOFOLLOW)) 858 goto no_open; 859 /* case -EISDIR: */ 860 /* case -EINVAL: */ 861 default: 862 res = ERR_PTR(error); 863 goto out; 864 } 865 } 866 no_entry: 867 res = d_add_unique(dentry, inode); 868 if (res != NULL) 869 dentry = res; 870 nfs_renew_times(dentry); 871 nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); 872 out: 873 return res; 874 no_open: 875 return nfs_lookup(dir, dentry, nd); 876 } 877 878 static int nfs_open_revalidate(struct dentry *dentry, struct nameidata *nd) 879 { 880 struct dentry *parent = NULL; 881 struct inode *inode = dentry->d_inode; 882 struct inode *dir; 883 unsigned long verifier; 884 int openflags, ret = 0; 885 886 parent = dget_parent(dentry); 887 dir = parent->d_inode; 888 if (!is_atomic_open(dir, nd)) 889 goto no_open; 890 /* We can't create new files in nfs_open_revalidate(), so we 891 * optimize away revalidation of negative dentries. 892 */ 893 if (inode == NULL) 894 goto out; 895 /* NFS only supports OPEN on regular files */ 896 if (!S_ISREG(inode->i_mode)) 897 goto no_open; 898 openflags = nd->intent.open.flags; 899 /* We cannot do exclusive creation on a positive dentry */ 900 if ((openflags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL)) 901 goto no_open; 902 /* We can't create new files, or truncate existing ones here */ 903 openflags &= ~(O_CREAT|O_TRUNC); 904 905 /* 906 * Note: we're not holding inode->i_sem and so may be racing with 907 * operations that change the directory. We therefore save the 908 * change attribute *before* we do the RPC call. 909 */ 910 lock_kernel(); 911 verifier = nfs_save_change_attribute(dir); 912 ret = nfs4_open_revalidate(dir, dentry, openflags); 913 if (!ret) 914 nfs_set_verifier(dentry, verifier); 915 unlock_kernel(); 916 out: 917 dput(parent); 918 if (!ret) 919 d_drop(dentry); 920 return ret; 921 no_open: 922 dput(parent); 923 if (inode != NULL && nfs_have_delegation(inode, FMODE_READ)) 924 return 1; 925 return nfs_lookup_revalidate(dentry, nd); 926 } 927 #endif /* CONFIG_NFSV4 */ 928 929 static struct dentry *nfs_readdir_lookup(nfs_readdir_descriptor_t *desc) 930 { 931 struct dentry *parent = desc->file->f_dentry; 932 struct inode *dir = parent->d_inode; 933 struct nfs_entry *entry = desc->entry; 934 struct dentry *dentry, *alias; 935 struct qstr name = { 936 .name = entry->name, 937 .len = entry->len, 938 }; 939 struct inode *inode; 940 941 switch (name.len) { 942 case 2: 943 if (name.name[0] == '.' && name.name[1] == '.') 944 return dget_parent(parent); 945 break; 946 case 1: 947 if (name.name[0] == '.') 948 return dget(parent); 949 } 950 name.hash = full_name_hash(name.name, name.len); 951 dentry = d_lookup(parent, &name); 952 if (dentry != NULL) 953 return dentry; 954 if (!desc->plus || !(entry->fattr->valid & NFS_ATTR_FATTR)) 955 return NULL; 956 /* Note: caller is already holding the dir->i_sem! */ 957 dentry = d_alloc(parent, &name); 958 if (dentry == NULL) 959 return NULL; 960 dentry->d_op = NFS_PROTO(dir)->dentry_ops; 961 inode = nfs_fhget(dentry->d_sb, entry->fh, entry->fattr); 962 if (!inode) { 963 dput(dentry); 964 return NULL; 965 } 966 alias = d_add_unique(dentry, inode); 967 if (alias != NULL) { 968 dput(dentry); 969 dentry = alias; 970 } 971 nfs_renew_times(dentry); 972 nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); 973 return dentry; 974 } 975 976 /* 977 * Code common to create, mkdir, and mknod. 978 */ 979 int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fhandle, 980 struct nfs_fattr *fattr) 981 { 982 struct inode *inode; 983 int error = -EACCES; 984 985 /* We may have been initialized further down */ 986 if (dentry->d_inode) 987 return 0; 988 if (fhandle->size == 0) { 989 struct inode *dir = dentry->d_parent->d_inode; 990 error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, fhandle, fattr); 991 if (error) 992 goto out_err; 993 } 994 if (!(fattr->valid & NFS_ATTR_FATTR)) { 995 struct nfs_server *server = NFS_SB(dentry->d_sb); 996 error = server->rpc_ops->getattr(server, fhandle, fattr); 997 if (error < 0) 998 goto out_err; 999 } 1000 error = -ENOMEM; 1001 inode = nfs_fhget(dentry->d_sb, fhandle, fattr); 1002 if (inode == NULL) 1003 goto out_err; 1004 d_instantiate(dentry, inode); 1005 return 0; 1006 out_err: 1007 d_drop(dentry); 1008 return error; 1009 } 1010 1011 /* 1012 * Following a failed create operation, we drop the dentry rather 1013 * than retain a negative dentry. This avoids a problem in the event 1014 * that the operation succeeded on the server, but an error in the 1015 * reply path made it appear to have failed. 1016 */ 1017 static int nfs_create(struct inode *dir, struct dentry *dentry, int mode, 1018 struct nameidata *nd) 1019 { 1020 struct iattr attr; 1021 int error; 1022 int open_flags = 0; 1023 1024 dfprintk(VFS, "NFS: create(%s/%ld, %s\n", dir->i_sb->s_id, 1025 dir->i_ino, dentry->d_name.name); 1026 1027 attr.ia_mode = mode; 1028 attr.ia_valid = ATTR_MODE; 1029 1030 if (nd && (nd->flags & LOOKUP_CREATE)) 1031 open_flags = nd->intent.open.flags; 1032 1033 lock_kernel(); 1034 nfs_begin_data_update(dir); 1035 error = NFS_PROTO(dir)->create(dir, dentry, &attr, open_flags); 1036 nfs_end_data_update(dir); 1037 if (error != 0) 1038 goto out_err; 1039 nfs_renew_times(dentry); 1040 nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); 1041 unlock_kernel(); 1042 return 0; 1043 out_err: 1044 unlock_kernel(); 1045 d_drop(dentry); 1046 return error; 1047 } 1048 1049 /* 1050 * See comments for nfs_proc_create regarding failed operations. 1051 */ 1052 static int 1053 nfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev) 1054 { 1055 struct iattr attr; 1056 int status; 1057 1058 dfprintk(VFS, "NFS: mknod(%s/%ld, %s\n", dir->i_sb->s_id, 1059 dir->i_ino, dentry->d_name.name); 1060 1061 if (!new_valid_dev(rdev)) 1062 return -EINVAL; 1063 1064 attr.ia_mode = mode; 1065 attr.ia_valid = ATTR_MODE; 1066 1067 lock_kernel(); 1068 nfs_begin_data_update(dir); 1069 status = NFS_PROTO(dir)->mknod(dir, dentry, &attr, rdev); 1070 nfs_end_data_update(dir); 1071 if (status != 0) 1072 goto out_err; 1073 nfs_renew_times(dentry); 1074 nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); 1075 unlock_kernel(); 1076 return 0; 1077 out_err: 1078 unlock_kernel(); 1079 d_drop(dentry); 1080 return status; 1081 } 1082 1083 /* 1084 * See comments for nfs_proc_create regarding failed operations. 1085 */ 1086 static int nfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) 1087 { 1088 struct iattr attr; 1089 int error; 1090 1091 dfprintk(VFS, "NFS: mkdir(%s/%ld, %s\n", dir->i_sb->s_id, 1092 dir->i_ino, dentry->d_name.name); 1093 1094 attr.ia_valid = ATTR_MODE; 1095 attr.ia_mode = mode | S_IFDIR; 1096 1097 lock_kernel(); 1098 nfs_begin_data_update(dir); 1099 error = NFS_PROTO(dir)->mkdir(dir, dentry, &attr); 1100 nfs_end_data_update(dir); 1101 if (error != 0) 1102 goto out_err; 1103 nfs_renew_times(dentry); 1104 nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); 1105 unlock_kernel(); 1106 return 0; 1107 out_err: 1108 d_drop(dentry); 1109 unlock_kernel(); 1110 return error; 1111 } 1112 1113 static int nfs_rmdir(struct inode *dir, struct dentry *dentry) 1114 { 1115 int error; 1116 1117 dfprintk(VFS, "NFS: rmdir(%s/%ld, %s\n", dir->i_sb->s_id, 1118 dir->i_ino, dentry->d_name.name); 1119 1120 lock_kernel(); 1121 nfs_begin_data_update(dir); 1122 error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name); 1123 /* Ensure the VFS deletes this inode */ 1124 if (error == 0 && dentry->d_inode != NULL) 1125 dentry->d_inode->i_nlink = 0; 1126 nfs_end_data_update(dir); 1127 unlock_kernel(); 1128 1129 return error; 1130 } 1131 1132 static int nfs_sillyrename(struct inode *dir, struct dentry *dentry) 1133 { 1134 static unsigned int sillycounter; 1135 const int i_inosize = sizeof(dir->i_ino)*2; 1136 const int countersize = sizeof(sillycounter)*2; 1137 const int slen = sizeof(".nfs") + i_inosize + countersize - 1; 1138 char silly[slen+1]; 1139 struct qstr qsilly; 1140 struct dentry *sdentry; 1141 int error = -EIO; 1142 1143 dfprintk(VFS, "NFS: silly-rename(%s/%s, ct=%d)\n", 1144 dentry->d_parent->d_name.name, dentry->d_name.name, 1145 atomic_read(&dentry->d_count)); 1146 1147 #ifdef NFS_PARANOIA 1148 if (!dentry->d_inode) 1149 printk("NFS: silly-renaming %s/%s, negative dentry??\n", 1150 dentry->d_parent->d_name.name, dentry->d_name.name); 1151 #endif 1152 /* 1153 * We don't allow a dentry to be silly-renamed twice. 1154 */ 1155 error = -EBUSY; 1156 if (dentry->d_flags & DCACHE_NFSFS_RENAMED) 1157 goto out; 1158 1159 sprintf(silly, ".nfs%*.*lx", 1160 i_inosize, i_inosize, dentry->d_inode->i_ino); 1161 1162 sdentry = NULL; 1163 do { 1164 char *suffix = silly + slen - countersize; 1165 1166 dput(sdentry); 1167 sillycounter++; 1168 sprintf(suffix, "%*.*x", countersize, countersize, sillycounter); 1169 1170 dfprintk(VFS, "trying to rename %s to %s\n", 1171 dentry->d_name.name, silly); 1172 1173 sdentry = lookup_one_len(silly, dentry->d_parent, slen); 1174 /* 1175 * N.B. Better to return EBUSY here ... it could be 1176 * dangerous to delete the file while it's in use. 1177 */ 1178 if (IS_ERR(sdentry)) 1179 goto out; 1180 } while(sdentry->d_inode != NULL); /* need negative lookup */ 1181 1182 qsilly.name = silly; 1183 qsilly.len = strlen(silly); 1184 nfs_begin_data_update(dir); 1185 if (dentry->d_inode) { 1186 nfs_begin_data_update(dentry->d_inode); 1187 error = NFS_PROTO(dir)->rename(dir, &dentry->d_name, 1188 dir, &qsilly); 1189 nfs_end_data_update(dentry->d_inode); 1190 } else 1191 error = NFS_PROTO(dir)->rename(dir, &dentry->d_name, 1192 dir, &qsilly); 1193 nfs_end_data_update(dir); 1194 if (!error) { 1195 nfs_renew_times(dentry); 1196 nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); 1197 d_move(dentry, sdentry); 1198 error = nfs_async_unlink(dentry); 1199 /* If we return 0 we don't unlink */ 1200 } 1201 dput(sdentry); 1202 out: 1203 return error; 1204 } 1205 1206 /* 1207 * Remove a file after making sure there are no pending writes, 1208 * and after checking that the file has only one user. 1209 * 1210 * We invalidate the attribute cache and free the inode prior to the operation 1211 * to avoid possible races if the server reuses the inode. 1212 */ 1213 static int nfs_safe_remove(struct dentry *dentry) 1214 { 1215 struct inode *dir = dentry->d_parent->d_inode; 1216 struct inode *inode = dentry->d_inode; 1217 int error = -EBUSY; 1218 1219 dfprintk(VFS, "NFS: safe_remove(%s/%s)\n", 1220 dentry->d_parent->d_name.name, dentry->d_name.name); 1221 1222 /* If the dentry was sillyrenamed, we simply call d_delete() */ 1223 if (dentry->d_flags & DCACHE_NFSFS_RENAMED) { 1224 error = 0; 1225 goto out; 1226 } 1227 1228 nfs_begin_data_update(dir); 1229 if (inode != NULL) { 1230 nfs_begin_data_update(inode); 1231 error = NFS_PROTO(dir)->remove(dir, &dentry->d_name); 1232 /* The VFS may want to delete this inode */ 1233 if (error == 0) 1234 inode->i_nlink--; 1235 nfs_end_data_update(inode); 1236 } else 1237 error = NFS_PROTO(dir)->remove(dir, &dentry->d_name); 1238 nfs_end_data_update(dir); 1239 out: 1240 return error; 1241 } 1242 1243 /* We do silly rename. In case sillyrename() returns -EBUSY, the inode 1244 * belongs to an active ".nfs..." file and we return -EBUSY. 1245 * 1246 * If sillyrename() returns 0, we do nothing, otherwise we unlink. 1247 */ 1248 static int nfs_unlink(struct inode *dir, struct dentry *dentry) 1249 { 1250 int error; 1251 int need_rehash = 0; 1252 1253 dfprintk(VFS, "NFS: unlink(%s/%ld, %s)\n", dir->i_sb->s_id, 1254 dir->i_ino, dentry->d_name.name); 1255 1256 lock_kernel(); 1257 spin_lock(&dcache_lock); 1258 spin_lock(&dentry->d_lock); 1259 if (atomic_read(&dentry->d_count) > 1) { 1260 spin_unlock(&dentry->d_lock); 1261 spin_unlock(&dcache_lock); 1262 error = nfs_sillyrename(dir, dentry); 1263 unlock_kernel(); 1264 return error; 1265 } 1266 if (!d_unhashed(dentry)) { 1267 __d_drop(dentry); 1268 need_rehash = 1; 1269 } 1270 spin_unlock(&dentry->d_lock); 1271 spin_unlock(&dcache_lock); 1272 error = nfs_safe_remove(dentry); 1273 if (!error) { 1274 nfs_renew_times(dentry); 1275 nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); 1276 } else if (need_rehash) 1277 d_rehash(dentry); 1278 unlock_kernel(); 1279 return error; 1280 } 1281 1282 static int 1283 nfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname) 1284 { 1285 struct iattr attr; 1286 struct nfs_fattr sym_attr; 1287 struct nfs_fh sym_fh; 1288 struct qstr qsymname; 1289 int error; 1290 1291 dfprintk(VFS, "NFS: symlink(%s/%ld, %s, %s)\n", dir->i_sb->s_id, 1292 dir->i_ino, dentry->d_name.name, symname); 1293 1294 #ifdef NFS_PARANOIA 1295 if (dentry->d_inode) 1296 printk("nfs_proc_symlink: %s/%s not negative!\n", 1297 dentry->d_parent->d_name.name, dentry->d_name.name); 1298 #endif 1299 /* 1300 * Fill in the sattr for the call. 1301 * Note: SunOS 4.1.2 crashes if the mode isn't initialized! 1302 */ 1303 attr.ia_valid = ATTR_MODE; 1304 attr.ia_mode = S_IFLNK | S_IRWXUGO; 1305 1306 qsymname.name = symname; 1307 qsymname.len = strlen(symname); 1308 1309 lock_kernel(); 1310 nfs_begin_data_update(dir); 1311 error = NFS_PROTO(dir)->symlink(dir, &dentry->d_name, &qsymname, 1312 &attr, &sym_fh, &sym_attr); 1313 nfs_end_data_update(dir); 1314 if (!error) { 1315 error = nfs_instantiate(dentry, &sym_fh, &sym_attr); 1316 } else { 1317 if (error == -EEXIST) 1318 printk("nfs_proc_symlink: %s/%s already exists??\n", 1319 dentry->d_parent->d_name.name, dentry->d_name.name); 1320 d_drop(dentry); 1321 } 1322 unlock_kernel(); 1323 return error; 1324 } 1325 1326 static int 1327 nfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) 1328 { 1329 struct inode *inode = old_dentry->d_inode; 1330 int error; 1331 1332 dfprintk(VFS, "NFS: link(%s/%s -> %s/%s)\n", 1333 old_dentry->d_parent->d_name.name, old_dentry->d_name.name, 1334 dentry->d_parent->d_name.name, dentry->d_name.name); 1335 1336 /* 1337 * Drop the dentry in advance to force a new lookup. 1338 * Since nfs_proc_link doesn't return a file handle, 1339 * we can't use the existing dentry. 1340 */ 1341 lock_kernel(); 1342 d_drop(dentry); 1343 1344 nfs_begin_data_update(dir); 1345 nfs_begin_data_update(inode); 1346 error = NFS_PROTO(dir)->link(inode, dir, &dentry->d_name); 1347 nfs_end_data_update(inode); 1348 nfs_end_data_update(dir); 1349 unlock_kernel(); 1350 return error; 1351 } 1352 1353 /* 1354 * RENAME 1355 * FIXME: Some nfsds, like the Linux user space nfsd, may generate a 1356 * different file handle for the same inode after a rename (e.g. when 1357 * moving to a different directory). A fail-safe method to do so would 1358 * be to look up old_dir/old_name, create a link to new_dir/new_name and 1359 * rename the old file using the sillyrename stuff. This way, the original 1360 * file in old_dir will go away when the last process iput()s the inode. 1361 * 1362 * FIXED. 1363 * 1364 * It actually works quite well. One needs to have the possibility for 1365 * at least one ".nfs..." file in each directory the file ever gets 1366 * moved or linked to which happens automagically with the new 1367 * implementation that only depends on the dcache stuff instead of 1368 * using the inode layer 1369 * 1370 * Unfortunately, things are a little more complicated than indicated 1371 * above. For a cross-directory move, we want to make sure we can get 1372 * rid of the old inode after the operation. This means there must be 1373 * no pending writes (if it's a file), and the use count must be 1. 1374 * If these conditions are met, we can drop the dentries before doing 1375 * the rename. 1376 */ 1377 static int nfs_rename(struct inode *old_dir, struct dentry *old_dentry, 1378 struct inode *new_dir, struct dentry *new_dentry) 1379 { 1380 struct inode *old_inode = old_dentry->d_inode; 1381 struct inode *new_inode = new_dentry->d_inode; 1382 struct dentry *dentry = NULL, *rehash = NULL; 1383 int error = -EBUSY; 1384 1385 /* 1386 * To prevent any new references to the target during the rename, 1387 * we unhash the dentry and free the inode in advance. 1388 */ 1389 lock_kernel(); 1390 if (!d_unhashed(new_dentry)) { 1391 d_drop(new_dentry); 1392 rehash = new_dentry; 1393 } 1394 1395 dfprintk(VFS, "NFS: rename(%s/%s -> %s/%s, ct=%d)\n", 1396 old_dentry->d_parent->d_name.name, old_dentry->d_name.name, 1397 new_dentry->d_parent->d_name.name, new_dentry->d_name.name, 1398 atomic_read(&new_dentry->d_count)); 1399 1400 /* 1401 * First check whether the target is busy ... we can't 1402 * safely do _any_ rename if the target is in use. 1403 * 1404 * For files, make a copy of the dentry and then do a 1405 * silly-rename. If the silly-rename succeeds, the 1406 * copied dentry is hashed and becomes the new target. 1407 */ 1408 if (!new_inode) 1409 goto go_ahead; 1410 if (S_ISDIR(new_inode->i_mode)) 1411 goto out; 1412 else if (atomic_read(&new_dentry->d_count) > 2) { 1413 int err; 1414 /* copy the target dentry's name */ 1415 dentry = d_alloc(new_dentry->d_parent, 1416 &new_dentry->d_name); 1417 if (!dentry) 1418 goto out; 1419 1420 /* silly-rename the existing target ... */ 1421 err = nfs_sillyrename(new_dir, new_dentry); 1422 if (!err) { 1423 new_dentry = rehash = dentry; 1424 new_inode = NULL; 1425 /* instantiate the replacement target */ 1426 d_instantiate(new_dentry, NULL); 1427 } else if (atomic_read(&new_dentry->d_count) > 1) { 1428 /* dentry still busy? */ 1429 #ifdef NFS_PARANOIA 1430 printk("nfs_rename: target %s/%s busy, d_count=%d\n", 1431 new_dentry->d_parent->d_name.name, 1432 new_dentry->d_name.name, 1433 atomic_read(&new_dentry->d_count)); 1434 #endif 1435 goto out; 1436 } 1437 } 1438 1439 go_ahead: 1440 /* 1441 * ... prune child dentries and writebacks if needed. 1442 */ 1443 if (atomic_read(&old_dentry->d_count) > 1) { 1444 nfs_wb_all(old_inode); 1445 shrink_dcache_parent(old_dentry); 1446 } 1447 1448 if (new_inode) 1449 d_delete(new_dentry); 1450 1451 nfs_begin_data_update(old_dir); 1452 nfs_begin_data_update(new_dir); 1453 nfs_begin_data_update(old_inode); 1454 error = NFS_PROTO(old_dir)->rename(old_dir, &old_dentry->d_name, 1455 new_dir, &new_dentry->d_name); 1456 nfs_end_data_update(old_inode); 1457 nfs_end_data_update(new_dir); 1458 nfs_end_data_update(old_dir); 1459 out: 1460 if (rehash) 1461 d_rehash(rehash); 1462 if (!error) { 1463 if (!S_ISDIR(old_inode->i_mode)) 1464 d_move(old_dentry, new_dentry); 1465 nfs_renew_times(new_dentry); 1466 nfs_set_verifier(new_dentry, nfs_save_change_attribute(new_dir)); 1467 } 1468 1469 /* new dentry created? */ 1470 if (dentry) 1471 dput(dentry); 1472 unlock_kernel(); 1473 return error; 1474 } 1475 1476 int nfs_access_get_cached(struct inode *inode, struct rpc_cred *cred, struct nfs_access_entry *res) 1477 { 1478 struct nfs_access_entry *cache = &NFS_I(inode)->cache_access; 1479 1480 if (cache->cred != cred 1481 || time_after(jiffies, cache->jiffies + NFS_ATTRTIMEO(inode)) 1482 || (NFS_FLAGS(inode) & NFS_INO_INVALID_ACCESS)) 1483 return -ENOENT; 1484 memcpy(res, cache, sizeof(*res)); 1485 return 0; 1486 } 1487 1488 void nfs_access_add_cache(struct inode *inode, struct nfs_access_entry *set) 1489 { 1490 struct nfs_access_entry *cache = &NFS_I(inode)->cache_access; 1491 1492 if (cache->cred != set->cred) { 1493 if (cache->cred) 1494 put_rpccred(cache->cred); 1495 cache->cred = get_rpccred(set->cred); 1496 } 1497 NFS_FLAGS(inode) &= ~NFS_INO_INVALID_ACCESS; 1498 cache->jiffies = set->jiffies; 1499 cache->mask = set->mask; 1500 } 1501 1502 static int nfs_do_access(struct inode *inode, struct rpc_cred *cred, int mask) 1503 { 1504 struct nfs_access_entry cache; 1505 int status; 1506 1507 status = nfs_access_get_cached(inode, cred, &cache); 1508 if (status == 0) 1509 goto out; 1510 1511 /* Be clever: ask server to check for all possible rights */ 1512 cache.mask = MAY_EXEC | MAY_WRITE | MAY_READ; 1513 cache.cred = cred; 1514 cache.jiffies = jiffies; 1515 status = NFS_PROTO(inode)->access(inode, &cache); 1516 if (status != 0) 1517 return status; 1518 nfs_access_add_cache(inode, &cache); 1519 out: 1520 if ((cache.mask & mask) == mask) 1521 return 0; 1522 return -EACCES; 1523 } 1524 1525 int nfs_permission(struct inode *inode, int mask, struct nameidata *nd) 1526 { 1527 struct rpc_cred *cred; 1528 int res = 0; 1529 1530 if (mask == 0) 1531 goto out; 1532 /* Is this sys_access() ? */ 1533 if (nd != NULL && (nd->flags & LOOKUP_ACCESS)) 1534 goto force_lookup; 1535 1536 switch (inode->i_mode & S_IFMT) { 1537 case S_IFLNK: 1538 goto out; 1539 case S_IFREG: 1540 /* NFSv4 has atomic_open... */ 1541 if (nfs_server_capable(inode, NFS_CAP_ATOMIC_OPEN) 1542 && nd != NULL 1543 && (nd->flags & LOOKUP_OPEN)) 1544 goto out; 1545 break; 1546 case S_IFDIR: 1547 /* 1548 * Optimize away all write operations, since the server 1549 * will check permissions when we perform the op. 1550 */ 1551 if ((mask & MAY_WRITE) && !(mask & MAY_READ)) 1552 goto out; 1553 } 1554 1555 force_lookup: 1556 lock_kernel(); 1557 1558 if (!NFS_PROTO(inode)->access) 1559 goto out_notsup; 1560 1561 cred = rpcauth_lookupcred(NFS_CLIENT(inode)->cl_auth, 0); 1562 if (!IS_ERR(cred)) { 1563 res = nfs_do_access(inode, cred, mask); 1564 put_rpccred(cred); 1565 } else 1566 res = PTR_ERR(cred); 1567 unlock_kernel(); 1568 out: 1569 return res; 1570 out_notsup: 1571 res = nfs_revalidate_inode(NFS_SERVER(inode), inode); 1572 if (res == 0) 1573 res = generic_permission(inode, mask, NULL); 1574 unlock_kernel(); 1575 return res; 1576 } 1577 1578 /* 1579 * Local variables: 1580 * version-control: t 1581 * kept-new-versions: 5 1582 * End: 1583 */ 1584