Lines Matching +full:fan +full:- +full:hat

1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * Copyright (C) 2021 Red Hat, Inc. All Rights Reserved.
22 if (!(inode->i_flags & S_KERNEL_FILE)) { in __cachefiles_mark_inode_in_use()
23 inode->i_flags |= S_KERNEL_FILE; in __cachefiles_mark_inode_in_use()
50 inode->i_flags &= ~S_KERNEL_FILE; in __cachefiles_unmark_inode_in_use()
69 struct cachefiles_cache *cache = object->volume->cache; in cachefiles_unmark_inode_in_use()
74 if (!test_bit(CACHEFILES_OBJECT_USING_TMPFILE, &object->flags)) { in cachefiles_unmark_inode_in_use()
75 atomic_long_add(inode->i_blocks, &cache->b_released); in cachefiles_unmark_inode_in_use()
76 if (atomic_inc_return(&cache->f_released)) in cachefiles_unmark_inode_in_use()
109 if (PTR_ERR(subdir) == -ENOMEM) in cachefiles_get_directory()
114 _debug("subdir -> %pd %s", in cachefiles_get_directory()
126 path.mnt = cache->mnt; in cachefiles_get_directory()
149 _debug("mkdir -> %pd{ino=%lu}", in cachefiles_get_directory()
150 subdir, d_backing_inode(subdir)->i_ino); in cachefiles_get_directory()
161 subdir, d_inode(subdir)->i_ino); in cachefiles_get_directory()
172 ret = -EIO; in cachefiles_get_directory()
176 ret = -EPERM; in cachefiles_get_directory()
177 if (!(d_backing_inode(subdir)->i_opflags & IOP_XATTR) || in cachefiles_get_directory()
178 !d_backing_inode(subdir)->i_op->lookup || in cachefiles_get_directory()
179 !d_backing_inode(subdir)->i_op->mkdir || in cachefiles_get_directory()
180 !d_backing_inode(subdir)->i_op->rename || in cachefiles_get_directory()
181 !d_backing_inode(subdir)->i_op->rmdir || in cachefiles_get_directory()
182 !d_backing_inode(subdir)->i_op->unlink) in cachefiles_get_directory()
185 _leave(" = [%lu]", d_backing_inode(subdir)->i_ino); in cachefiles_get_directory()
196 return ERR_PTR(-EBUSY); in cachefiles_get_directory()
213 _leave(" = -ENOMEM"); in cachefiles_get_directory()
214 return ERR_PTR(-ENOMEM); in cachefiles_get_directory()
237 .mnt = cache->mnt, in cachefiles_unlink()
242 trace_cachefiles_unlink(object, d_inode(dentry)->i_ino, why); in cachefiles_unlink()
252 if (ret == -EIO) in cachefiles_unlink()
263 * - File backed objects are unlinked
264 * - Directory backed objects are stuffed into the graveyard for userspace to
280 if (rep->d_parent != dir) { in cachefiles_bury_object()
282 _leave(" = -ESTALE"); in cachefiles_bury_object()
283 return -ESTALE; in cachefiles_bury_object()
286 /* non-directories can just be unlinked */ in cachefiles_bury_object()
307 (uint32_t) atomic_inc_return(&cache->gravecounter)); in cachefiles_bury_object()
310 trap = lock_rename(cache->graveyard, dir); in cachefiles_bury_object()
315 if (rep->d_parent != dir || IS_DEADDIR(d_inode(rep))) { in cachefiles_bury_object()
318 unlock_rename(cache->graveyard, dir); in cachefiles_bury_object()
323 if (!d_can_lookup(cache->graveyard)) { in cachefiles_bury_object()
324 unlock_rename(cache->graveyard, dir); in cachefiles_bury_object()
326 return -EIO; in cachefiles_bury_object()
330 unlock_rename(cache->graveyard, dir); in cachefiles_bury_object()
332 return -EIO; in cachefiles_bury_object()
336 unlock_rename(cache->graveyard, dir); in cachefiles_bury_object()
338 return -EIO; in cachefiles_bury_object()
341 grave = lookup_one(&nop_mnt_idmap, &QSTR(nbuffer), cache->graveyard); in cachefiles_bury_object()
343 unlock_rename(cache->graveyard, dir); in cachefiles_bury_object()
344 trace_cachefiles_vfs_error(object, d_inode(cache->graveyard), in cachefiles_bury_object()
348 if (PTR_ERR(grave) == -ENOMEM) { in cachefiles_bury_object()
349 _leave(" = -ENOMEM"); in cachefiles_bury_object()
350 return -ENOMEM; in cachefiles_bury_object()
354 return -EIO; in cachefiles_bury_object()
358 unlock_rename(cache->graveyard, dir); in cachefiles_bury_object()
366 unlock_rename(cache->graveyard, dir); in cachefiles_bury_object()
369 return -EIO; in cachefiles_bury_object()
374 unlock_rename(cache->graveyard, dir); in cachefiles_bury_object()
377 return -EIO; in cachefiles_bury_object()
381 path.mnt = cache->mnt; in cachefiles_bury_object()
383 path_to_graveyard.mnt = cache->mnt; in cachefiles_bury_object()
384 path_to_graveyard.dentry = cache->graveyard; in cachefiles_bury_object()
393 .new_parent = cache->graveyard, in cachefiles_bury_object()
396 trace_cachefiles_rename(object, d_inode(rep)->i_ino, why); in cachefiles_bury_object()
403 if (ret != 0 && ret != -ENOMEM) in cachefiles_bury_object()
409 unlock_rename(cache->graveyard, dir); in cachefiles_bury_object()
421 struct cachefiles_volume *volume = object->volume; in cachefiles_delete_object()
422 struct dentry *dentry = object->file->f_path.dentry; in cachefiles_delete_object()
423 struct dentry *fan = volume->fanout[(u8)object->cookie->key_hash]; in cachefiles_delete_object() local
426 _enter(",OBJ%x{%pD}", object->debug_id, object->file); in cachefiles_delete_object()
431 inode_lock_nested(d_backing_inode(fan), I_MUTEX_PARENT); in cachefiles_delete_object()
432 ret = cachefiles_unlink(volume->cache, object, fan, dentry, why); in cachefiles_delete_object()
433 inode_unlock(d_backing_inode(fan)); in cachefiles_delete_object()
439 * Create a temporary file and leave it unattached and un-xattr'd until the
444 struct cachefiles_volume *volume = object->volume; in cachefiles_create_tmpfile()
445 struct cachefiles_cache *cache = volume->cache; in cachefiles_create_tmpfile()
447 struct dentry *fan = volume->fanout[(u8)object->cookie->key_hash]; in cachefiles_create_tmpfile() local
449 const struct path parentpath = { .mnt = cache->mnt, .dentry = fan }; in cachefiles_create_tmpfile()
461 cache->cache_cred); in cachefiles_create_tmpfile()
465 trace_cachefiles_vfs_error(object, d_inode(fan), ret, in cachefiles_create_tmpfile()
467 if (ret == -EIO) in cachefiles_create_tmpfile()
482 ni_size = object->cookie->object_size; in cachefiles_create_tmpfile()
490 ret = vfs_truncate(&file->f_path, ni_size); in cachefiles_create_tmpfile()
499 ret = -EINVAL; in cachefiles_create_tmpfile()
500 if (unlikely(!file->f_op->read_iter) || in cachefiles_create_tmpfile()
501 unlikely(!file->f_op->write_iter)) { in cachefiles_create_tmpfile()
526 ret = cachefiles_has_space(object->volume->cache, 1, 0, in cachefiles_create_file()
535 set_bit(FSCACHE_COOKIE_NEEDS_UPDATE, &object->cookie->flags); in cachefiles_create_file()
536 set_bit(CACHEFILES_OBJECT_USING_TMPFILE, &object->flags); in cachefiles_create_file()
537 _debug("create -> %pD{ino=%lu}", file, file_inode(file)->i_ino); in cachefiles_create_file()
538 object->file = file; in cachefiles_create_file()
549 struct cachefiles_cache *cache = object->volume->cache; in cachefiles_open_file()
558 dentry, d_inode(dentry)->i_ino); in cachefiles_open_file()
564 * current->fs == NULL - which breaks d_path() called from ext4 open. in cachefiles_open_file()
566 path.mnt = cache->mnt; in cachefiles_open_file()
568 file = kernel_file_open(&path, O_RDWR | O_LARGEFILE | O_DIRECT, cache->cache_cred); in cachefiles_open_file()
576 if (unlikely(!file->f_op->read_iter) || in cachefiles_open_file()
577 unlikely(!file->f_op->write_iter)) { in cachefiles_open_file()
581 _debug("file -> %pd positive", dentry); in cachefiles_open_file()
591 clear_bit(FSCACHE_COOKIE_NO_DATA_TO_READ, &object->cookie->flags); in cachefiles_open_file()
593 object->file = file; in cachefiles_open_file()
599 touch_atime(&file->f_path); in cachefiles_open_file()
603 fscache_cookie_lookup_negative(object->cookie); in cachefiles_open_file()
606 if (ret == -ESTALE) in cachefiles_open_file()
623 struct cachefiles_volume *volume = object->volume; in cachefiles_look_up_object()
624 struct dentry *dentry, *fan = volume->fanout[(u8)object->cookie->key_hash]; in cachefiles_look_up_object() local
627 _enter("OBJ%x,%s,", object->debug_id, object->d_name); in cachefiles_look_up_object()
633 &QSTR(object->d_name), fan); in cachefiles_look_up_object()
636 trace_cachefiles_lookup(object, fan, dentry); in cachefiles_look_up_object()
638 if (dentry == ERR_PTR(-ENOENT)) in cachefiles_look_up_object()
640 if (dentry == ERR_PTR(-EIO)) in cachefiles_look_up_object()
647 inode_lock_nested(d_inode(fan), I_MUTEX_PARENT); in cachefiles_look_up_object()
648 ret = cachefiles_bury_object(volume->cache, object, fan, dentry, in cachefiles_look_up_object()
661 _leave(" = t [%lu]", file_inode(object->file)->i_ino); in cachefiles_look_up_object()
665 fscache_cookie_lookup_negative(object->cookie); in cachefiles_look_up_object()
675 struct cachefiles_volume *volume = object->volume; in cachefiles_commit_tmpfile()
676 struct dentry *dentry, *fan = volume->fanout[(u8)object->cookie->key_hash]; in cachefiles_commit_tmpfile() local
680 _enter(",%pD", object->file); in cachefiles_commit_tmpfile()
682 inode_lock_nested(d_inode(fan), I_MUTEX_PARENT); in cachefiles_commit_tmpfile()
685 dentry = lookup_one(&nop_mnt_idmap, &QSTR(object->d_name), fan); in cachefiles_commit_tmpfile()
689 trace_cachefiles_vfs_error(object, d_inode(fan), PTR_ERR(dentry), in cachefiles_commit_tmpfile()
696 ret = cachefiles_unlink(volume->cache, object, fan, dentry, in cachefiles_commit_tmpfile()
704 dentry = lookup_one(&nop_mnt_idmap, &QSTR(object->d_name), fan); in cachefiles_commit_tmpfile()
708 trace_cachefiles_vfs_error(object, d_inode(fan), PTR_ERR(dentry), in cachefiles_commit_tmpfile()
717 ret = vfs_link(object->file->f_path.dentry, &nop_mnt_idmap, in cachefiles_commit_tmpfile()
718 d_inode(fan), dentry, NULL); in cachefiles_commit_tmpfile()
720 trace_cachefiles_vfs_error(object, d_inode(fan), ret, in cachefiles_commit_tmpfile()
724 trace_cachefiles_link(object, file_inode(object->file)); in cachefiles_commit_tmpfile()
725 spin_lock(&object->lock); in cachefiles_commit_tmpfile()
727 clear_bit(CACHEFILES_OBJECT_USING_TMPFILE, &object->flags); in cachefiles_commit_tmpfile()
728 spin_unlock(&object->lock); in cachefiles_commit_tmpfile()
735 inode_unlock(d_inode(fan)); in cachefiles_commit_tmpfile()
741 * Look up an inode to be checked or culled. Return -EBUSY if the inode is
749 int ret = -ENOENT; in cachefiles_lookup_for_cull()
758 if (d_inode(victim)->i_flags & S_KERNEL_FILE) in cachefiles_lookup_for_cull()
763 ret = -EBUSY; in cachefiles_lookup_for_cull()
772 if (ret == -ENOENT) in cachefiles_lookup_for_cull()
773 return ERR_PTR(-ESTALE); /* Probably got retired by the netfs */ in cachefiles_lookup_for_cull()
775 if (ret == -EIO) { in cachefiles_lookup_for_cull()
777 } else if (ret != -ENOMEM) { in cachefiles_lookup_for_cull()
779 ret = -EIO; in cachefiles_lookup_for_cull()
787 * - called only by cache manager daemon
805 if (inode->i_flags & S_KERNEL_FILE) { in cachefiles_cull()
806 ret = -EBUSY; in cachefiles_cull()
809 inode->i_flags |= S_KERNEL_FILE; in cachefiles_cull()
830 if (ret == -ENOENT) in cachefiles_cull()
831 return -ESTALE; /* Probably got retired by the netfs */ in cachefiles_cull()
833 if (ret != -ENOMEM) { in cachefiles_cull()
835 ret = -EIO; in cachefiles_cull()
844 * - called only by cache manager daemon
845 * - returns -EBUSY or 0 to indicate whether an object is in use or not