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_SEC; 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 { 296 const char *old_name = old_dentry->d_name.name; 297 const char *new_name = new_dentry->d_name.name; 298 int old_length = old_dentry->d_name.len; 299 int new_length = new_dentry->d_name.len; 300 int error; 301 302 error = venus_rename(old_dir->i_sb, coda_i2f(old_dir), 303 coda_i2f(new_dir), old_length, new_length, 304 (const char *) old_name, (const char *)new_name); 305 if (!error) { 306 if (d_really_is_positive(new_dentry)) { 307 if (d_is_dir(new_dentry)) { 308 coda_dir_drop_nlink(old_dir); 309 coda_dir_inc_nlink(new_dir); 310 } 311 coda_dir_update_mtime(old_dir); 312 coda_dir_update_mtime(new_dir); 313 coda_flag_inode(d_inode(new_dentry), C_VATTR); 314 } else { 315 coda_flag_inode(old_dir, C_VATTR); 316 coda_flag_inode(new_dir, C_VATTR); 317 } 318 } 319 return error; 320 } 321 322 static inline unsigned int CDT2DT(unsigned char cdt) 323 { 324 unsigned int dt; 325 326 switch(cdt) { 327 case CDT_UNKNOWN: dt = DT_UNKNOWN; break; 328 case CDT_FIFO: dt = DT_FIFO; break; 329 case CDT_CHR: dt = DT_CHR; break; 330 case CDT_DIR: dt = DT_DIR; break; 331 case CDT_BLK: dt = DT_BLK; break; 332 case CDT_REG: dt = DT_REG; break; 333 case CDT_LNK: dt = DT_LNK; break; 334 case CDT_SOCK: dt = DT_SOCK; break; 335 case CDT_WHT: dt = DT_WHT; break; 336 default: dt = DT_UNKNOWN; break; 337 } 338 return dt; 339 } 340 341 /* support routines */ 342 static int coda_venus_readdir(struct file *coda_file, struct dir_context *ctx) 343 { 344 struct coda_file_info *cfi; 345 struct coda_inode_info *cii; 346 struct file *host_file; 347 struct venus_dirent *vdir; 348 unsigned long vdir_size = offsetof(struct venus_dirent, d_name); 349 unsigned int type; 350 struct qstr name; 351 ino_t ino; 352 int ret; 353 354 cfi = CODA_FTOC(coda_file); 355 BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); 356 host_file = cfi->cfi_container; 357 358 cii = ITOC(file_inode(coda_file)); 359 360 vdir = kmalloc(sizeof(*vdir), GFP_KERNEL); 361 if (!vdir) return -ENOMEM; 362 363 if (!dir_emit_dots(coda_file, ctx)) 364 goto out; 365 366 while (1) { 367 /* read entries from the directory file */ 368 ret = kernel_read(host_file, ctx->pos - 2, (char *)vdir, 369 sizeof(*vdir)); 370 if (ret < 0) { 371 pr_err("%s: read dir %s failed %d\n", 372 __func__, coda_f2s(&cii->c_fid), ret); 373 break; 374 } 375 if (ret == 0) break; /* end of directory file reached */ 376 377 /* catch truncated reads */ 378 if (ret < vdir_size || ret < vdir_size + vdir->d_namlen) { 379 pr_err("%s: short read on %s\n", 380 __func__, coda_f2s(&cii->c_fid)); 381 ret = -EBADF; 382 break; 383 } 384 /* validate whether the directory file actually makes sense */ 385 if (vdir->d_reclen < vdir_size + vdir->d_namlen) { 386 pr_err("%s: invalid dir %s\n", 387 __func__, coda_f2s(&cii->c_fid)); 388 ret = -EBADF; 389 break; 390 } 391 392 name.len = vdir->d_namlen; 393 name.name = vdir->d_name; 394 395 /* Make sure we skip '.' and '..', we already got those */ 396 if (name.name[0] == '.' && (name.len == 1 || 397 (name.name[1] == '.' && name.len == 2))) 398 vdir->d_fileno = name.len = 0; 399 400 /* skip null entries */ 401 if (vdir->d_fileno && name.len) { 402 ino = vdir->d_fileno; 403 type = CDT2DT(vdir->d_type); 404 if (!dir_emit(ctx, name.name, name.len, ino, type)) 405 break; 406 } 407 /* we'll always have progress because d_reclen is unsigned and 408 * we've already established it is non-zero. */ 409 ctx->pos += vdir->d_reclen; 410 } 411 out: 412 kfree(vdir); 413 return 0; 414 } 415 416 /* file operations for directories */ 417 static int coda_readdir(struct file *coda_file, struct dir_context *ctx) 418 { 419 struct coda_file_info *cfi; 420 struct file *host_file; 421 int ret; 422 423 cfi = CODA_FTOC(coda_file); 424 BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); 425 host_file = cfi->cfi_container; 426 427 if (host_file->f_op->iterate || host_file->f_op->iterate_shared) { 428 struct inode *host_inode = file_inode(host_file); 429 ret = -ENOENT; 430 if (!IS_DEADDIR(host_inode)) { 431 if (host_file->f_op->iterate_shared) { 432 inode_lock_shared(host_inode); 433 ret = host_file->f_op->iterate_shared(host_file, ctx); 434 file_accessed(host_file); 435 inode_unlock_shared(host_inode); 436 } else { 437 inode_lock(host_inode); 438 ret = host_file->f_op->iterate(host_file, ctx); 439 file_accessed(host_file); 440 inode_unlock(host_inode); 441 } 442 } 443 return ret; 444 } 445 /* Venus: we must read Venus dirents from a file */ 446 return coda_venus_readdir(coda_file, ctx); 447 } 448 449 /* called when a cache lookup succeeds */ 450 static int coda_dentry_revalidate(struct dentry *de, unsigned int flags) 451 { 452 struct inode *inode; 453 struct coda_inode_info *cii; 454 455 if (flags & LOOKUP_RCU) 456 return -ECHILD; 457 458 inode = d_inode(de); 459 if (!inode || is_root_inode(inode)) 460 goto out; 461 if (is_bad_inode(inode)) 462 goto bad; 463 464 cii = ITOC(d_inode(de)); 465 if (!(cii->c_flags & (C_PURGE | C_FLUSH))) 466 goto out; 467 468 shrink_dcache_parent(de); 469 470 /* propagate for a flush */ 471 if (cii->c_flags & C_FLUSH) 472 coda_flag_inode_children(inode, C_FLUSH); 473 474 if (d_count(de) > 1) 475 /* pretend it's valid, but don't change the flags */ 476 goto out; 477 478 /* clear the flags. */ 479 spin_lock(&cii->c_lock); 480 cii->c_flags &= ~(C_VATTR | C_PURGE | C_FLUSH); 481 spin_unlock(&cii->c_lock); 482 bad: 483 return 0; 484 out: 485 return 1; 486 } 487 488 /* 489 * This is the callback from dput() when d_count is going to 0. 490 * We use this to unhash dentries with bad inodes. 491 */ 492 static int coda_dentry_delete(const struct dentry * dentry) 493 { 494 int flags; 495 496 if (d_really_is_negative(dentry)) 497 return 0; 498 499 flags = (ITOC(d_inode(dentry))->c_flags) & C_PURGE; 500 if (is_bad_inode(d_inode(dentry)) || flags) { 501 return 1; 502 } 503 return 0; 504 } 505 506 507 508 /* 509 * This is called when we want to check if the inode has 510 * changed on the server. Coda makes this easy since the 511 * cache manager Venus issues a downcall to the kernel when this 512 * happens 513 */ 514 int coda_revalidate_inode(struct inode *inode) 515 { 516 struct coda_vattr attr; 517 int error; 518 int old_mode; 519 ino_t old_ino; 520 struct coda_inode_info *cii = ITOC(inode); 521 522 if (!cii->c_flags) 523 return 0; 524 525 if (cii->c_flags & (C_VATTR | C_PURGE | C_FLUSH)) { 526 error = venus_getattr(inode->i_sb, &(cii->c_fid), &attr); 527 if (error) 528 return -EIO; 529 530 /* this inode may be lost if: 531 - it's ino changed 532 - type changes must be permitted for repair and 533 missing mount points. 534 */ 535 old_mode = inode->i_mode; 536 old_ino = inode->i_ino; 537 coda_vattr_to_iattr(inode, &attr); 538 539 if ((old_mode & S_IFMT) != (inode->i_mode & S_IFMT)) { 540 pr_warn("inode %ld, fid %s changed type!\n", 541 inode->i_ino, coda_f2s(&(cii->c_fid))); 542 } 543 544 /* the following can happen when a local fid is replaced 545 with a global one, here we lose and declare the inode bad */ 546 if (inode->i_ino != old_ino) 547 return -EIO; 548 549 coda_flag_inode_children(inode, C_FLUSH); 550 551 spin_lock(&cii->c_lock); 552 cii->c_flags &= ~(C_VATTR | C_PURGE | C_FLUSH); 553 spin_unlock(&cii->c_lock); 554 } 555 return 0; 556 } 557 558 const struct dentry_operations coda_dentry_operations = { 559 .d_revalidate = coda_dentry_revalidate, 560 .d_delete = coda_dentry_delete, 561 }; 562 563 const struct inode_operations coda_dir_inode_operations = { 564 .create = coda_create, 565 .lookup = coda_lookup, 566 .link = coda_link, 567 .unlink = coda_unlink, 568 .symlink = coda_symlink, 569 .mkdir = coda_mkdir, 570 .rmdir = coda_rmdir, 571 .mknod = CODA_EIO_ERROR, 572 .rename = coda_rename, 573 .permission = coda_permission, 574 .getattr = coda_getattr, 575 .setattr = coda_setattr, 576 }; 577 578 const struct file_operations coda_dir_operations = { 579 .llseek = generic_file_llseek, 580 .read = generic_read_dir, 581 .iterate = coda_readdir, 582 .open = coda_open, 583 .release = coda_release, 584 .fsync = coda_fsync, 585 }; 586