Lines Matching +full:cache +full:-

1 // SPDX-License-Identifier: GPL-2.0-or-later
59 int (*handler)(struct cachefiles_cache *cache, char *args);
85 struct cachefiles_cache *cache; in cachefiles_daemon_open() local
91 return -EPERM; in cachefiles_daemon_open()
95 return -EBUSY; in cachefiles_daemon_open()
97 /* allocate a cache record */ in cachefiles_daemon_open()
98 cache = kzalloc(sizeof(struct cachefiles_cache), GFP_KERNEL); in cachefiles_daemon_open()
99 if (!cache) { in cachefiles_daemon_open()
101 return -ENOMEM; in cachefiles_daemon_open()
104 mutex_init(&cache->daemon_mutex); in cachefiles_daemon_open()
105 cache->active_nodes = RB_ROOT; in cachefiles_daemon_open()
106 rwlock_init(&cache->active_lock); in cachefiles_daemon_open()
107 init_waitqueue_head(&cache->daemon_pollwq); in cachefiles_daemon_open()
110 * - limit at 1% free space and/or free files in cachefiles_daemon_open()
111 * - cull below 5% free space and/or free files in cachefiles_daemon_open()
112 * - cease culling above 7% free space and/or free files in cachefiles_daemon_open()
114 cache->frun_percent = 7; in cachefiles_daemon_open()
115 cache->fcull_percent = 5; in cachefiles_daemon_open()
116 cache->fstop_percent = 1; in cachefiles_daemon_open()
117 cache->brun_percent = 7; in cachefiles_daemon_open()
118 cache->bcull_percent = 5; in cachefiles_daemon_open()
119 cache->bstop_percent = 1; in cachefiles_daemon_open()
121 file->private_data = cache; in cachefiles_daemon_open()
122 cache->cachefilesd = file; in cachefiles_daemon_open()
127 * release a cache
131 struct cachefiles_cache *cache = file->private_data; in cachefiles_daemon_release() local
135 ASSERT(cache); in cachefiles_daemon_release()
137 set_bit(CACHEFILES_DEAD, &cache->flags); in cachefiles_daemon_release()
139 cachefiles_daemon_unbind(cache); in cachefiles_daemon_release()
141 ASSERT(!cache->active_nodes.rb_node); in cachefiles_daemon_release()
144 cache->cachefilesd = NULL; in cachefiles_daemon_release()
145 file->private_data = NULL; in cachefiles_daemon_release()
148 kfree(cache); in cachefiles_daemon_release()
155 * read the cache state
160 struct cachefiles_cache *cache = file->private_data; in cachefiles_daemon_read() local
168 if (!test_bit(CACHEFILES_READY, &cache->flags)) in cachefiles_daemon_read()
171 /* check how much space the cache has */ in cachefiles_daemon_read()
172 cachefiles_has_space(cache, 0, 0); in cachefiles_daemon_read()
175 f_released = atomic_xchg(&cache->f_released, 0); in cachefiles_daemon_read()
176 b_released = atomic_long_xchg(&cache->b_released, 0); in cachefiles_daemon_read()
177 clear_bit(CACHEFILES_STATE_CHANGED, &cache->flags); in cachefiles_daemon_read()
189 test_bit(CACHEFILES_CULLING, &cache->flags) ? '1' : '0', in cachefiles_daemon_read()
190 (unsigned long long) cache->frun, in cachefiles_daemon_read()
191 (unsigned long long) cache->fcull, in cachefiles_daemon_read()
192 (unsigned long long) cache->fstop, in cachefiles_daemon_read()
193 (unsigned long long) cache->brun, in cachefiles_daemon_read()
194 (unsigned long long) cache->bcull, in cachefiles_daemon_read()
195 (unsigned long long) cache->bstop, in cachefiles_daemon_read()
200 return -EMSGSIZE; in cachefiles_daemon_read()
203 return -EFAULT; in cachefiles_daemon_read()
209 * command the cache
217 struct cachefiles_cache *cache = file->private_data; in cachefiles_daemon_write() local
223 ASSERT(cache); in cachefiles_daemon_write()
225 if (test_bit(CACHEFILES_DEAD, &cache->flags)) in cachefiles_daemon_write()
226 return -EIO; in cachefiles_daemon_write()
228 if (datalen < 0 || datalen > PAGE_SIZE - 1) in cachefiles_daemon_write()
229 return -EOPNOTSUPP; in cachefiles_daemon_write()
236 ret = -EINVAL; in cachefiles_daemon_write()
250 ret = -EOPNOTSUPP; in cachefiles_daemon_write()
263 for (cmd = cachefiles_daemon_cmds; cmd->name[0]; cmd++) in cachefiles_daemon_write()
264 if (strcmp(cmd->name, data) == 0) in cachefiles_daemon_write()
273 mutex_lock(&cache->daemon_mutex); in cachefiles_daemon_write()
275 ret = -EIO; in cachefiles_daemon_write()
276 if (!test_bit(CACHEFILES_DEAD, &cache->flags)) in cachefiles_daemon_write()
277 ret = cmd->handler(cache, args); in cachefiles_daemon_write()
279 mutex_unlock(&cache->daemon_mutex); in cachefiles_daemon_write()
288 * - use EPOLLOUT to indicate culling state
293 struct cachefiles_cache *cache = file->private_data; in cachefiles_daemon_poll() local
296 poll_wait(file, &cache->daemon_pollwq, poll); in cachefiles_daemon_poll()
299 if (test_bit(CACHEFILES_STATE_CHANGED, &cache->flags)) in cachefiles_daemon_poll()
302 if (test_bit(CACHEFILES_CULLING, &cache->flags)) in cachefiles_daemon_poll()
309 * give a range error for cache space constraints
310 * - can be tail-called
312 static int cachefiles_daemon_range_error(struct cachefiles_cache *cache, in cachefiles_daemon_range_error() argument
317 return -EINVAL; in cachefiles_daemon_range_error()
322 * - command: "frun <N>%"
324 static int cachefiles_daemon_frun(struct cachefiles_cache *cache, char *args) in cachefiles_daemon_frun() argument
331 return -EINVAL; in cachefiles_daemon_frun()
335 return -EINVAL; in cachefiles_daemon_frun()
337 if (frun <= cache->fcull_percent || frun >= 100) in cachefiles_daemon_frun()
338 return cachefiles_daemon_range_error(cache, args); in cachefiles_daemon_frun()
340 cache->frun_percent = frun; in cachefiles_daemon_frun()
346 * - command: "fcull <N>%"
348 static int cachefiles_daemon_fcull(struct cachefiles_cache *cache, char *args) in cachefiles_daemon_fcull() argument
355 return -EINVAL; in cachefiles_daemon_fcull()
359 return -EINVAL; in cachefiles_daemon_fcull()
361 if (fcull <= cache->fstop_percent || fcull >= cache->frun_percent) in cachefiles_daemon_fcull()
362 return cachefiles_daemon_range_error(cache, args); in cachefiles_daemon_fcull()
364 cache->fcull_percent = fcull; in cachefiles_daemon_fcull()
370 * - command: "fstop <N>%"
372 static int cachefiles_daemon_fstop(struct cachefiles_cache *cache, char *args) in cachefiles_daemon_fstop() argument
379 return -EINVAL; in cachefiles_daemon_fstop()
383 return -EINVAL; in cachefiles_daemon_fstop()
385 if (fstop < 0 || fstop >= cache->fcull_percent) in cachefiles_daemon_fstop()
386 return cachefiles_daemon_range_error(cache, args); in cachefiles_daemon_fstop()
388 cache->fstop_percent = fstop; in cachefiles_daemon_fstop()
394 * - command: "brun <N>%"
396 static int cachefiles_daemon_brun(struct cachefiles_cache *cache, char *args) in cachefiles_daemon_brun() argument
403 return -EINVAL; in cachefiles_daemon_brun()
407 return -EINVAL; in cachefiles_daemon_brun()
409 if (brun <= cache->bcull_percent || brun >= 100) in cachefiles_daemon_brun()
410 return cachefiles_daemon_range_error(cache, args); in cachefiles_daemon_brun()
412 cache->brun_percent = brun; in cachefiles_daemon_brun()
418 * - command: "bcull <N>%"
420 static int cachefiles_daemon_bcull(struct cachefiles_cache *cache, char *args) in cachefiles_daemon_bcull() argument
427 return -EINVAL; in cachefiles_daemon_bcull()
431 return -EINVAL; in cachefiles_daemon_bcull()
433 if (bcull <= cache->bstop_percent || bcull >= cache->brun_percent) in cachefiles_daemon_bcull()
434 return cachefiles_daemon_range_error(cache, args); in cachefiles_daemon_bcull()
436 cache->bcull_percent = bcull; in cachefiles_daemon_bcull()
442 * - command: "bstop <N>%"
444 static int cachefiles_daemon_bstop(struct cachefiles_cache *cache, char *args) in cachefiles_daemon_bstop() argument
451 return -EINVAL; in cachefiles_daemon_bstop()
455 return -EINVAL; in cachefiles_daemon_bstop()
457 if (bstop < 0 || bstop >= cache->bcull_percent) in cachefiles_daemon_bstop()
458 return cachefiles_daemon_range_error(cache, args); in cachefiles_daemon_bstop()
460 cache->bstop_percent = bstop; in cachefiles_daemon_bstop()
465 * set the cache directory
466 * - command: "dir <name>"
468 static int cachefiles_daemon_dir(struct cachefiles_cache *cache, char *args) in cachefiles_daemon_dir() argument
476 return -EINVAL; in cachefiles_daemon_dir()
479 if (cache->rootdirname) { in cachefiles_daemon_dir()
480 pr_err("Second cache directory specified\n"); in cachefiles_daemon_dir()
481 return -EEXIST; in cachefiles_daemon_dir()
486 return -ENOMEM; in cachefiles_daemon_dir()
488 cache->rootdirname = dir; in cachefiles_daemon_dir()
493 * set the cache security context
494 * - command: "secctx <ctx>"
496 static int cachefiles_daemon_secctx(struct cachefiles_cache *cache, char *args) in cachefiles_daemon_secctx() argument
504 return -EINVAL; in cachefiles_daemon_secctx()
507 if (cache->secctx) { in cachefiles_daemon_secctx()
509 return -EINVAL; in cachefiles_daemon_secctx()
514 return -ENOMEM; in cachefiles_daemon_secctx()
516 cache->secctx = secctx; in cachefiles_daemon_secctx()
521 * set the cache tag
522 * - command: "tag <name>"
524 static int cachefiles_daemon_tag(struct cachefiles_cache *cache, char *args) in cachefiles_daemon_tag() argument
532 return -EINVAL; in cachefiles_daemon_tag()
535 if (cache->tag) in cachefiles_daemon_tag()
536 return -EEXIST; in cachefiles_daemon_tag()
540 return -ENOMEM; in cachefiles_daemon_tag()
542 cache->tag = tag; in cachefiles_daemon_tag()
547 * request a node in the cache be culled from the current working directory
548 * - command: "cull <name>"
550 static int cachefiles_daemon_cull(struct cachefiles_cache *cache, char *args) in cachefiles_daemon_cull() argument
561 if (!test_bit(CACHEFILES_READY, &cache->flags)) { in cachefiles_daemon_cull()
562 pr_err("cull applied to unready cache\n"); in cachefiles_daemon_cull()
563 return -EIO; in cachefiles_daemon_cull()
566 if (test_bit(CACHEFILES_DEAD, &cache->flags)) { in cachefiles_daemon_cull()
567 pr_err("cull applied to dead cache\n"); in cachefiles_daemon_cull()
568 return -EIO; in cachefiles_daemon_cull()
572 get_fs_pwd(current->fs, &path); in cachefiles_daemon_cull()
577 cachefiles_begin_secure(cache, &saved_cred); in cachefiles_daemon_cull()
578 ret = cachefiles_cull(cache, path.dentry, args); in cachefiles_daemon_cull()
579 cachefiles_end_secure(cache, saved_cred); in cachefiles_daemon_cull()
588 return -ENOTDIR; in cachefiles_daemon_cull()
592 return -EINVAL; in cachefiles_daemon_cull()
597 * - command: "debug <mask>"
599 static int cachefiles_daemon_debug(struct cachefiles_cache *cache, char *args) in cachefiles_daemon_debug() argument
615 return -EINVAL; in cachefiles_daemon_debug()
620 * - command: "inuse <name>"
622 static int cachefiles_daemon_inuse(struct cachefiles_cache *cache, char *args) in cachefiles_daemon_inuse() argument
633 if (!test_bit(CACHEFILES_READY, &cache->flags)) { in cachefiles_daemon_inuse()
634 pr_err("inuse applied to unready cache\n"); in cachefiles_daemon_inuse()
635 return -EIO; in cachefiles_daemon_inuse()
638 if (test_bit(CACHEFILES_DEAD, &cache->flags)) { in cachefiles_daemon_inuse()
639 pr_err("inuse applied to dead cache\n"); in cachefiles_daemon_inuse()
640 return -EIO; in cachefiles_daemon_inuse()
644 get_fs_pwd(current->fs, &path); in cachefiles_daemon_inuse()
649 cachefiles_begin_secure(cache, &saved_cred); in cachefiles_daemon_inuse()
650 ret = cachefiles_check_in_use(cache, path.dentry, args); in cachefiles_daemon_inuse()
651 cachefiles_end_secure(cache, saved_cred); in cachefiles_daemon_inuse()
660 return -ENOTDIR; in cachefiles_daemon_inuse()
664 return -EINVAL; in cachefiles_daemon_inuse()
669 * cache
671 int cachefiles_has_space(struct cachefiles_cache *cache, in cachefiles_has_space() argument
676 .mnt = cache->mnt, in cachefiles_has_space()
677 .dentry = cache->mnt->mnt_root, in cachefiles_has_space()
682 // (unsigned long long) cache->frun, in cachefiles_has_space()
683 // (unsigned long long) cache->fcull, in cachefiles_has_space()
684 // (unsigned long long) cache->fstop, in cachefiles_has_space()
685 // (unsigned long long) cache->brun, in cachefiles_has_space()
686 // (unsigned long long) cache->bcull, in cachefiles_has_space()
687 // (unsigned long long) cache->bstop, in cachefiles_has_space()
695 if (ret == -EIO) in cachefiles_has_space()
696 cachefiles_io_error(cache, "statfs failed"); in cachefiles_has_space()
701 stats.f_bavail >>= cache->bshift; in cachefiles_has_space()
709 stats.f_ffree -= fnr; in cachefiles_has_space()
714 stats.f_bavail -= bnr; in cachefiles_has_space()
718 ret = -ENOBUFS; in cachefiles_has_space()
719 if (stats.f_ffree < cache->fstop || in cachefiles_has_space()
720 stats.f_bavail < cache->bstop) in cachefiles_has_space()
724 if (stats.f_ffree < cache->fcull || in cachefiles_has_space()
725 stats.f_bavail < cache->bcull) in cachefiles_has_space()
728 if (test_bit(CACHEFILES_CULLING, &cache->flags) && in cachefiles_has_space()
729 stats.f_ffree >= cache->frun && in cachefiles_has_space()
730 stats.f_bavail >= cache->brun && in cachefiles_has_space()
731 test_and_clear_bit(CACHEFILES_CULLING, &cache->flags) in cachefiles_has_space()
734 cachefiles_state_changed(cache); in cachefiles_has_space()
741 if (!test_and_set_bit(CACHEFILES_CULLING, &cache->flags)) { in cachefiles_has_space()
742 _debug("### CULL CACHE ###"); in cachefiles_has_space()
743 cachefiles_state_changed(cache); in cachefiles_has_space()