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 */ 32static 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 */ 40static 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 75int 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 102static 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 */ 121static inline void coda_dir_inc_nlink(struct inode *dir) 122{ 123 if (dir->i_nlink >= 2) 124 inc_nlink(dir); 125} 126 127static 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 */ 134static 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; 161err_out: 162 d_drop(de); 163 return error; 164} 165 166static 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; 195err_out: 196 d_drop(de); 197 return error; 198} 199 200/* try to make de an entry in dir_inodde linked to source_de */ 201static 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 227static 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 */ 258static 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 273static 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 */ 293static 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 322static 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 */ 342static 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 } 411out: 412 kfree(vdir); 413 return 0; 414} 415 416/* file operations for directories */ 417static 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) { 428 struct inode *host_inode = file_inode(host_file); 429 430 mutex_lock(&host_inode->i_mutex); 431 ret = -ENOENT; 432 if (!IS_DEADDIR(host_inode)) { 433 ret = host_file->f_op->iterate(host_file, ctx); 434 file_accessed(host_file); 435 } 436 mutex_unlock(&host_inode->i_mutex); 437 return ret; 438 } 439 /* Venus: we must read Venus dirents from a file */ 440 return coda_venus_readdir(coda_file, ctx); 441} 442 443/* called when a cache lookup succeeds */ 444static int coda_dentry_revalidate(struct dentry *de, unsigned int flags) 445{ 446 struct inode *inode; 447 struct coda_inode_info *cii; 448 449 if (flags & LOOKUP_RCU) 450 return -ECHILD; 451 452 inode = d_inode(de); 453 if (!inode || is_root_inode(inode)) 454 goto out; 455 if (is_bad_inode(inode)) 456 goto bad; 457 458 cii = ITOC(d_inode(de)); 459 if (!(cii->c_flags & (C_PURGE | C_FLUSH))) 460 goto out; 461 462 shrink_dcache_parent(de); 463 464 /* propagate for a flush */ 465 if (cii->c_flags & C_FLUSH) 466 coda_flag_inode_children(inode, C_FLUSH); 467 468 if (d_count(de) > 1) 469 /* pretend it's valid, but don't change the flags */ 470 goto out; 471 472 /* clear the flags. */ 473 spin_lock(&cii->c_lock); 474 cii->c_flags &= ~(C_VATTR | C_PURGE | C_FLUSH); 475 spin_unlock(&cii->c_lock); 476bad: 477 return 0; 478out: 479 return 1; 480} 481 482/* 483 * This is the callback from dput() when d_count is going to 0. 484 * We use this to unhash dentries with bad inodes. 485 */ 486static int coda_dentry_delete(const struct dentry * dentry) 487{ 488 int flags; 489 490 if (d_really_is_negative(dentry)) 491 return 0; 492 493 flags = (ITOC(d_inode(dentry))->c_flags) & C_PURGE; 494 if (is_bad_inode(d_inode(dentry)) || flags) { 495 return 1; 496 } 497 return 0; 498} 499 500 501 502/* 503 * This is called when we want to check if the inode has 504 * changed on the server. Coda makes this easy since the 505 * cache manager Venus issues a downcall to the kernel when this 506 * happens 507 */ 508int coda_revalidate_inode(struct inode *inode) 509{ 510 struct coda_vattr attr; 511 int error; 512 int old_mode; 513 ino_t old_ino; 514 struct coda_inode_info *cii = ITOC(inode); 515 516 if (!cii->c_flags) 517 return 0; 518 519 if (cii->c_flags & (C_VATTR | C_PURGE | C_FLUSH)) { 520 error = venus_getattr(inode->i_sb, &(cii->c_fid), &attr); 521 if (error) 522 return -EIO; 523 524 /* this inode may be lost if: 525 - it's ino changed 526 - type changes must be permitted for repair and 527 missing mount points. 528 */ 529 old_mode = inode->i_mode; 530 old_ino = inode->i_ino; 531 coda_vattr_to_iattr(inode, &attr); 532 533 if ((old_mode & S_IFMT) != (inode->i_mode & S_IFMT)) { 534 pr_warn("inode %ld, fid %s changed type!\n", 535 inode->i_ino, coda_f2s(&(cii->c_fid))); 536 } 537 538 /* the following can happen when a local fid is replaced 539 with a global one, here we lose and declare the inode bad */ 540 if (inode->i_ino != old_ino) 541 return -EIO; 542 543 coda_flag_inode_children(inode, C_FLUSH); 544 545 spin_lock(&cii->c_lock); 546 cii->c_flags &= ~(C_VATTR | C_PURGE | C_FLUSH); 547 spin_unlock(&cii->c_lock); 548 } 549 return 0; 550} 551 552const struct dentry_operations coda_dentry_operations = { 553 .d_revalidate = coda_dentry_revalidate, 554 .d_delete = coda_dentry_delete, 555}; 556 557const struct inode_operations coda_dir_inode_operations = { 558 .create = coda_create, 559 .lookup = coda_lookup, 560 .link = coda_link, 561 .unlink = coda_unlink, 562 .symlink = coda_symlink, 563 .mkdir = coda_mkdir, 564 .rmdir = coda_rmdir, 565 .mknod = CODA_EIO_ERROR, 566 .rename = coda_rename, 567 .permission = coda_permission, 568 .getattr = coda_getattr, 569 .setattr = coda_setattr, 570}; 571 572const struct file_operations coda_dir_operations = { 573 .llseek = generic_file_llseek, 574 .read = generic_read_dir, 575 .iterate = coda_readdir, 576 .open = coda_open, 577 .release = coda_release, 578 .fsync = coda_fsync, 579}; 580