0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/fs.h>
0009 #include <linux/namei.h>
0010 #include "internal.h"
0011
0012
0013
0014
0015
0016
0017 static bool __cachefiles_mark_inode_in_use(struct cachefiles_object *object,
0018 struct dentry *dentry)
0019 {
0020 struct inode *inode = d_backing_inode(dentry);
0021 bool can_use = false;
0022
0023 if (!(inode->i_flags & S_KERNEL_FILE)) {
0024 inode->i_flags |= S_KERNEL_FILE;
0025 trace_cachefiles_mark_active(object, inode);
0026 can_use = true;
0027 } else {
0028 trace_cachefiles_mark_failed(object, inode);
0029 pr_notice("cachefiles: Inode already in use: %pd (B=%lx)\n",
0030 dentry, inode->i_ino);
0031 }
0032
0033 return can_use;
0034 }
0035
0036 static bool cachefiles_mark_inode_in_use(struct cachefiles_object *object,
0037 struct dentry *dentry)
0038 {
0039 struct inode *inode = d_backing_inode(dentry);
0040 bool can_use;
0041
0042 inode_lock(inode);
0043 can_use = __cachefiles_mark_inode_in_use(object, dentry);
0044 inode_unlock(inode);
0045 return can_use;
0046 }
0047
0048
0049
0050
0051 static void __cachefiles_unmark_inode_in_use(struct cachefiles_object *object,
0052 struct dentry *dentry)
0053 {
0054 struct inode *inode = d_backing_inode(dentry);
0055
0056 inode->i_flags &= ~S_KERNEL_FILE;
0057 trace_cachefiles_mark_inactive(object, inode);
0058 }
0059
0060 static void cachefiles_do_unmark_inode_in_use(struct cachefiles_object *object,
0061 struct dentry *dentry)
0062 {
0063 struct inode *inode = d_backing_inode(dentry);
0064
0065 inode_lock(inode);
0066 __cachefiles_unmark_inode_in_use(object, dentry);
0067 inode_unlock(inode);
0068 }
0069
0070
0071
0072
0073
0074 void cachefiles_unmark_inode_in_use(struct cachefiles_object *object,
0075 struct file *file)
0076 {
0077 struct cachefiles_cache *cache = object->volume->cache;
0078 struct inode *inode = file_inode(file);
0079
0080 if (inode) {
0081 cachefiles_do_unmark_inode_in_use(object, file->f_path.dentry);
0082
0083 if (!test_bit(CACHEFILES_OBJECT_USING_TMPFILE, &object->flags)) {
0084 atomic_long_add(inode->i_blocks, &cache->b_released);
0085 if (atomic_inc_return(&cache->f_released))
0086 cachefiles_state_changed(cache);
0087 }
0088 }
0089 }
0090
0091
0092
0093
0094 struct dentry *cachefiles_get_directory(struct cachefiles_cache *cache,
0095 struct dentry *dir,
0096 const char *dirname,
0097 bool *_is_new)
0098 {
0099 struct dentry *subdir;
0100 struct path path;
0101 int ret;
0102
0103 _enter(",,%s", dirname);
0104
0105
0106 inode_lock_nested(d_inode(dir), I_MUTEX_PARENT);
0107
0108 retry:
0109 ret = cachefiles_inject_read_error();
0110 if (ret == 0)
0111 subdir = lookup_one_len(dirname, dir, strlen(dirname));
0112 else
0113 subdir = ERR_PTR(ret);
0114 trace_cachefiles_lookup(NULL, dir, subdir);
0115 if (IS_ERR(subdir)) {
0116 trace_cachefiles_vfs_error(NULL, d_backing_inode(dir),
0117 PTR_ERR(subdir),
0118 cachefiles_trace_lookup_error);
0119 if (PTR_ERR(subdir) == -ENOMEM)
0120 goto nomem_d_alloc;
0121 goto lookup_error;
0122 }
0123
0124 _debug("subdir -> %pd %s",
0125 subdir, d_backing_inode(subdir) ? "positive" : "negative");
0126
0127
0128 if (d_is_negative(subdir)) {
0129 ret = cachefiles_has_space(cache, 1, 0,
0130 cachefiles_has_space_for_create);
0131 if (ret < 0)
0132 goto mkdir_error;
0133
0134 _debug("attempt mkdir");
0135
0136 path.mnt = cache->mnt;
0137 path.dentry = dir;
0138 ret = security_path_mkdir(&path, subdir, 0700);
0139 if (ret < 0)
0140 goto mkdir_error;
0141 ret = cachefiles_inject_write_error();
0142 if (ret == 0)
0143 ret = vfs_mkdir(&init_user_ns, d_inode(dir), subdir, 0700);
0144 if (ret < 0) {
0145 trace_cachefiles_vfs_error(NULL, d_inode(dir), ret,
0146 cachefiles_trace_mkdir_error);
0147 goto mkdir_error;
0148 }
0149 trace_cachefiles_mkdir(dir, subdir);
0150
0151 if (unlikely(d_unhashed(subdir))) {
0152 cachefiles_put_directory(subdir);
0153 goto retry;
0154 }
0155 ASSERT(d_backing_inode(subdir));
0156
0157 _debug("mkdir -> %pd{ino=%lu}",
0158 subdir, d_backing_inode(subdir)->i_ino);
0159 if (_is_new)
0160 *_is_new = true;
0161 }
0162
0163
0164 inode_lock(d_inode(subdir));
0165 inode_unlock(d_inode(dir));
0166
0167 if (!__cachefiles_mark_inode_in_use(NULL, subdir))
0168 goto mark_error;
0169
0170 inode_unlock(d_inode(subdir));
0171
0172
0173 ASSERT(d_backing_inode(subdir));
0174
0175 if (!d_can_lookup(subdir)) {
0176 pr_err("%s is not a directory\n", dirname);
0177 ret = -EIO;
0178 goto check_error;
0179 }
0180
0181 ret = -EPERM;
0182 if (!(d_backing_inode(subdir)->i_opflags & IOP_XATTR) ||
0183 !d_backing_inode(subdir)->i_op->lookup ||
0184 !d_backing_inode(subdir)->i_op->mkdir ||
0185 !d_backing_inode(subdir)->i_op->rename ||
0186 !d_backing_inode(subdir)->i_op->rmdir ||
0187 !d_backing_inode(subdir)->i_op->unlink)
0188 goto check_error;
0189
0190 _leave(" = [%lu]", d_backing_inode(subdir)->i_ino);
0191 return subdir;
0192
0193 check_error:
0194 cachefiles_put_directory(subdir);
0195 _leave(" = %d [check]", ret);
0196 return ERR_PTR(ret);
0197
0198 mark_error:
0199 inode_unlock(d_inode(subdir));
0200 dput(subdir);
0201 return ERR_PTR(-EBUSY);
0202
0203 mkdir_error:
0204 inode_unlock(d_inode(dir));
0205 dput(subdir);
0206 pr_err("mkdir %s failed with error %d\n", dirname, ret);
0207 return ERR_PTR(ret);
0208
0209 lookup_error:
0210 inode_unlock(d_inode(dir));
0211 ret = PTR_ERR(subdir);
0212 pr_err("Lookup %s failed with error %d\n", dirname, ret);
0213 return ERR_PTR(ret);
0214
0215 nomem_d_alloc:
0216 inode_unlock(d_inode(dir));
0217 _leave(" = -ENOMEM");
0218 return ERR_PTR(-ENOMEM);
0219 }
0220
0221
0222
0223
0224 void cachefiles_put_directory(struct dentry *dir)
0225 {
0226 if (dir) {
0227 inode_lock(dir->d_inode);
0228 __cachefiles_unmark_inode_in_use(NULL, dir);
0229 inode_unlock(dir->d_inode);
0230 dput(dir);
0231 }
0232 }
0233
0234
0235
0236
0237 static int cachefiles_unlink(struct cachefiles_cache *cache,
0238 struct cachefiles_object *object,
0239 struct dentry *dir, struct dentry *dentry,
0240 enum fscache_why_object_killed why)
0241 {
0242 struct path path = {
0243 .mnt = cache->mnt,
0244 .dentry = dir,
0245 };
0246 int ret;
0247
0248 trace_cachefiles_unlink(object, d_inode(dentry)->i_ino, why);
0249 ret = security_path_unlink(&path, dentry);
0250 if (ret < 0) {
0251 cachefiles_io_error(cache, "Unlink security error");
0252 return ret;
0253 }
0254
0255 ret = cachefiles_inject_remove_error();
0256 if (ret == 0) {
0257 ret = vfs_unlink(&init_user_ns, d_backing_inode(dir), dentry, NULL);
0258 if (ret == -EIO)
0259 cachefiles_io_error(cache, "Unlink failed");
0260 }
0261 if (ret != 0)
0262 trace_cachefiles_vfs_error(object, d_backing_inode(dir), ret,
0263 cachefiles_trace_unlink_error);
0264 return ret;
0265 }
0266
0267
0268
0269
0270
0271
0272
0273 int cachefiles_bury_object(struct cachefiles_cache *cache,
0274 struct cachefiles_object *object,
0275 struct dentry *dir,
0276 struct dentry *rep,
0277 enum fscache_why_object_killed why)
0278 {
0279 struct dentry *grave, *trap;
0280 struct path path, path_to_graveyard;
0281 char nbuffer[8 + 8 + 1];
0282 int ret;
0283
0284 _enter(",'%pd','%pd'", dir, rep);
0285
0286 if (rep->d_parent != dir) {
0287 inode_unlock(d_inode(dir));
0288 _leave(" = -ESTALE");
0289 return -ESTALE;
0290 }
0291
0292
0293 if (!d_is_dir(rep)) {
0294 dget(rep);
0295
0296
0297 ret = cachefiles_unlink(cache, object, dir, rep, why);
0298 dput(rep);
0299
0300 inode_unlock(d_inode(dir));
0301 _leave(" = %d", ret);
0302 return ret;
0303 }
0304
0305
0306 _debug("move stale object to graveyard");
0307 inode_unlock(d_inode(dir));
0308
0309 try_again:
0310
0311 sprintf(nbuffer, "%08x%08x",
0312 (uint32_t) ktime_get_real_seconds(),
0313 (uint32_t) atomic_inc_return(&cache->gravecounter));
0314
0315
0316 trap = lock_rename(cache->graveyard, dir);
0317
0318
0319 if (rep->d_parent != dir || IS_DEADDIR(d_inode(rep))) {
0320
0321
0322 unlock_rename(cache->graveyard, dir);
0323 _leave(" = 0 [culled?]");
0324 return 0;
0325 }
0326
0327 if (!d_can_lookup(cache->graveyard)) {
0328 unlock_rename(cache->graveyard, dir);
0329 cachefiles_io_error(cache, "Graveyard no longer a directory");
0330 return -EIO;
0331 }
0332
0333 if (trap == rep) {
0334 unlock_rename(cache->graveyard, dir);
0335 cachefiles_io_error(cache, "May not make directory loop");
0336 return -EIO;
0337 }
0338
0339 if (d_mountpoint(rep)) {
0340 unlock_rename(cache->graveyard, dir);
0341 cachefiles_io_error(cache, "Mountpoint in cache");
0342 return -EIO;
0343 }
0344
0345 grave = lookup_one_len(nbuffer, cache->graveyard, strlen(nbuffer));
0346 if (IS_ERR(grave)) {
0347 unlock_rename(cache->graveyard, dir);
0348 trace_cachefiles_vfs_error(object, d_inode(cache->graveyard),
0349 PTR_ERR(grave),
0350 cachefiles_trace_lookup_error);
0351
0352 if (PTR_ERR(grave) == -ENOMEM) {
0353 _leave(" = -ENOMEM");
0354 return -ENOMEM;
0355 }
0356
0357 cachefiles_io_error(cache, "Lookup error %ld", PTR_ERR(grave));
0358 return -EIO;
0359 }
0360
0361 if (d_is_positive(grave)) {
0362 unlock_rename(cache->graveyard, dir);
0363 dput(grave);
0364 grave = NULL;
0365 cond_resched();
0366 goto try_again;
0367 }
0368
0369 if (d_mountpoint(grave)) {
0370 unlock_rename(cache->graveyard, dir);
0371 dput(grave);
0372 cachefiles_io_error(cache, "Mountpoint in graveyard");
0373 return -EIO;
0374 }
0375
0376
0377 if (trap == grave) {
0378 unlock_rename(cache->graveyard, dir);
0379 dput(grave);
0380 cachefiles_io_error(cache, "May not make directory loop");
0381 return -EIO;
0382 }
0383
0384
0385 path.mnt = cache->mnt;
0386 path.dentry = dir;
0387 path_to_graveyard.mnt = cache->mnt;
0388 path_to_graveyard.dentry = cache->graveyard;
0389 ret = security_path_rename(&path, rep, &path_to_graveyard, grave, 0);
0390 if (ret < 0) {
0391 cachefiles_io_error(cache, "Rename security error %d", ret);
0392 } else {
0393 struct renamedata rd = {
0394 .old_mnt_userns = &init_user_ns,
0395 .old_dir = d_inode(dir),
0396 .old_dentry = rep,
0397 .new_mnt_userns = &init_user_ns,
0398 .new_dir = d_inode(cache->graveyard),
0399 .new_dentry = grave,
0400 };
0401 trace_cachefiles_rename(object, d_inode(rep)->i_ino, why);
0402 ret = cachefiles_inject_read_error();
0403 if (ret == 0)
0404 ret = vfs_rename(&rd);
0405 if (ret != 0)
0406 trace_cachefiles_vfs_error(object, d_inode(dir), ret,
0407 cachefiles_trace_rename_error);
0408 if (ret != 0 && ret != -ENOMEM)
0409 cachefiles_io_error(cache,
0410 "Rename failed with error %d", ret);
0411 }
0412
0413 __cachefiles_unmark_inode_in_use(object, rep);
0414 unlock_rename(cache->graveyard, dir);
0415 dput(grave);
0416 _leave(" = 0");
0417 return 0;
0418 }
0419
0420
0421
0422
0423 int cachefiles_delete_object(struct cachefiles_object *object,
0424 enum fscache_why_object_killed why)
0425 {
0426 struct cachefiles_volume *volume = object->volume;
0427 struct dentry *dentry = object->file->f_path.dentry;
0428 struct dentry *fan = volume->fanout[(u8)object->cookie->key_hash];
0429 int ret;
0430
0431 _enter(",OBJ%x{%pD}", object->debug_id, object->file);
0432
0433
0434 dget(dentry);
0435
0436 inode_lock_nested(d_backing_inode(fan), I_MUTEX_PARENT);
0437 ret = cachefiles_unlink(volume->cache, object, fan, dentry, why);
0438 inode_unlock(d_backing_inode(fan));
0439 dput(dentry);
0440 return ret;
0441 }
0442
0443
0444
0445
0446
0447 struct file *cachefiles_create_tmpfile(struct cachefiles_object *object)
0448 {
0449 struct cachefiles_volume *volume = object->volume;
0450 struct cachefiles_cache *cache = volume->cache;
0451 const struct cred *saved_cred;
0452 struct dentry *fan = volume->fanout[(u8)object->cookie->key_hash];
0453 struct file *file;
0454 struct path path;
0455 uint64_t ni_size;
0456 long ret;
0457
0458
0459 cachefiles_begin_secure(cache, &saved_cred);
0460
0461 path.mnt = cache->mnt;
0462 ret = cachefiles_inject_write_error();
0463 if (ret == 0)
0464 path.dentry = vfs_tmpfile(&init_user_ns, fan, S_IFREG, O_RDWR);
0465 else
0466 path.dentry = ERR_PTR(ret);
0467 if (IS_ERR(path.dentry)) {
0468 trace_cachefiles_vfs_error(object, d_inode(fan), PTR_ERR(path.dentry),
0469 cachefiles_trace_tmpfile_error);
0470 if (PTR_ERR(path.dentry) == -EIO)
0471 cachefiles_io_error_obj(object, "Failed to create tmpfile");
0472 file = ERR_CAST(path.dentry);
0473 goto out;
0474 }
0475
0476 trace_cachefiles_tmpfile(object, d_backing_inode(path.dentry));
0477
0478 if (!cachefiles_mark_inode_in_use(object, path.dentry)) {
0479 file = ERR_PTR(-EBUSY);
0480 goto out_dput;
0481 }
0482
0483 ret = cachefiles_ondemand_init_object(object);
0484 if (ret < 0) {
0485 file = ERR_PTR(ret);
0486 goto out_unuse;
0487 }
0488
0489 ni_size = object->cookie->object_size;
0490 ni_size = round_up(ni_size, CACHEFILES_DIO_BLOCK_SIZE);
0491
0492 if (ni_size > 0) {
0493 trace_cachefiles_trunc(object, d_backing_inode(path.dentry), 0, ni_size,
0494 cachefiles_trunc_expand_tmpfile);
0495 ret = cachefiles_inject_write_error();
0496 if (ret == 0)
0497 ret = vfs_truncate(&path, ni_size);
0498 if (ret < 0) {
0499 trace_cachefiles_vfs_error(
0500 object, d_backing_inode(path.dentry), ret,
0501 cachefiles_trace_trunc_error);
0502 file = ERR_PTR(ret);
0503 goto out_unuse;
0504 }
0505 }
0506
0507 file = open_with_fake_path(&path, O_RDWR | O_LARGEFILE | O_DIRECT,
0508 d_backing_inode(path.dentry), cache->cache_cred);
0509 if (IS_ERR(file)) {
0510 trace_cachefiles_vfs_error(object, d_backing_inode(path.dentry),
0511 PTR_ERR(file),
0512 cachefiles_trace_open_error);
0513 goto out_unuse;
0514 }
0515 if (unlikely(!file->f_op->read_iter) ||
0516 unlikely(!file->f_op->write_iter)) {
0517 fput(file);
0518 pr_notice("Cache does not support read_iter and write_iter\n");
0519 file = ERR_PTR(-EINVAL);
0520 goto out_unuse;
0521 }
0522
0523 goto out_dput;
0524
0525 out_unuse:
0526 cachefiles_do_unmark_inode_in_use(object, path.dentry);
0527 out_dput:
0528 dput(path.dentry);
0529 out:
0530 cachefiles_end_secure(cache, saved_cred);
0531 return file;
0532 }
0533
0534
0535
0536
0537 static bool cachefiles_create_file(struct cachefiles_object *object)
0538 {
0539 struct file *file;
0540 int ret;
0541
0542 ret = cachefiles_has_space(object->volume->cache, 1, 0,
0543 cachefiles_has_space_for_create);
0544 if (ret < 0)
0545 return false;
0546
0547 file = cachefiles_create_tmpfile(object);
0548 if (IS_ERR(file))
0549 return false;
0550
0551 set_bit(FSCACHE_COOKIE_NEEDS_UPDATE, &object->cookie->flags);
0552 set_bit(CACHEFILES_OBJECT_USING_TMPFILE, &object->flags);
0553 _debug("create -> %pD{ino=%lu}", file, file_inode(file)->i_ino);
0554 object->file = file;
0555 return true;
0556 }
0557
0558
0559
0560
0561
0562 static bool cachefiles_open_file(struct cachefiles_object *object,
0563 struct dentry *dentry)
0564 {
0565 struct cachefiles_cache *cache = object->volume->cache;
0566 struct file *file;
0567 struct path path;
0568 int ret;
0569
0570 _enter("%pd", dentry);
0571
0572 if (!cachefiles_mark_inode_in_use(object, dentry))
0573 return false;
0574
0575
0576
0577
0578
0579 path.mnt = cache->mnt;
0580 path.dentry = dentry;
0581 file = open_with_fake_path(&path, O_RDWR | O_LARGEFILE | O_DIRECT,
0582 d_backing_inode(dentry), cache->cache_cred);
0583 if (IS_ERR(file)) {
0584 trace_cachefiles_vfs_error(object, d_backing_inode(dentry),
0585 PTR_ERR(file),
0586 cachefiles_trace_open_error);
0587 goto error;
0588 }
0589
0590 if (unlikely(!file->f_op->read_iter) ||
0591 unlikely(!file->f_op->write_iter)) {
0592 pr_notice("Cache does not support read_iter and write_iter\n");
0593 goto error_fput;
0594 }
0595 _debug("file -> %pd positive", dentry);
0596
0597 ret = cachefiles_ondemand_init_object(object);
0598 if (ret < 0)
0599 goto error_fput;
0600
0601 ret = cachefiles_check_auxdata(object, file);
0602 if (ret < 0)
0603 goto check_failed;
0604
0605 object->file = file;
0606
0607
0608
0609
0610
0611 touch_atime(&file->f_path);
0612 dput(dentry);
0613 return true;
0614
0615 check_failed:
0616 fscache_cookie_lookup_negative(object->cookie);
0617 cachefiles_unmark_inode_in_use(object, file);
0618 fput(file);
0619 dput(dentry);
0620 if (ret == -ESTALE)
0621 return cachefiles_create_file(object);
0622 return false;
0623
0624 error_fput:
0625 fput(file);
0626 error:
0627 cachefiles_do_unmark_inode_in_use(object, dentry);
0628 dput(dentry);
0629 return false;
0630 }
0631
0632
0633
0634
0635
0636 bool cachefiles_look_up_object(struct cachefiles_object *object)
0637 {
0638 struct cachefiles_volume *volume = object->volume;
0639 struct dentry *dentry, *fan = volume->fanout[(u8)object->cookie->key_hash];
0640 int ret;
0641
0642 _enter("OBJ%x,%s,", object->debug_id, object->d_name);
0643
0644
0645 ret = cachefiles_inject_read_error();
0646 if (ret == 0)
0647 dentry = lookup_positive_unlocked(object->d_name, fan,
0648 object->d_name_len);
0649 else
0650 dentry = ERR_PTR(ret);
0651 trace_cachefiles_lookup(object, fan, dentry);
0652 if (IS_ERR(dentry)) {
0653 if (dentry == ERR_PTR(-ENOENT))
0654 goto new_file;
0655 if (dentry == ERR_PTR(-EIO))
0656 cachefiles_io_error_obj(object, "Lookup failed");
0657 return false;
0658 }
0659
0660 if (!d_is_reg(dentry)) {
0661 pr_err("%pd is not a file\n", dentry);
0662 inode_lock_nested(d_inode(fan), I_MUTEX_PARENT);
0663 ret = cachefiles_bury_object(volume->cache, object, fan, dentry,
0664 FSCACHE_OBJECT_IS_WEIRD);
0665 dput(dentry);
0666 if (ret < 0)
0667 return false;
0668 goto new_file;
0669 }
0670
0671 if (!cachefiles_open_file(object, dentry))
0672 return false;
0673
0674 _leave(" = t [%lu]", file_inode(object->file)->i_ino);
0675 return true;
0676
0677 new_file:
0678 fscache_cookie_lookup_negative(object->cookie);
0679 return cachefiles_create_file(object);
0680 }
0681
0682
0683
0684
0685 bool cachefiles_commit_tmpfile(struct cachefiles_cache *cache,
0686 struct cachefiles_object *object)
0687 {
0688 struct cachefiles_volume *volume = object->volume;
0689 struct dentry *dentry, *fan = volume->fanout[(u8)object->cookie->key_hash];
0690 bool success = false;
0691 int ret;
0692
0693 _enter(",%pD", object->file);
0694
0695 inode_lock_nested(d_inode(fan), I_MUTEX_PARENT);
0696 ret = cachefiles_inject_read_error();
0697 if (ret == 0)
0698 dentry = lookup_one_len(object->d_name, fan, object->d_name_len);
0699 else
0700 dentry = ERR_PTR(ret);
0701 if (IS_ERR(dentry)) {
0702 trace_cachefiles_vfs_error(object, d_inode(fan), PTR_ERR(dentry),
0703 cachefiles_trace_lookup_error);
0704 _debug("lookup fail %ld", PTR_ERR(dentry));
0705 goto out_unlock;
0706 }
0707
0708 if (!d_is_negative(dentry)) {
0709 if (d_backing_inode(dentry) == file_inode(object->file)) {
0710 success = true;
0711 goto out_dput;
0712 }
0713
0714 ret = cachefiles_unlink(volume->cache, object, fan, dentry,
0715 FSCACHE_OBJECT_IS_STALE);
0716 if (ret < 0)
0717 goto out_dput;
0718
0719 dput(dentry);
0720 ret = cachefiles_inject_read_error();
0721 if (ret == 0)
0722 dentry = lookup_one_len(object->d_name, fan, object->d_name_len);
0723 else
0724 dentry = ERR_PTR(ret);
0725 if (IS_ERR(dentry)) {
0726 trace_cachefiles_vfs_error(object, d_inode(fan), PTR_ERR(dentry),
0727 cachefiles_trace_lookup_error);
0728 _debug("lookup fail %ld", PTR_ERR(dentry));
0729 goto out_unlock;
0730 }
0731 }
0732
0733 ret = cachefiles_inject_read_error();
0734 if (ret == 0)
0735 ret = vfs_link(object->file->f_path.dentry, &init_user_ns,
0736 d_inode(fan), dentry, NULL);
0737 if (ret < 0) {
0738 trace_cachefiles_vfs_error(object, d_inode(fan), ret,
0739 cachefiles_trace_link_error);
0740 _debug("link fail %d", ret);
0741 } else {
0742 trace_cachefiles_link(object, file_inode(object->file));
0743 spin_lock(&object->lock);
0744
0745 clear_bit(CACHEFILES_OBJECT_USING_TMPFILE, &object->flags);
0746 spin_unlock(&object->lock);
0747 success = true;
0748 }
0749
0750 out_dput:
0751 dput(dentry);
0752 out_unlock:
0753 inode_unlock(d_inode(fan));
0754 _leave(" = %u", success);
0755 return success;
0756 }
0757
0758
0759
0760
0761
0762 static struct dentry *cachefiles_lookup_for_cull(struct cachefiles_cache *cache,
0763 struct dentry *dir,
0764 char *filename)
0765 {
0766 struct dentry *victim;
0767 int ret = -ENOENT;
0768
0769 inode_lock_nested(d_inode(dir), I_MUTEX_PARENT);
0770
0771 victim = lookup_one_len(filename, dir, strlen(filename));
0772 if (IS_ERR(victim))
0773 goto lookup_error;
0774 if (d_is_negative(victim))
0775 goto lookup_put;
0776 if (d_inode(victim)->i_flags & S_KERNEL_FILE)
0777 goto lookup_busy;
0778 return victim;
0779
0780 lookup_busy:
0781 ret = -EBUSY;
0782 lookup_put:
0783 inode_unlock(d_inode(dir));
0784 dput(victim);
0785 return ERR_PTR(ret);
0786
0787 lookup_error:
0788 inode_unlock(d_inode(dir));
0789 ret = PTR_ERR(victim);
0790 if (ret == -ENOENT)
0791 return ERR_PTR(-ESTALE);
0792
0793 if (ret == -EIO) {
0794 cachefiles_io_error(cache, "Lookup failed");
0795 } else if (ret != -ENOMEM) {
0796 pr_err("Internal error: %d\n", ret);
0797 ret = -EIO;
0798 }
0799
0800 return ERR_PTR(ret);
0801 }
0802
0803
0804
0805
0806
0807 int cachefiles_cull(struct cachefiles_cache *cache, struct dentry *dir,
0808 char *filename)
0809 {
0810 struct dentry *victim;
0811 struct inode *inode;
0812 int ret;
0813
0814 _enter(",%pd/,%s", dir, filename);
0815
0816 victim = cachefiles_lookup_for_cull(cache, dir, filename);
0817 if (IS_ERR(victim))
0818 return PTR_ERR(victim);
0819
0820
0821 inode = d_inode(victim);
0822 inode_lock(inode);
0823 if (inode->i_flags & S_KERNEL_FILE) {
0824 ret = -EBUSY;
0825 } else {
0826
0827 inode->i_flags |= S_KERNEL_FILE;
0828 ret = 0;
0829 }
0830 inode_unlock(inode);
0831 if (ret < 0)
0832 goto error_unlock;
0833
0834 ret = cachefiles_bury_object(cache, NULL, dir, victim,
0835 FSCACHE_OBJECT_WAS_CULLED);
0836 if (ret < 0)
0837 goto error;
0838
0839 fscache_count_culled();
0840 dput(victim);
0841 _leave(" = 0");
0842 return 0;
0843
0844 error_unlock:
0845 inode_unlock(d_inode(dir));
0846 error:
0847 dput(victim);
0848 if (ret == -ENOENT)
0849 return -ESTALE;
0850
0851 if (ret != -ENOMEM) {
0852 pr_err("Internal error: %d\n", ret);
0853 ret = -EIO;
0854 }
0855
0856 _leave(" = %d", ret);
0857 return ret;
0858 }
0859
0860
0861
0862
0863
0864
0865 int cachefiles_check_in_use(struct cachefiles_cache *cache, struct dentry *dir,
0866 char *filename)
0867 {
0868 struct dentry *victim;
0869 int ret = 0;
0870
0871 victim = cachefiles_lookup_for_cull(cache, dir, filename);
0872 if (IS_ERR(victim))
0873 return PTR_ERR(victim);
0874
0875 inode_unlock(d_inode(dir));
0876 dput(victim);
0877 return ret;
0878 }