at v3.8 646 lines 17 kB view raw
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 */ 33static int coda_create(struct inode *dir, struct dentry *new, umode_t mode, bool excl); 34static struct dentry *coda_lookup(struct inode *dir, struct dentry *target, unsigned int flags); 35static int coda_link(struct dentry *old_dentry, struct inode *dir_inode, 36 struct dentry *entry); 37static int coda_unlink(struct inode *dir_inode, struct dentry *entry); 38static int coda_symlink(struct inode *dir_inode, struct dentry *entry, 39 const char *symname); 40static int coda_mkdir(struct inode *dir_inode, struct dentry *entry, umode_t mode); 41static int coda_rmdir(struct inode *dir_inode, struct dentry *entry); 42static 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 */ 46static int coda_readdir(struct file *file, void *buf, filldir_t filldir); 47 48/* dentry ops */ 49static int coda_dentry_revalidate(struct dentry *de, unsigned int flags); 50static int coda_dentry_delete(const struct dentry *); 51 52/* support routines */ 53static int coda_venus_readdir(struct file *coda_file, void *buf, 54 filldir_t filldir); 55 56/* same as fs/bad_inode.c */ 57static int coda_return_EIO(void) 58{ 59 return -EIO; 60} 61#define CODA_EIO_ERROR ((void *) (coda_return_EIO)) 62 63const struct dentry_operations coda_dentry_operations = 64{ 65 .d_revalidate = coda_dentry_revalidate, 66 .d_delete = coda_dentry_delete, 67}; 68 69const 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 85const 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 */ 97static 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 132int 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 159static 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 */ 178static inline void coda_dir_inc_nlink(struct inode *dir) 179{ 180 if (dir->i_nlink >= 2) 181 inc_nlink(dir); 182} 183 184static 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 */ 191static 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; 218err_out: 219 d_drop(de); 220 return error; 221} 222 223static 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; 252err_out: 253 d_drop(de); 254 return error; 255} 256 257/* try to make de an entry in dir_inodde linked to source_de */ 258static 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 284static 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 */ 315static 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 330static 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 */ 350static 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 */ 381static 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 420static 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 */ 440static 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 } 533out: 534 kfree(vdir); 535 return result ? result : ret; 536} 537 538/* called when a cache lookup succeeds */ 539static 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); 571bad: 572 return 0; 573out: 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 */ 581static 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 */ 603int 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}