1 2 /* 3 * Directory operations for Coda filesystem 4 * Original version: (C) 1996 P. Braam and M. Callahan 5 * Rewritten for Linux 2.1. (C) 1997 Carnegie Mellon University 6 * 7 * Carnegie Mellon encourages users to contribute improvements to 8 * the Coda project. Contact Peter Braam (coda@cs.cmu.edu). 9 */ 10 11 #include <linux/types.h> 12 #include <linux/kernel.h> 13 #include <linux/time.h> 14 #include <linux/fs.h> 15 #include <linux/slab.h> 16 #include <linux/file.h> 17 #include <linux/stat.h> 18 #include <linux/errno.h> 19 #include <linux/string.h> 20 #include <linux/smp_lock.h> 21 22 #include <asm/uaccess.h> 23 24 #include <linux/coda.h> 25 #include <linux/coda_linux.h> 26 #include <linux/coda_psdev.h> 27 #include <linux/coda_fs_i.h> 28 #include <linux/coda_cache.h> 29 30 #include "coda_int.h" 31 32 /* dir inode-ops */ 33 static int coda_create(struct inode *dir, struct dentry *new, int mode, struct nameidata *nd); 34 static struct dentry *coda_lookup(struct inode *dir, struct dentry *target, struct nameidata *nd); 35 static int coda_link(struct dentry *old_dentry, struct inode *dir_inode, 36 struct dentry *entry); 37 static int coda_unlink(struct inode *dir_inode, struct dentry *entry); 38 static int coda_symlink(struct inode *dir_inode, struct dentry *entry, 39 const char *symname); 40 static int coda_mkdir(struct inode *dir_inode, struct dentry *entry, int mode); 41 static int coda_rmdir(struct inode *dir_inode, struct dentry *entry); 42 static int coda_rename(struct inode *old_inode, struct dentry *old_dentry, 43 struct inode *new_inode, struct dentry *new_dentry); 44 45 /* dir file-ops */ 46 static int coda_readdir(struct file *file, void *buf, filldir_t filldir); 47 48 /* dentry ops */ 49 static int coda_dentry_revalidate(struct dentry *de, struct nameidata *nd); 50 static int coda_dentry_delete(struct dentry *); 51 52 /* support routines */ 53 static int coda_venus_readdir(struct file *coda_file, void *buf, 54 filldir_t filldir); 55 56 /* same as fs/bad_inode.c */ 57 static int coda_return_EIO(void) 58 { 59 return -EIO; 60 } 61 #define CODA_EIO_ERROR ((void *) (coda_return_EIO)) 62 63 static const struct dentry_operations coda_dentry_operations = 64 { 65 .d_revalidate = coda_dentry_revalidate, 66 .d_delete = coda_dentry_delete, 67 }; 68 69 const struct inode_operations coda_dir_inode_operations = 70 { 71 .create = coda_create, 72 .lookup = coda_lookup, 73 .link = coda_link, 74 .unlink = coda_unlink, 75 .symlink = coda_symlink, 76 .mkdir = coda_mkdir, 77 .rmdir = coda_rmdir, 78 .mknod = CODA_EIO_ERROR, 79 .rename = coda_rename, 80 .permission = coda_permission, 81 .getattr = coda_getattr, 82 .setattr = coda_setattr, 83 }; 84 85 const struct file_operations coda_dir_operations = { 86 .llseek = generic_file_llseek, 87 .read = generic_read_dir, 88 .readdir = coda_readdir, 89 .open = coda_open, 90 .release = coda_release, 91 .fsync = coda_fsync, 92 }; 93 94 95 /* inode operations for directories */ 96 /* access routines: lookup, readlink, permission */ 97 static struct dentry *coda_lookup(struct inode *dir, struct dentry *entry, struct nameidata *nd) 98 { 99 struct inode *inode = NULL; 100 struct CodaFid resfid = { { 0, } }; 101 int type = 0; 102 int error = 0; 103 const char *name = entry->d_name.name; 104 size_t length = entry->d_name.len; 105 106 if (length > CODA_MAXNAMLEN) { 107 printk(KERN_ERR "name too long: lookup, %s (%*s)\n", 108 coda_i2s(dir), (int)length, name); 109 return ERR_PTR(-ENAMETOOLONG); 110 } 111 112 /* control object, create inode on the fly */ 113 if (coda_isroot(dir) && coda_iscontrol(name, length)) { 114 error = coda_cnode_makectl(&inode, dir->i_sb); 115 type = CODA_NOCACHE; 116 goto exit; 117 } 118 119 lock_kernel(); 120 121 error = venus_lookup(dir->i_sb, coda_i2f(dir), name, length, 122 &type, &resfid); 123 if (!error) 124 error = coda_cnode_make(&inode, &resfid, dir->i_sb); 125 126 unlock_kernel(); 127 128 if (error && error != -ENOENT) 129 return ERR_PTR(error); 130 131 exit: 132 entry->d_op = &coda_dentry_operations; 133 134 if (inode && (type & CODA_NOCACHE)) 135 coda_flag_inode(inode, C_VATTR | C_PURGE); 136 137 return d_splice_alias(inode, entry); 138 } 139 140 141 int coda_permission(struct inode *inode, int mask) 142 { 143 int error = 0; 144 145 mask &= MAY_READ | MAY_WRITE | MAY_EXEC; 146 147 if (!mask) 148 return 0; 149 150 if ((mask & MAY_EXEC) && !execute_ok(inode)) 151 return -EACCES; 152 153 lock_kernel(); 154 155 if (coda_cache_check(inode, mask)) 156 goto out; 157 158 error = venus_access(inode->i_sb, coda_i2f(inode), mask); 159 160 if (!error) 161 coda_cache_enter(inode, mask); 162 163 out: 164 unlock_kernel(); 165 return error; 166 } 167 168 169 static inline void coda_dir_update_mtime(struct inode *dir) 170 { 171 #ifdef REQUERY_VENUS_FOR_MTIME 172 /* invalidate the directory cnode's attributes so we refetch the 173 * attributes from venus next time the inode is referenced */ 174 coda_flag_inode(dir, C_VATTR); 175 #else 176 /* optimistically we can also act as if our nose bleeds. The 177 * granularity of the mtime is coarse anyways so we might actually be 178 * right most of the time. Note: we only do this for directories. */ 179 dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC; 180 #endif 181 } 182 183 /* we have to wrap inc_nlink/drop_nlink because sometimes userspace uses a 184 * trick to fool GNU find's optimizations. If we can't be sure of the link 185 * (because of volume mount points) we set i_nlink to 1 which forces find 186 * to consider every child as a possible directory. We should also never 187 * see an increment or decrement for deleted directories where i_nlink == 0 */ 188 static inline void coda_dir_inc_nlink(struct inode *dir) 189 { 190 if (dir->i_nlink >= 2) 191 inc_nlink(dir); 192 } 193 194 static inline void coda_dir_drop_nlink(struct inode *dir) 195 { 196 if (dir->i_nlink > 2) 197 drop_nlink(dir); 198 } 199 200 /* creation routines: create, mknod, mkdir, link, symlink */ 201 static int coda_create(struct inode *dir, struct dentry *de, int mode, struct nameidata *nd) 202 { 203 int error=0; 204 const char *name=de->d_name.name; 205 int length=de->d_name.len; 206 struct inode *inode; 207 struct CodaFid newfid; 208 struct coda_vattr attrs; 209 210 lock_kernel(); 211 212 if (coda_isroot(dir) && coda_iscontrol(name, length)) { 213 unlock_kernel(); 214 return -EPERM; 215 } 216 217 error = venus_create(dir->i_sb, coda_i2f(dir), name, length, 218 0, mode, &newfid, &attrs); 219 220 if ( error ) { 221 unlock_kernel(); 222 d_drop(de); 223 return error; 224 } 225 226 inode = coda_iget(dir->i_sb, &newfid, &attrs); 227 if ( IS_ERR(inode) ) { 228 unlock_kernel(); 229 d_drop(de); 230 return PTR_ERR(inode); 231 } 232 233 /* invalidate the directory cnode's attributes */ 234 coda_dir_update_mtime(dir); 235 unlock_kernel(); 236 d_instantiate(de, inode); 237 return 0; 238 } 239 240 static int coda_mkdir(struct inode *dir, struct dentry *de, int mode) 241 { 242 struct inode *inode; 243 struct coda_vattr attrs; 244 const char *name = de->d_name.name; 245 int len = de->d_name.len; 246 int error; 247 struct CodaFid newfid; 248 249 lock_kernel(); 250 251 if (coda_isroot(dir) && coda_iscontrol(name, len)) { 252 unlock_kernel(); 253 return -EPERM; 254 } 255 256 attrs.va_mode = mode; 257 error = venus_mkdir(dir->i_sb, coda_i2f(dir), 258 name, len, &newfid, &attrs); 259 260 if ( error ) { 261 unlock_kernel(); 262 d_drop(de); 263 return error; 264 } 265 266 inode = coda_iget(dir->i_sb, &newfid, &attrs); 267 if ( IS_ERR(inode) ) { 268 unlock_kernel(); 269 d_drop(de); 270 return PTR_ERR(inode); 271 } 272 273 /* invalidate the directory cnode's attributes */ 274 coda_dir_inc_nlink(dir); 275 coda_dir_update_mtime(dir); 276 unlock_kernel(); 277 d_instantiate(de, inode); 278 return 0; 279 } 280 281 /* try to make de an entry in dir_inodde linked to source_de */ 282 static int coda_link(struct dentry *source_de, struct inode *dir_inode, 283 struct dentry *de) 284 { 285 struct inode *inode = source_de->d_inode; 286 const char * name = de->d_name.name; 287 int len = de->d_name.len; 288 int error; 289 290 lock_kernel(); 291 292 if (coda_isroot(dir_inode) && coda_iscontrol(name, len)) { 293 unlock_kernel(); 294 return -EPERM; 295 } 296 297 error = venus_link(dir_inode->i_sb, coda_i2f(inode), 298 coda_i2f(dir_inode), (const char *)name, len); 299 300 if (error) { 301 d_drop(de); 302 goto out; 303 } 304 305 coda_dir_update_mtime(dir_inode); 306 atomic_inc(&inode->i_count); 307 d_instantiate(de, inode); 308 inc_nlink(inode); 309 310 out: 311 unlock_kernel(); 312 return(error); 313 } 314 315 316 static int coda_symlink(struct inode *dir_inode, struct dentry *de, 317 const char *symname) 318 { 319 const char *name = de->d_name.name; 320 int len = de->d_name.len; 321 int symlen; 322 int error = 0; 323 324 lock_kernel(); 325 326 if (coda_isroot(dir_inode) && coda_iscontrol(name, len)) { 327 unlock_kernel(); 328 return -EPERM; 329 } 330 331 symlen = strlen(symname); 332 if ( symlen > CODA_MAXPATHLEN ) { 333 unlock_kernel(); 334 return -ENAMETOOLONG; 335 } 336 337 /* 338 * This entry is now negative. Since we do not create 339 * an inode for the entry we have to drop it. 340 */ 341 d_drop(de); 342 error = venus_symlink(dir_inode->i_sb, coda_i2f(dir_inode), name, len, 343 symname, symlen); 344 345 /* mtime is no good anymore */ 346 if ( !error ) 347 coda_dir_update_mtime(dir_inode); 348 349 unlock_kernel(); 350 return error; 351 } 352 353 /* destruction routines: unlink, rmdir */ 354 static int coda_unlink(struct inode *dir, struct dentry *de) 355 { 356 int error; 357 const char *name = de->d_name.name; 358 int len = de->d_name.len; 359 360 lock_kernel(); 361 362 error = venus_remove(dir->i_sb, coda_i2f(dir), name, len); 363 if ( error ) { 364 unlock_kernel(); 365 return error; 366 } 367 368 coda_dir_update_mtime(dir); 369 drop_nlink(de->d_inode); 370 unlock_kernel(); 371 return 0; 372 } 373 374 static int coda_rmdir(struct inode *dir, struct dentry *de) 375 { 376 const char *name = de->d_name.name; 377 int len = de->d_name.len; 378 int error; 379 380 lock_kernel(); 381 382 error = venus_rmdir(dir->i_sb, coda_i2f(dir), name, len); 383 if (!error) { 384 /* VFS may delete the child */ 385 if (de->d_inode) 386 de->d_inode->i_nlink = 0; 387 388 /* fix the link count of the parent */ 389 coda_dir_drop_nlink(dir); 390 coda_dir_update_mtime(dir); 391 } 392 unlock_kernel(); 393 return error; 394 } 395 396 /* rename */ 397 static int coda_rename(struct inode *old_dir, struct dentry *old_dentry, 398 struct inode *new_dir, struct dentry *new_dentry) 399 { 400 const char *old_name = old_dentry->d_name.name; 401 const char *new_name = new_dentry->d_name.name; 402 int old_length = old_dentry->d_name.len; 403 int new_length = new_dentry->d_name.len; 404 int error; 405 406 lock_kernel(); 407 408 error = venus_rename(old_dir->i_sb, coda_i2f(old_dir), 409 coda_i2f(new_dir), old_length, new_length, 410 (const char *) old_name, (const char *)new_name); 411 412 if ( !error ) { 413 if ( new_dentry->d_inode ) { 414 if ( S_ISDIR(new_dentry->d_inode->i_mode) ) { 415 coda_dir_drop_nlink(old_dir); 416 coda_dir_inc_nlink(new_dir); 417 } 418 coda_dir_update_mtime(old_dir); 419 coda_dir_update_mtime(new_dir); 420 coda_flag_inode(new_dentry->d_inode, C_VATTR); 421 } else { 422 coda_flag_inode(old_dir, C_VATTR); 423 coda_flag_inode(new_dir, C_VATTR); 424 } 425 } 426 unlock_kernel(); 427 428 return error; 429 } 430 431 432 /* file operations for directories */ 433 static int coda_readdir(struct file *coda_file, void *buf, filldir_t filldir) 434 { 435 struct coda_file_info *cfi; 436 struct file *host_file; 437 int ret; 438 439 cfi = CODA_FTOC(coda_file); 440 BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); 441 host_file = cfi->cfi_container; 442 443 if (!host_file->f_op) 444 return -ENOTDIR; 445 446 if (host_file->f_op->readdir) 447 { 448 /* potemkin case: we were handed a directory inode. 449 * We can't use vfs_readdir because we have to keep the file 450 * position in sync between the coda_file and the host_file. 451 * and as such we need grab the inode mutex. */ 452 struct inode *host_inode = host_file->f_path.dentry->d_inode; 453 454 mutex_lock(&host_inode->i_mutex); 455 host_file->f_pos = coda_file->f_pos; 456 457 ret = -ENOENT; 458 if (!IS_DEADDIR(host_inode)) { 459 ret = host_file->f_op->readdir(host_file, buf, filldir); 460 file_accessed(host_file); 461 } 462 463 coda_file->f_pos = host_file->f_pos; 464 mutex_unlock(&host_inode->i_mutex); 465 } 466 else /* Venus: we must read Venus dirents from a file */ 467 ret = coda_venus_readdir(coda_file, buf, filldir); 468 469 return ret; 470 } 471 472 static inline unsigned int CDT2DT(unsigned char cdt) 473 { 474 unsigned int dt; 475 476 switch(cdt) { 477 case CDT_UNKNOWN: dt = DT_UNKNOWN; break; 478 case CDT_FIFO: dt = DT_FIFO; break; 479 case CDT_CHR: dt = DT_CHR; break; 480 case CDT_DIR: dt = DT_DIR; break; 481 case CDT_BLK: dt = DT_BLK; break; 482 case CDT_REG: dt = DT_REG; break; 483 case CDT_LNK: dt = DT_LNK; break; 484 case CDT_SOCK: dt = DT_SOCK; break; 485 case CDT_WHT: dt = DT_WHT; break; 486 default: dt = DT_UNKNOWN; break; 487 } 488 return dt; 489 } 490 491 /* support routines */ 492 static int coda_venus_readdir(struct file *coda_file, void *buf, 493 filldir_t filldir) 494 { 495 int result = 0; /* # of entries returned */ 496 struct coda_file_info *cfi; 497 struct coda_inode_info *cii; 498 struct file *host_file; 499 struct dentry *de; 500 struct venus_dirent *vdir; 501 unsigned long vdir_size = 502 (unsigned long)(&((struct venus_dirent *)0)->d_name); 503 unsigned int type; 504 struct qstr name; 505 ino_t ino; 506 int ret; 507 508 cfi = CODA_FTOC(coda_file); 509 BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); 510 host_file = cfi->cfi_container; 511 512 de = coda_file->f_path.dentry; 513 cii = ITOC(de->d_inode); 514 515 vdir = kmalloc(sizeof(*vdir), GFP_KERNEL); 516 if (!vdir) return -ENOMEM; 517 518 if (coda_file->f_pos == 0) { 519 ret = filldir(buf, ".", 1, 0, de->d_inode->i_ino, DT_DIR); 520 if (ret < 0) 521 goto out; 522 result++; 523 coda_file->f_pos++; 524 } 525 if (coda_file->f_pos == 1) { 526 ret = filldir(buf, "..", 2, 1, de->d_parent->d_inode->i_ino, DT_DIR); 527 if (ret < 0) 528 goto out; 529 result++; 530 coda_file->f_pos++; 531 } 532 while (1) { 533 /* read entries from the directory file */ 534 ret = kernel_read(host_file, coda_file->f_pos - 2, (char *)vdir, 535 sizeof(*vdir)); 536 if (ret < 0) { 537 printk(KERN_ERR "coda readdir: read dir %s failed %d\n", 538 coda_f2s(&cii->c_fid), ret); 539 break; 540 } 541 if (ret == 0) break; /* end of directory file reached */ 542 543 /* catch truncated reads */ 544 if (ret < vdir_size || ret < vdir_size + vdir->d_namlen) { 545 printk(KERN_ERR "coda readdir: short read on %s\n", 546 coda_f2s(&cii->c_fid)); 547 ret = -EBADF; 548 break; 549 } 550 /* validate whether the directory file actually makes sense */ 551 if (vdir->d_reclen < vdir_size + vdir->d_namlen) { 552 printk(KERN_ERR "coda readdir: invalid dir %s\n", 553 coda_f2s(&cii->c_fid)); 554 ret = -EBADF; 555 break; 556 } 557 558 name.len = vdir->d_namlen; 559 name.name = vdir->d_name; 560 561 /* Make sure we skip '.' and '..', we already got those */ 562 if (name.name[0] == '.' && (name.len == 1 || 563 (vdir->d_name[1] == '.' && name.len == 2))) 564 vdir->d_fileno = name.len = 0; 565 566 /* skip null entries */ 567 if (vdir->d_fileno && name.len) { 568 /* try to look up this entry in the dcache, that way 569 * userspace doesn't have to worry about breaking 570 * getcwd by having mismatched inode numbers for 571 * internal volume mountpoints. */ 572 ino = find_inode_number(de, &name); 573 if (!ino) ino = vdir->d_fileno; 574 575 type = CDT2DT(vdir->d_type); 576 ret = filldir(buf, name.name, name.len, 577 coda_file->f_pos, ino, type); 578 /* failure means no space for filling in this round */ 579 if (ret < 0) break; 580 result++; 581 } 582 /* we'll always have progress because d_reclen is unsigned and 583 * we've already established it is non-zero. */ 584 coda_file->f_pos += vdir->d_reclen; 585 } 586 out: 587 kfree(vdir); 588 return result ? result : ret; 589 } 590 591 /* called when a cache lookup succeeds */ 592 static int coda_dentry_revalidate(struct dentry *de, struct nameidata *nd) 593 { 594 struct inode *inode = de->d_inode; 595 struct coda_inode_info *cii; 596 597 if (!inode) 598 return 1; 599 lock_kernel(); 600 if (coda_isroot(inode)) 601 goto out; 602 if (is_bad_inode(inode)) 603 goto bad; 604 605 cii = ITOC(de->d_inode); 606 if (!(cii->c_flags & (C_PURGE | C_FLUSH))) 607 goto out; 608 609 shrink_dcache_parent(de); 610 611 /* propagate for a flush */ 612 if (cii->c_flags & C_FLUSH) 613 coda_flag_inode_children(inode, C_FLUSH); 614 615 if (atomic_read(&de->d_count) > 1) 616 /* pretend it's valid, but don't change the flags */ 617 goto out; 618 619 /* clear the flags. */ 620 cii->c_flags &= ~(C_VATTR | C_PURGE | C_FLUSH); 621 622 bad: 623 unlock_kernel(); 624 return 0; 625 out: 626 unlock_kernel(); 627 return 1; 628 } 629 630 /* 631 * This is the callback from dput() when d_count is going to 0. 632 * We use this to unhash dentries with bad inodes. 633 */ 634 static int coda_dentry_delete(struct dentry * dentry) 635 { 636 int flags; 637 638 if (!dentry->d_inode) 639 return 0; 640 641 flags = (ITOC(dentry->d_inode)->c_flags) & C_PURGE; 642 if (is_bad_inode(dentry->d_inode) || flags) { 643 return 1; 644 } 645 return 0; 646 } 647 648 649 650 /* 651 * This is called when we want to check if the inode has 652 * changed on the server. Coda makes this easy since the 653 * cache manager Venus issues a downcall to the kernel when this 654 * happens 655 */ 656 int coda_revalidate_inode(struct dentry *dentry) 657 { 658 struct coda_vattr attr; 659 int error = 0; 660 int old_mode; 661 ino_t old_ino; 662 struct inode *inode = dentry->d_inode; 663 struct coda_inode_info *cii = ITOC(inode); 664 665 lock_kernel(); 666 if ( !cii->c_flags ) 667 goto ok; 668 669 if (cii->c_flags & (C_VATTR | C_PURGE | C_FLUSH)) { 670 error = venus_getattr(inode->i_sb, &(cii->c_fid), &attr); 671 if ( error ) 672 goto return_bad; 673 674 /* this inode may be lost if: 675 - it's ino changed 676 - type changes must be permitted for repair and 677 missing mount points. 678 */ 679 old_mode = inode->i_mode; 680 old_ino = inode->i_ino; 681 coda_vattr_to_iattr(inode, &attr); 682 683 if ((old_mode & S_IFMT) != (inode->i_mode & S_IFMT)) { 684 printk("Coda: inode %ld, fid %s changed type!\n", 685 inode->i_ino, coda_f2s(&(cii->c_fid))); 686 } 687 688 /* the following can happen when a local fid is replaced 689 with a global one, here we lose and declare the inode bad */ 690 if (inode->i_ino != old_ino) 691 goto return_bad; 692 693 coda_flag_inode_children(inode, C_FLUSH); 694 cii->c_flags &= ~(C_VATTR | C_PURGE | C_FLUSH); 695 } 696 697 ok: 698 unlock_kernel(); 699 return 0; 700 701 return_bad: 702 unlock_kernel(); 703 return -EIO; 704 } 705