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