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