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