1 /* CacheFiles path walking and related routines 2 * 3 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. 4 * Written by David Howells (dhowells@redhat.com) 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public Licence 8 * as published by the Free Software Foundation; either version 9 * 2 of the Licence, or (at your option) any later version. 10 */ 11 12 #include <linux/module.h> 13 #include <linux/sched.h> 14 #include <linux/file.h> 15 #include <linux/fs.h> 16 #include <linux/fsnotify.h> 17 #include <linux/quotaops.h> 18 #include <linux/xattr.h> 19 #include <linux/mount.h> 20 #include <linux/namei.h> 21 #include <linux/security.h> 22 #include "internal.h" 23 24 static int cachefiles_wait_bit(void *flags) 25 { 26 schedule(); 27 return 0; 28 } 29 30 /* 31 * record the fact that an object is now active 32 */ 33 static void cachefiles_mark_object_active(struct cachefiles_cache *cache, 34 struct cachefiles_object *object) 35 { 36 struct cachefiles_object *xobject; 37 struct rb_node **_p, *_parent = NULL; 38 struct dentry *dentry; 39 40 _enter(",%p", object); 41 42 try_again: 43 write_lock(&cache->active_lock); 44 45 if (test_and_set_bit(CACHEFILES_OBJECT_ACTIVE, &object->flags)) 46 BUG(); 47 48 dentry = object->dentry; 49 _p = &cache->active_nodes.rb_node; 50 while (*_p) { 51 _parent = *_p; 52 xobject = rb_entry(_parent, 53 struct cachefiles_object, active_node); 54 55 ASSERT(xobject != object); 56 57 if (xobject->dentry > dentry) 58 _p = &(*_p)->rb_left; 59 else if (xobject->dentry < dentry) 60 _p = &(*_p)->rb_right; 61 else 62 goto wait_for_old_object; 63 } 64 65 rb_link_node(&object->active_node, _parent, _p); 66 rb_insert_color(&object->active_node, &cache->active_nodes); 67 68 write_unlock(&cache->active_lock); 69 _leave(""); 70 return; 71 72 /* an old object from a previous incarnation is hogging the slot - we 73 * need to wait for it to be destroyed */ 74 wait_for_old_object: 75 if (xobject->fscache.state < FSCACHE_OBJECT_DYING) { 76 printk(KERN_ERR "\n"); 77 printk(KERN_ERR "CacheFiles: Error:" 78 " Unexpected object collision\n"); 79 printk(KERN_ERR "xobject: OBJ%x\n", 80 xobject->fscache.debug_id); 81 printk(KERN_ERR "xobjstate=%s\n", 82 fscache_object_states[xobject->fscache.state]); 83 printk(KERN_ERR "xobjflags=%lx\n", xobject->fscache.flags); 84 printk(KERN_ERR "xobjevent=%lx [%lx]\n", 85 xobject->fscache.events, xobject->fscache.event_mask); 86 printk(KERN_ERR "xops=%u inp=%u exc=%u\n", 87 xobject->fscache.n_ops, xobject->fscache.n_in_progress, 88 xobject->fscache.n_exclusive); 89 printk(KERN_ERR "xcookie=%p [pr=%p nd=%p fl=%lx]\n", 90 xobject->fscache.cookie, 91 xobject->fscache.cookie->parent, 92 xobject->fscache.cookie->netfs_data, 93 xobject->fscache.cookie->flags); 94 printk(KERN_ERR "xparent=%p\n", 95 xobject->fscache.parent); 96 printk(KERN_ERR "object: OBJ%x\n", 97 object->fscache.debug_id); 98 printk(KERN_ERR "cookie=%p [pr=%p nd=%p fl=%lx]\n", 99 object->fscache.cookie, 100 object->fscache.cookie->parent, 101 object->fscache.cookie->netfs_data, 102 object->fscache.cookie->flags); 103 printk(KERN_ERR "parent=%p\n", 104 object->fscache.parent); 105 BUG(); 106 } 107 atomic_inc(&xobject->usage); 108 write_unlock(&cache->active_lock); 109 110 _debug(">>> wait"); 111 wait_on_bit(&xobject->flags, CACHEFILES_OBJECT_ACTIVE, 112 cachefiles_wait_bit, TASK_UNINTERRUPTIBLE); 113 _debug("<<< waited"); 114 115 cache->cache.ops->put_object(&xobject->fscache); 116 goto try_again; 117 } 118 119 /* 120 * delete an object representation from the cache 121 * - file backed objects are unlinked 122 * - directory backed objects are stuffed into the graveyard for userspace to 123 * delete 124 * - unlocks the directory mutex 125 */ 126 static int cachefiles_bury_object(struct cachefiles_cache *cache, 127 struct dentry *dir, 128 struct dentry *rep) 129 { 130 struct dentry *grave, *trap; 131 char nbuffer[8 + 8 + 1]; 132 int ret; 133 134 _enter(",'%*.*s','%*.*s'", 135 dir->d_name.len, dir->d_name.len, dir->d_name.name, 136 rep->d_name.len, rep->d_name.len, rep->d_name.name); 137 138 /* non-directories can just be unlinked */ 139 if (!S_ISDIR(rep->d_inode->i_mode)) { 140 _debug("unlink stale object"); 141 ret = vfs_unlink(dir->d_inode, rep); 142 143 mutex_unlock(&dir->d_inode->i_mutex); 144 145 if (ret == -EIO) 146 cachefiles_io_error(cache, "Unlink failed"); 147 148 _leave(" = %d", ret); 149 return ret; 150 } 151 152 /* directories have to be moved to the graveyard */ 153 _debug("move stale object to graveyard"); 154 mutex_unlock(&dir->d_inode->i_mutex); 155 156 try_again: 157 /* first step is to make up a grave dentry in the graveyard */ 158 sprintf(nbuffer, "%08x%08x", 159 (uint32_t) get_seconds(), 160 (uint32_t) atomic_inc_return(&cache->gravecounter)); 161 162 /* do the multiway lock magic */ 163 trap = lock_rename(cache->graveyard, dir); 164 165 /* do some checks before getting the grave dentry */ 166 if (rep->d_parent != dir) { 167 /* the entry was probably culled when we dropped the parent dir 168 * lock */ 169 unlock_rename(cache->graveyard, dir); 170 _leave(" = 0 [culled?]"); 171 return 0; 172 } 173 174 if (!S_ISDIR(cache->graveyard->d_inode->i_mode)) { 175 unlock_rename(cache->graveyard, dir); 176 cachefiles_io_error(cache, "Graveyard no longer a directory"); 177 return -EIO; 178 } 179 180 if (trap == rep) { 181 unlock_rename(cache->graveyard, dir); 182 cachefiles_io_error(cache, "May not make directory loop"); 183 return -EIO; 184 } 185 186 if (d_mountpoint(rep)) { 187 unlock_rename(cache->graveyard, dir); 188 cachefiles_io_error(cache, "Mountpoint in cache"); 189 return -EIO; 190 } 191 192 grave = lookup_one_len(nbuffer, cache->graveyard, strlen(nbuffer)); 193 if (IS_ERR(grave)) { 194 unlock_rename(cache->graveyard, dir); 195 196 if (PTR_ERR(grave) == -ENOMEM) { 197 _leave(" = -ENOMEM"); 198 return -ENOMEM; 199 } 200 201 cachefiles_io_error(cache, "Lookup error %ld", 202 PTR_ERR(grave)); 203 return -EIO; 204 } 205 206 if (grave->d_inode) { 207 unlock_rename(cache->graveyard, dir); 208 dput(grave); 209 grave = NULL; 210 cond_resched(); 211 goto try_again; 212 } 213 214 if (d_mountpoint(grave)) { 215 unlock_rename(cache->graveyard, dir); 216 dput(grave); 217 cachefiles_io_error(cache, "Mountpoint in graveyard"); 218 return -EIO; 219 } 220 221 /* target should not be an ancestor of source */ 222 if (trap == grave) { 223 unlock_rename(cache->graveyard, dir); 224 dput(grave); 225 cachefiles_io_error(cache, "May not make directory loop"); 226 return -EIO; 227 } 228 229 /* attempt the rename */ 230 ret = vfs_rename(dir->d_inode, rep, cache->graveyard->d_inode, grave); 231 if (ret != 0 && ret != -ENOMEM) 232 cachefiles_io_error(cache, "Rename failed with error %d", ret); 233 234 unlock_rename(cache->graveyard, dir); 235 dput(grave); 236 _leave(" = 0"); 237 return 0; 238 } 239 240 /* 241 * delete an object representation from the cache 242 */ 243 int cachefiles_delete_object(struct cachefiles_cache *cache, 244 struct cachefiles_object *object) 245 { 246 struct dentry *dir; 247 int ret; 248 249 _enter(",{%p}", object->dentry); 250 251 ASSERT(object->dentry); 252 ASSERT(object->dentry->d_inode); 253 ASSERT(object->dentry->d_parent); 254 255 dir = dget_parent(object->dentry); 256 257 mutex_lock(&dir->d_inode->i_mutex); 258 ret = cachefiles_bury_object(cache, dir, object->dentry); 259 260 dput(dir); 261 _leave(" = %d", ret); 262 return ret; 263 } 264 265 /* 266 * walk from the parent object to the child object through the backing 267 * filesystem, creating directories as we go 268 */ 269 int cachefiles_walk_to_object(struct cachefiles_object *parent, 270 struct cachefiles_object *object, 271 const char *key, 272 struct cachefiles_xattr *auxdata) 273 { 274 struct cachefiles_cache *cache; 275 struct dentry *dir, *next = NULL; 276 unsigned long start; 277 const char *name; 278 int ret, nlen; 279 280 _enter("{%p},,%s,", parent->dentry, key); 281 282 cache = container_of(parent->fscache.cache, 283 struct cachefiles_cache, cache); 284 285 ASSERT(parent->dentry); 286 ASSERT(parent->dentry->d_inode); 287 288 if (!(S_ISDIR(parent->dentry->d_inode->i_mode))) { 289 // TODO: convert file to dir 290 _leave("looking up in none directory"); 291 return -ENOBUFS; 292 } 293 294 dir = dget(parent->dentry); 295 296 advance: 297 /* attempt to transit the first directory component */ 298 name = key; 299 nlen = strlen(key); 300 301 /* key ends in a double NUL */ 302 key = key + nlen + 1; 303 if (!*key) 304 key = NULL; 305 306 lookup_again: 307 /* search the current directory for the element name */ 308 _debug("lookup '%s'", name); 309 310 mutex_lock(&dir->d_inode->i_mutex); 311 312 start = jiffies; 313 next = lookup_one_len(name, dir, nlen); 314 cachefiles_hist(cachefiles_lookup_histogram, start); 315 if (IS_ERR(next)) 316 goto lookup_error; 317 318 _debug("next -> %p %s", next, next->d_inode ? "positive" : "negative"); 319 320 if (!key) 321 object->new = !next->d_inode; 322 323 /* if this element of the path doesn't exist, then the lookup phase 324 * failed, and we can release any readers in the certain knowledge that 325 * there's nothing for them to actually read */ 326 if (!next->d_inode) 327 fscache_object_lookup_negative(&object->fscache); 328 329 /* we need to create the object if it's negative */ 330 if (key || object->type == FSCACHE_COOKIE_TYPE_INDEX) { 331 /* index objects and intervening tree levels must be subdirs */ 332 if (!next->d_inode) { 333 ret = cachefiles_has_space(cache, 1, 0); 334 if (ret < 0) 335 goto create_error; 336 337 start = jiffies; 338 ret = vfs_mkdir(dir->d_inode, next, 0); 339 cachefiles_hist(cachefiles_mkdir_histogram, start); 340 if (ret < 0) 341 goto create_error; 342 343 ASSERT(next->d_inode); 344 345 _debug("mkdir -> %p{%p{ino=%lu}}", 346 next, next->d_inode, next->d_inode->i_ino); 347 348 } else if (!S_ISDIR(next->d_inode->i_mode)) { 349 kerror("inode %lu is not a directory", 350 next->d_inode->i_ino); 351 ret = -ENOBUFS; 352 goto error; 353 } 354 355 } else { 356 /* non-index objects start out life as files */ 357 if (!next->d_inode) { 358 ret = cachefiles_has_space(cache, 1, 0); 359 if (ret < 0) 360 goto create_error; 361 362 start = jiffies; 363 ret = vfs_create(dir->d_inode, next, S_IFREG, NULL); 364 cachefiles_hist(cachefiles_create_histogram, start); 365 if (ret < 0) 366 goto create_error; 367 368 ASSERT(next->d_inode); 369 370 _debug("create -> %p{%p{ino=%lu}}", 371 next, next->d_inode, next->d_inode->i_ino); 372 373 } else if (!S_ISDIR(next->d_inode->i_mode) && 374 !S_ISREG(next->d_inode->i_mode) 375 ) { 376 kerror("inode %lu is not a file or directory", 377 next->d_inode->i_ino); 378 ret = -ENOBUFS; 379 goto error; 380 } 381 } 382 383 /* process the next component */ 384 if (key) { 385 _debug("advance"); 386 mutex_unlock(&dir->d_inode->i_mutex); 387 dput(dir); 388 dir = next; 389 next = NULL; 390 goto advance; 391 } 392 393 /* we've found the object we were looking for */ 394 object->dentry = next; 395 396 /* if we've found that the terminal object exists, then we need to 397 * check its attributes and delete it if it's out of date */ 398 if (!object->new) { 399 _debug("validate '%*.*s'", 400 next->d_name.len, next->d_name.len, next->d_name.name); 401 402 ret = cachefiles_check_object_xattr(object, auxdata); 403 if (ret == -ESTALE) { 404 /* delete the object (the deleter drops the directory 405 * mutex) */ 406 object->dentry = NULL; 407 408 ret = cachefiles_bury_object(cache, dir, next); 409 dput(next); 410 next = NULL; 411 412 if (ret < 0) 413 goto delete_error; 414 415 _debug("redo lookup"); 416 goto lookup_again; 417 } 418 } 419 420 /* note that we're now using this object */ 421 cachefiles_mark_object_active(cache, object); 422 423 mutex_unlock(&dir->d_inode->i_mutex); 424 dput(dir); 425 dir = NULL; 426 427 _debug("=== OBTAINED_OBJECT ==="); 428 429 if (object->new) { 430 /* attach data to a newly constructed terminal object */ 431 ret = cachefiles_set_object_xattr(object, auxdata); 432 if (ret < 0) 433 goto check_error; 434 } else { 435 /* always update the atime on an object we've just looked up 436 * (this is used to keep track of culling, and atimes are only 437 * updated by read, write and readdir but not lookup or 438 * open) */ 439 touch_atime(cache->mnt, next); 440 } 441 442 /* open a file interface onto a data file */ 443 if (object->type != FSCACHE_COOKIE_TYPE_INDEX) { 444 if (S_ISREG(object->dentry->d_inode->i_mode)) { 445 const struct address_space_operations *aops; 446 447 ret = -EPERM; 448 aops = object->dentry->d_inode->i_mapping->a_ops; 449 if (!aops->bmap) 450 goto check_error; 451 452 object->backer = object->dentry; 453 } else { 454 BUG(); // TODO: open file in data-class subdir 455 } 456 } 457 458 object->new = 0; 459 fscache_obtained_object(&object->fscache); 460 461 _leave(" = 0 [%lu]", object->dentry->d_inode->i_ino); 462 return 0; 463 464 create_error: 465 _debug("create error %d", ret); 466 if (ret == -EIO) 467 cachefiles_io_error(cache, "Create/mkdir failed"); 468 goto error; 469 470 check_error: 471 _debug("check error %d", ret); 472 write_lock(&cache->active_lock); 473 rb_erase(&object->active_node, &cache->active_nodes); 474 clear_bit(CACHEFILES_OBJECT_ACTIVE, &object->flags); 475 wake_up_bit(&object->flags, CACHEFILES_OBJECT_ACTIVE); 476 write_unlock(&cache->active_lock); 477 478 dput(object->dentry); 479 object->dentry = NULL; 480 goto error_out; 481 482 delete_error: 483 _debug("delete error %d", ret); 484 goto error_out2; 485 486 lookup_error: 487 _debug("lookup error %ld", PTR_ERR(next)); 488 ret = PTR_ERR(next); 489 if (ret == -EIO) 490 cachefiles_io_error(cache, "Lookup failed"); 491 next = NULL; 492 error: 493 mutex_unlock(&dir->d_inode->i_mutex); 494 dput(next); 495 error_out2: 496 dput(dir); 497 error_out: 498 if (ret == -ENOSPC) 499 ret = -ENOBUFS; 500 501 _leave(" = error %d", -ret); 502 return ret; 503 } 504 505 /* 506 * get a subdirectory 507 */ 508 struct dentry *cachefiles_get_directory(struct cachefiles_cache *cache, 509 struct dentry *dir, 510 const char *dirname) 511 { 512 struct dentry *subdir; 513 unsigned long start; 514 int ret; 515 516 _enter(",,%s", dirname); 517 518 /* search the current directory for the element name */ 519 mutex_lock(&dir->d_inode->i_mutex); 520 521 start = jiffies; 522 subdir = lookup_one_len(dirname, dir, strlen(dirname)); 523 cachefiles_hist(cachefiles_lookup_histogram, start); 524 if (IS_ERR(subdir)) { 525 if (PTR_ERR(subdir) == -ENOMEM) 526 goto nomem_d_alloc; 527 goto lookup_error; 528 } 529 530 _debug("subdir -> %p %s", 531 subdir, subdir->d_inode ? "positive" : "negative"); 532 533 /* we need to create the subdir if it doesn't exist yet */ 534 if (!subdir->d_inode) { 535 ret = cachefiles_has_space(cache, 1, 0); 536 if (ret < 0) 537 goto mkdir_error; 538 539 _debug("attempt mkdir"); 540 541 ret = vfs_mkdir(dir->d_inode, subdir, 0700); 542 if (ret < 0) 543 goto mkdir_error; 544 545 ASSERT(subdir->d_inode); 546 547 _debug("mkdir -> %p{%p{ino=%lu}}", 548 subdir, 549 subdir->d_inode, 550 subdir->d_inode->i_ino); 551 } 552 553 mutex_unlock(&dir->d_inode->i_mutex); 554 555 /* we need to make sure the subdir is a directory */ 556 ASSERT(subdir->d_inode); 557 558 if (!S_ISDIR(subdir->d_inode->i_mode)) { 559 kerror("%s is not a directory", dirname); 560 ret = -EIO; 561 goto check_error; 562 } 563 564 ret = -EPERM; 565 if (!subdir->d_inode->i_op || 566 !subdir->d_inode->i_op->setxattr || 567 !subdir->d_inode->i_op->getxattr || 568 !subdir->d_inode->i_op->lookup || 569 !subdir->d_inode->i_op->mkdir || 570 !subdir->d_inode->i_op->create || 571 !subdir->d_inode->i_op->rename || 572 !subdir->d_inode->i_op->rmdir || 573 !subdir->d_inode->i_op->unlink) 574 goto check_error; 575 576 _leave(" = [%lu]", subdir->d_inode->i_ino); 577 return subdir; 578 579 check_error: 580 dput(subdir); 581 _leave(" = %d [check]", ret); 582 return ERR_PTR(ret); 583 584 mkdir_error: 585 mutex_unlock(&dir->d_inode->i_mutex); 586 dput(subdir); 587 kerror("mkdir %s failed with error %d", dirname, ret); 588 return ERR_PTR(ret); 589 590 lookup_error: 591 mutex_unlock(&dir->d_inode->i_mutex); 592 ret = PTR_ERR(subdir); 593 kerror("Lookup %s failed with error %d", dirname, ret); 594 return ERR_PTR(ret); 595 596 nomem_d_alloc: 597 mutex_unlock(&dir->d_inode->i_mutex); 598 _leave(" = -ENOMEM"); 599 return ERR_PTR(-ENOMEM); 600 } 601 602 /* 603 * find out if an object is in use or not 604 * - if finds object and it's not in use: 605 * - returns a pointer to the object and a reference on it 606 * - returns with the directory locked 607 */ 608 static struct dentry *cachefiles_check_active(struct cachefiles_cache *cache, 609 struct dentry *dir, 610 char *filename) 611 { 612 struct cachefiles_object *object; 613 struct rb_node *_n; 614 struct dentry *victim; 615 unsigned long start; 616 int ret; 617 618 //_enter(",%*.*s/,%s", 619 // dir->d_name.len, dir->d_name.len, dir->d_name.name, filename); 620 621 /* look up the victim */ 622 mutex_lock_nested(&dir->d_inode->i_mutex, 1); 623 624 start = jiffies; 625 victim = lookup_one_len(filename, dir, strlen(filename)); 626 cachefiles_hist(cachefiles_lookup_histogram, start); 627 if (IS_ERR(victim)) 628 goto lookup_error; 629 630 //_debug("victim -> %p %s", 631 // victim, victim->d_inode ? "positive" : "negative"); 632 633 /* if the object is no longer there then we probably retired the object 634 * at the netfs's request whilst the cull was in progress 635 */ 636 if (!victim->d_inode) { 637 mutex_unlock(&dir->d_inode->i_mutex); 638 dput(victim); 639 _leave(" = -ENOENT [absent]"); 640 return ERR_PTR(-ENOENT); 641 } 642 643 /* check to see if we're using this object */ 644 read_lock(&cache->active_lock); 645 646 _n = cache->active_nodes.rb_node; 647 648 while (_n) { 649 object = rb_entry(_n, struct cachefiles_object, active_node); 650 651 if (object->dentry > victim) 652 _n = _n->rb_left; 653 else if (object->dentry < victim) 654 _n = _n->rb_right; 655 else 656 goto object_in_use; 657 } 658 659 read_unlock(&cache->active_lock); 660 661 //_leave(" = %p", victim); 662 return victim; 663 664 object_in_use: 665 read_unlock(&cache->active_lock); 666 mutex_unlock(&dir->d_inode->i_mutex); 667 dput(victim); 668 //_leave(" = -EBUSY [in use]"); 669 return ERR_PTR(-EBUSY); 670 671 lookup_error: 672 mutex_unlock(&dir->d_inode->i_mutex); 673 ret = PTR_ERR(victim); 674 if (ret == -ENOENT) { 675 /* file or dir now absent - probably retired by netfs */ 676 _leave(" = -ESTALE [absent]"); 677 return ERR_PTR(-ESTALE); 678 } 679 680 if (ret == -EIO) { 681 cachefiles_io_error(cache, "Lookup failed"); 682 } else if (ret != -ENOMEM) { 683 kerror("Internal error: %d", ret); 684 ret = -EIO; 685 } 686 687 _leave(" = %d", ret); 688 return ERR_PTR(ret); 689 } 690 691 /* 692 * cull an object if it's not in use 693 * - called only by cache manager daemon 694 */ 695 int cachefiles_cull(struct cachefiles_cache *cache, struct dentry *dir, 696 char *filename) 697 { 698 struct dentry *victim; 699 int ret; 700 701 _enter(",%*.*s/,%s", 702 dir->d_name.len, dir->d_name.len, dir->d_name.name, filename); 703 704 victim = cachefiles_check_active(cache, dir, filename); 705 if (IS_ERR(victim)) 706 return PTR_ERR(victim); 707 708 _debug("victim -> %p %s", 709 victim, victim->d_inode ? "positive" : "negative"); 710 711 /* okay... the victim is not being used so we can cull it 712 * - start by marking it as stale 713 */ 714 _debug("victim is cullable"); 715 716 ret = cachefiles_remove_object_xattr(cache, victim); 717 if (ret < 0) 718 goto error_unlock; 719 720 /* actually remove the victim (drops the dir mutex) */ 721 _debug("bury"); 722 723 ret = cachefiles_bury_object(cache, dir, victim); 724 if (ret < 0) 725 goto error; 726 727 dput(victim); 728 _leave(" = 0"); 729 return 0; 730 731 error_unlock: 732 mutex_unlock(&dir->d_inode->i_mutex); 733 error: 734 dput(victim); 735 if (ret == -ENOENT) { 736 /* file or dir now absent - probably retired by netfs */ 737 _leave(" = -ESTALE [absent]"); 738 return -ESTALE; 739 } 740 741 if (ret != -ENOMEM) { 742 kerror("Internal error: %d", ret); 743 ret = -EIO; 744 } 745 746 _leave(" = %d", ret); 747 return ret; 748 } 749 750 /* 751 * find out if an object is in use or not 752 * - called only by cache manager daemon 753 * - returns -EBUSY or 0 to indicate whether an object is in use or not 754 */ 755 int cachefiles_check_in_use(struct cachefiles_cache *cache, struct dentry *dir, 756 char *filename) 757 { 758 struct dentry *victim; 759 760 //_enter(",%*.*s/,%s", 761 // dir->d_name.len, dir->d_name.len, dir->d_name.name, filename); 762 763 victim = cachefiles_check_active(cache, dir, filename); 764 if (IS_ERR(victim)) 765 return PTR_ERR(victim); 766 767 mutex_unlock(&dir->d_inode->i_mutex); 768 dput(victim); 769 //_leave(" = 0"); 770 return 0; 771 } 772