Lines Matching +full:fiq +full:- +full:based
3 Copyright (C) 2001-2008 Miklos Szeredi <miklos@szeredi.hu>
84 sl->forget = fuse_alloc_forget(); in fuse_alloc_submount_lookup()
85 if (!sl->forget) in fuse_alloc_submount_lookup()
103 fi->i_time = 0; in fuse_alloc_inode()
104 fi->inval_mask = ~0; in fuse_alloc_inode()
105 fi->nodeid = 0; in fuse_alloc_inode()
106 fi->nlookup = 0; in fuse_alloc_inode()
107 fi->attr_version = 0; in fuse_alloc_inode()
108 fi->orig_ino = 0; in fuse_alloc_inode()
109 fi->state = 0; in fuse_alloc_inode()
110 fi->submount_lookup = NULL; in fuse_alloc_inode()
111 mutex_init(&fi->mutex); in fuse_alloc_inode()
112 spin_lock_init(&fi->lock); in fuse_alloc_inode()
113 fi->forget = fuse_alloc_forget(); in fuse_alloc_inode()
114 if (!fi->forget) in fuse_alloc_inode()
123 return &fi->inode; in fuse_alloc_inode()
126 kfree(fi->forget); in fuse_alloc_inode()
136 mutex_destroy(&fi->mutex); in fuse_free_inode()
137 kfree(fi->forget); in fuse_free_inode()
139 kfree(fi->dax); in fuse_free_inode()
150 if (!refcount_dec_and_test(&sl->count)) in fuse_cleanup_submount_lookup()
153 fuse_queue_forget(fc, sl->forget, sl->nodeid, 1); in fuse_cleanup_submount_lookup()
154 sl->forget = NULL; in fuse_cleanup_submount_lookup()
163 WARN_ON(inode->i_state & I_DIRTY_INODE); in fuse_evict_inode()
165 truncate_inode_pages_final(&inode->i_data); in fuse_evict_inode()
167 if (inode->i_sb->s_flags & SB_ACTIVE) { in fuse_evict_inode()
172 if (fi->nlookup) { in fuse_evict_inode()
173 fuse_queue_forget(fc, fi->forget, fi->nodeid, in fuse_evict_inode()
174 fi->nlookup); in fuse_evict_inode()
175 fi->forget = NULL; in fuse_evict_inode()
178 if (fi->submount_lookup) { in fuse_evict_inode()
179 fuse_cleanup_submount_lookup(fc, fi->submount_lookup); in fuse_evict_inode()
180 fi->submount_lookup = NULL; in fuse_evict_inode()
183 * Evict of non-deleted inode may race with outstanding in fuse_evict_inode()
188 if (inode->i_nlink > 0) in fuse_evict_inode()
189 atomic64_inc(&fc->evict_ctr); in fuse_evict_inode()
191 if (S_ISREG(inode->i_mode) && !fuse_is_bad(inode)) { in fuse_evict_inode()
192 WARN_ON(fi->iocachectr != 0); in fuse_evict_inode()
193 WARN_ON(!list_empty(&fi->write_files)); in fuse_evict_inode()
194 WARN_ON(!list_empty(&fi->queued_writes)); in fuse_evict_inode()
200 struct super_block *sb = fsc->root->d_sb; in fuse_reconfigure()
203 if (fsc->sb_flags & SB_MANDLOCK) in fuse_reconfigure()
204 return -EINVAL; in fuse_reconfigure()
210 * ino_t is 32-bits on 32-bit arch. We have to squash the 64-bit value down
217 ino ^= ino64 >> (sizeof(u64) - sizeof(ino_t)) * 8; in fuse_squash_ino()
229 lockdep_assert_held(&fi->lock); in fuse_change_attributes_common()
238 * !evict_ctr -> this is create in fuse_change_attributes_common()
239 * fi->attr_version != 0 -> this is not a new inode in fuse_change_attributes_common()
240 * evict_ctr == fuse_get_evict_ctr() -> no evicts while during request in fuse_change_attributes_common()
242 if (!evict_ctr || fi->attr_version || evict_ctr == fuse_get_evict_ctr(fc)) in fuse_change_attributes_common()
243 set_mask_bits(&fi->inval_mask, STATX_BASIC_STATS, 0); in fuse_change_attributes_common()
245 fi->attr_version = atomic64_inc_return(&fc->attr_version); in fuse_change_attributes_common()
246 fi->i_time = attr_valid; in fuse_change_attributes_common()
248 inode->i_ino = fuse_squash_ino(attr->ino); in fuse_change_attributes_common()
249 inode->i_mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777); in fuse_change_attributes_common()
250 set_nlink(inode, attr->nlink); in fuse_change_attributes_common()
251 inode->i_uid = make_kuid(fc->user_ns, attr->uid); in fuse_change_attributes_common()
252 inode->i_gid = make_kgid(fc->user_ns, attr->gid); in fuse_change_attributes_common()
253 inode->i_blocks = attr->blocks; in fuse_change_attributes_common()
256 attr->atimensec = min_t(u32, attr->atimensec, NSEC_PER_SEC - 1); in fuse_change_attributes_common()
257 attr->mtimensec = min_t(u32, attr->mtimensec, NSEC_PER_SEC - 1); in fuse_change_attributes_common()
258 attr->ctimensec = min_t(u32, attr->ctimensec, NSEC_PER_SEC - 1); in fuse_change_attributes_common()
260 inode_set_atime(inode, attr->atime, attr->atimensec); in fuse_change_attributes_common()
263 inode_set_mtime(inode, attr->mtime, attr->mtimensec); in fuse_change_attributes_common()
266 inode_set_ctime(inode, attr->ctime, attr->ctimensec); in fuse_change_attributes_common()
270 sx->btime.tv_nsec = in fuse_change_attributes_common()
271 min_t(u32, sx->btime.tv_nsec, NSEC_PER_SEC - 1); in fuse_change_attributes_common()
280 set_mask_bits(&fi->inval_mask, STATX_BTIME, 0); in fuse_change_attributes_common()
281 if (sx->mask & STATX_BTIME) { in fuse_change_attributes_common()
282 set_bit(FUSE_I_BTIME, &fi->state); in fuse_change_attributes_common()
283 fi->i_btime.tv_sec = sx->btime.tv_sec; in fuse_change_attributes_common()
284 fi->i_btime.tv_nsec = sx->btime.tv_nsec; in fuse_change_attributes_common()
288 if (attr->blksize != 0) in fuse_change_attributes_common()
289 inode->i_blkbits = ilog2(attr->blksize); in fuse_change_attributes_common()
291 inode->i_blkbits = inode->i_sb->s_blocksize_bits; in fuse_change_attributes_common()
298 fi->orig_i_mode = inode->i_mode; in fuse_change_attributes_common()
299 if (!fc->default_permissions) in fuse_change_attributes_common()
300 inode->i_mode &= ~S_ISVTX; in fuse_change_attributes_common()
302 fi->orig_ino = attr->ino; in fuse_change_attributes_common()
312 inode->i_flags &= ~S_NOSEC; in fuse_change_attributes_common()
319 if (!fc->writeback_cache || !S_ISREG(inode->i_mode)) in fuse_get_cache_mask()
335 spin_lock(&fi->lock); in fuse_change_attributes_i()
343 attr->size = i_size_read(inode); in fuse_change_attributes_i()
346 attr->mtime = inode_get_mtime_sec(inode); in fuse_change_attributes_i()
347 attr->mtimensec = inode_get_mtime_nsec(inode); in fuse_change_attributes_i()
350 attr->ctime = inode_get_ctime_sec(inode); in fuse_change_attributes_i()
351 attr->ctimensec = inode_get_ctime_nsec(inode); in fuse_change_attributes_i()
354 if ((attr_version != 0 && fi->attr_version > attr_version) || in fuse_change_attributes_i()
355 test_bit(FUSE_I_SIZE_UNSTABLE, &fi->state)) { in fuse_change_attributes_i()
356 spin_unlock(&fi->lock); in fuse_change_attributes_i()
364 oldsize = inode->i_size; in fuse_change_attributes_i()
368 * attr->size coming from server can be stale. We cannot trust it. in fuse_change_attributes_i()
371 i_size_write(inode, attr->size); in fuse_change_attributes_i()
372 spin_unlock(&fi->lock); in fuse_change_attributes_i()
374 if (!cache_mask && S_ISREG(inode->i_mode)) { in fuse_change_attributes_i()
377 if (oldsize != attr->size) { in fuse_change_attributes_i()
378 truncate_pagecache(inode, attr->size); in fuse_change_attributes_i()
379 if (!fc->explicit_inval_data) in fuse_change_attributes_i()
381 } else if (fc->auto_inval_data) { in fuse_change_attributes_i()
383 .tv_sec = attr->mtime, in fuse_change_attributes_i()
384 .tv_nsec = attr->mtimensec, in fuse_change_attributes_i()
396 invalidate_inode_pages2(inode->i_mapping); in fuse_change_attributes_i()
400 fuse_dax_dontcache(inode, attr->flags); in fuse_change_attributes_i()
413 sl->nodeid = nodeid; in fuse_init_submount_lookup()
414 refcount_set(&sl->count, 1); in fuse_init_submount_lookup()
420 inode->i_mode = attr->mode & S_IFMT; in fuse_init_inode()
421 inode->i_size = attr->size; in fuse_init_inode()
422 inode_set_mtime(inode, attr->mtime, attr->mtimensec); in fuse_init_inode()
423 inode_set_ctime(inode, attr->ctime, attr->ctimensec); in fuse_init_inode()
424 if (S_ISREG(inode->i_mode)) { in fuse_init_inode()
426 fuse_init_file_inode(inode, attr->flags); in fuse_init_inode()
427 } else if (S_ISDIR(inode->i_mode)) in fuse_init_inode()
429 else if (S_ISLNK(inode->i_mode)) in fuse_init_inode()
431 else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) || in fuse_init_inode()
432 S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) { in fuse_init_inode()
434 init_special_inode(inode, inode->i_mode, in fuse_init_inode()
435 new_decode_dev(attr->rdev)); in fuse_init_inode()
442 if (!fc->posix_acl) in fuse_init_inode()
443 inode->i_acl = inode->i_default_acl = ACL_DONT_CACHE; in fuse_init_inode()
458 get_fuse_inode(inode)->nodeid = nodeid; in fuse_inode_set()
478 if (fc->auto_submounts && (attr->flags & FUSE_ATTR_SUBMOUNT) && in fuse_iget()
479 S_ISDIR(attr->mode)) { in fuse_iget()
488 fi->nodeid = nodeid; in fuse_iget()
489 fi->submount_lookup = fuse_alloc_submount_lookup(); in fuse_iget()
490 if (!fi->submount_lookup) { in fuse_iget()
494 /* Sets nlookup = 1 on fi->submount_lookup->nlookup */ in fuse_iget()
495 fuse_init_submount_lookup(fi->submount_lookup, nodeid); in fuse_iget()
496 inode->i_flags |= S_AUTOMOUNT; in fuse_iget()
505 if ((inode->i_state & I_NEW)) { in fuse_iget()
506 inode->i_flags |= S_NOATIME; in fuse_iget()
507 if (!fc->writeback_cache || !S_ISREG(attr->mode)) in fuse_iget()
508 inode->i_flags |= S_NOCMTIME; in fuse_iget()
509 inode->i_generation = generation; in fuse_iget()
515 if (inode != d_inode(sb->s_root)) { in fuse_iget()
522 spin_lock(&fi->lock); in fuse_iget()
523 fi->nlookup++; in fuse_iget()
524 spin_unlock(&fi->lock); in fuse_iget()
537 WARN_ON(!rwsem_is_locked(&fc->killsb)); in fuse_ilookup()
538 list_for_each_entry(fm_iter, &fc->mounts, fc_entry) { in fuse_ilookup()
539 if (!fm_iter->sb) in fuse_ilookup()
542 inode = ilookup5(fm_iter->sb, nodeid, fuse_inode_eq, &nodeid); in fuse_ilookup()
563 return -ENOENT; in fuse_reverse_inval_inode()
566 spin_lock(&fi->lock); in fuse_reverse_inval_inode()
567 fi->attr_version = atomic64_inc_return(&fc->attr_version); in fuse_reverse_inval_inode()
568 spin_unlock(&fi->lock); in fuse_reverse_inval_inode()
575 pg_end = -1; in fuse_reverse_inval_inode()
577 pg_end = (offset + len - 1) >> PAGE_SHIFT; in fuse_reverse_inval_inode()
578 invalidate_inode_pages2_range(inode->i_mapping, in fuse_reverse_inval_inode()
589 if (!get_fuse_conn(inode)->parallel_dirops) { in fuse_lock_inode()
590 mutex_lock(&get_fuse_inode(inode)->mutex); in fuse_lock_inode()
600 mutex_unlock(&get_fuse_inode(inode)->mutex); in fuse_unlock_inode()
607 if (fc->no_force_umount) in fuse_umount_begin()
612 // Only retire block-device-based superblocks. in fuse_umount_begin()
613 if (sb->s_bdev != NULL) in fuse_umount_begin()
619 if (fm->fc->conn_init) { in fuse_send_destroy()
631 stbuf->f_type = FUSE_SUPER_MAGIC; in convert_fuse_statfs()
632 stbuf->f_bsize = attr->bsize; in convert_fuse_statfs()
633 stbuf->f_frsize = attr->frsize; in convert_fuse_statfs()
634 stbuf->f_blocks = attr->blocks; in convert_fuse_statfs()
635 stbuf->f_bfree = attr->bfree; in convert_fuse_statfs()
636 stbuf->f_bavail = attr->bavail; in convert_fuse_statfs()
637 stbuf->f_files = attr->files; in convert_fuse_statfs()
638 stbuf->f_ffree = attr->ffree; in convert_fuse_statfs()
639 stbuf->f_namelen = attr->namelen; in convert_fuse_statfs()
645 struct super_block *sb = dentry->d_sb; in fuse_statfs()
651 if (!fuse_allow_current_process(fm->fc)) { in fuse_statfs()
652 buf->f_type = FUSE_SUPER_MAGIC; in fuse_statfs()
675 init_waitqueue_head(&bucket->waitq); in fuse_sync_bucket_alloc()
677 atomic_set(&bucket->count, 1); in fuse_sync_bucket_alloc()
688 spin_lock(&fc->lock); in fuse_sync_fs_writes()
689 bucket = rcu_dereference_protected(fc->curr_bucket, 1); in fuse_sync_fs_writes()
690 count = atomic_read(&bucket->count); in fuse_sync_fs_writes()
694 spin_unlock(&fc->lock); in fuse_sync_fs_writes()
703 atomic_inc(&new_bucket->count); in fuse_sync_fs_writes()
704 rcu_assign_pointer(fc->curr_bucket, new_bucket); in fuse_sync_fs_writes()
705 spin_unlock(&fc->lock); in fuse_sync_fs_writes()
711 atomic_dec(&bucket->count); in fuse_sync_fs_writes()
713 wait_event(bucket->waitq, atomic_read(&bucket->count) == 0); in fuse_sync_fs_writes()
723 struct fuse_conn *fc = fm->fc; in fuse_sync_fs()
736 if (!sb->s_root) in fuse_sync_fs()
739 if (!fc->sync_fs) in fuse_sync_fs()
749 args.nodeid = get_node_id(sb->s_root->d_inode); in fuse_sync_fs()
753 if (err == -ENOSYS) { in fuse_sync_fs()
754 fc->sync_fs = 0; in fuse_sync_fs()
792 struct fuse_fs_context *ctx = fsc->fs_private; in fuse_parse_param()
797 if (fsc->purpose == FS_CONTEXT_FOR_RECONFIGURE) { in fuse_parse_param()
802 if (fsc->oldapi) in fuse_parse_param()
814 if (fsc->source) in fuse_parse_param()
816 fsc->source = param->string; in fuse_parse_param()
817 param->string = NULL; in fuse_parse_param()
821 if (ctx->subtype) in fuse_parse_param()
823 ctx->subtype = param->string; in fuse_parse_param()
824 param->string = NULL; in fuse_parse_param()
828 ctx->fd = result.uint_32; in fuse_parse_param()
829 ctx->fd_present = true; in fuse_parse_param()
835 ctx->rootmode = result.uint_32; in fuse_parse_param()
836 ctx->rootmode_present = true; in fuse_parse_param()
845 if (!kuid_has_mapping(fsc->user_ns, kuid)) in fuse_parse_param()
847 ctx->user_id = kuid; in fuse_parse_param()
848 ctx->user_id_present = true; in fuse_parse_param()
857 if (!kgid_has_mapping(fsc->user_ns, kgid)) in fuse_parse_param()
859 ctx->group_id = kgid; in fuse_parse_param()
860 ctx->group_id_present = true; in fuse_parse_param()
864 ctx->default_permissions = true; in fuse_parse_param()
868 ctx->allow_other = true; in fuse_parse_param()
872 ctx->max_read = result.uint_32; in fuse_parse_param()
876 if (!ctx->is_bdev) in fuse_parse_param()
878 ctx->blksize = result.uint_32; in fuse_parse_param()
882 return -EINVAL; in fuse_parse_param()
890 struct fuse_fs_context *ctx = fsc->fs_private; in fuse_free_fsc()
893 kfree(ctx->subtype); in fuse_free_fsc()
900 struct super_block *sb = root->d_sb; in fuse_show_options()
903 if (fc->legacy_opts_show) { in fuse_show_options()
905 from_kuid_munged(fc->user_ns, fc->user_id)); in fuse_show_options()
907 from_kgid_munged(fc->user_ns, fc->group_id)); in fuse_show_options()
908 if (fc->default_permissions) in fuse_show_options()
910 if (fc->allow_other) in fuse_show_options()
912 if (fc->max_read != ~0) in fuse_show_options()
913 seq_printf(m, ",max_read=%u", fc->max_read); in fuse_show_options()
914 if (sb->s_bdev && sb->s_blocksize != FUSE_DEFAULT_BLKSIZE) in fuse_show_options()
915 seq_printf(m, ",blksize=%lu", sb->s_blocksize); in fuse_show_options()
918 if (fc->dax_mode == FUSE_DAX_ALWAYS) in fuse_show_options()
920 else if (fc->dax_mode == FUSE_DAX_NEVER) in fuse_show_options()
922 else if (fc->dax_mode == FUSE_DAX_INODE_USER) in fuse_show_options()
929 static void fuse_iqueue_init(struct fuse_iqueue *fiq, in fuse_iqueue_init() argument
933 memset(fiq, 0, sizeof(struct fuse_iqueue)); in fuse_iqueue_init()
934 spin_lock_init(&fiq->lock); in fuse_iqueue_init()
935 init_waitqueue_head(&fiq->waitq); in fuse_iqueue_init()
936 INIT_LIST_HEAD(&fiq->pending); in fuse_iqueue_init()
937 INIT_LIST_HEAD(&fiq->interrupts); in fuse_iqueue_init()
938 fiq->forget_list_tail = &fiq->forget_list_head; in fuse_iqueue_init()
939 fiq->connected = 1; in fuse_iqueue_init()
940 fiq->ops = ops; in fuse_iqueue_init()
941 fiq->priv = priv; in fuse_iqueue_init()
948 spin_lock_init(&fpq->lock); in fuse_pqueue_init()
950 INIT_LIST_HEAD(&fpq->processing[i]); in fuse_pqueue_init()
951 INIT_LIST_HEAD(&fpq->io); in fuse_pqueue_init()
952 fpq->connected = 1; in fuse_pqueue_init()
960 spin_lock_init(&fc->lock); in fuse_conn_init()
961 spin_lock_init(&fc->bg_lock); in fuse_conn_init()
962 init_rwsem(&fc->killsb); in fuse_conn_init()
963 refcount_set(&fc->count, 1); in fuse_conn_init()
964 atomic_set(&fc->dev_count, 1); in fuse_conn_init()
965 init_waitqueue_head(&fc->blocked_waitq); in fuse_conn_init()
966 fuse_iqueue_init(&fc->iq, fiq_ops, fiq_priv); in fuse_conn_init()
967 INIT_LIST_HEAD(&fc->bg_queue); in fuse_conn_init()
968 INIT_LIST_HEAD(&fc->entry); in fuse_conn_init()
969 INIT_LIST_HEAD(&fc->devices); in fuse_conn_init()
970 atomic_set(&fc->num_waiting, 0); in fuse_conn_init()
971 fc->max_background = FUSE_DEFAULT_MAX_BACKGROUND; in fuse_conn_init()
972 fc->congestion_threshold = FUSE_DEFAULT_CONGESTION_THRESHOLD; in fuse_conn_init()
973 atomic64_set(&fc->khctr, 0); in fuse_conn_init()
974 fc->polled_files = RB_ROOT; in fuse_conn_init()
975 fc->blocked = 0; in fuse_conn_init()
976 fc->initialized = 0; in fuse_conn_init()
977 fc->connected = 1; in fuse_conn_init()
978 atomic64_set(&fc->attr_version, 1); in fuse_conn_init()
979 atomic64_set(&fc->evict_ctr, 1); in fuse_conn_init()
980 get_random_bytes(&fc->scramble_key, sizeof(fc->scramble_key)); in fuse_conn_init()
981 fc->pid_ns = get_pid_ns(task_active_pid_ns(current)); in fuse_conn_init()
982 fc->user_ns = get_user_ns(user_ns); in fuse_conn_init()
983 fc->max_pages = FUSE_DEFAULT_MAX_PAGES_PER_REQ; in fuse_conn_init()
984 fc->max_pages_limit = fuse_max_pages_limit; in fuse_conn_init()
985 fc->name_max = FUSE_NAME_LOW_MAX; in fuse_conn_init()
986 fc->timeout.req_timeout = 0; in fuse_conn_init()
991 INIT_LIST_HEAD(&fc->mounts); in fuse_conn_init()
992 list_add(&fm->fc_entry, &fc->mounts); in fuse_conn_init()
993 fm->fc = fc; in fuse_conn_init()
1003 put_user_ns(fc->user_ns); in delayed_release()
1004 fc->release(fc); in delayed_release()
1009 if (refcount_dec_and_test(&fc->count)) { in fuse_conn_put()
1010 struct fuse_iqueue *fiq = &fc->iq; in fuse_conn_put() local
1015 if (fc->timeout.req_timeout) in fuse_conn_put()
1016 cancel_delayed_work_sync(&fc->timeout.work); in fuse_conn_put()
1017 if (fiq->ops->release) in fuse_conn_put()
1018 fiq->ops->release(fiq); in fuse_conn_put()
1019 put_pid_ns(fc->pid_ns); in fuse_conn_put()
1020 bucket = rcu_dereference_protected(fc->curr_bucket, 1); in fuse_conn_put()
1022 WARN_ON(atomic_read(&bucket->count) != 1); in fuse_conn_put()
1027 call_rcu(&fc->rcu, delayed_release); in fuse_conn_put()
1034 refcount_inc(&fc->count); in fuse_conn_get()
1061 int err = -ESTALE; in fuse_get_dentry()
1063 if (handle->nodeid == 0) in fuse_get_dentry()
1066 inode = ilookup5(sb, handle->nodeid, fuse_inode_eq, &handle->nodeid); in fuse_get_dentry()
1071 if (!fc->export_support) in fuse_get_dentry()
1074 err = fuse_lookup_name(sb, handle->nodeid, &name, &outarg, in fuse_get_dentry()
1076 if (err && err != -ENOENT) in fuse_get_dentry()
1079 err = -ESTALE; in fuse_get_dentry()
1082 err = -EIO; in fuse_get_dentry()
1083 if (get_node_id(inode) != handle->nodeid) in fuse_get_dentry()
1086 err = -ESTALE; in fuse_get_dentry()
1087 if (inode->i_generation != handle->generation) in fuse_get_dentry()
1114 nodeid = get_fuse_inode(inode)->nodeid; in fuse_encode_fh()
1115 generation = inode->i_generation; in fuse_encode_fh()
1122 nodeid = get_fuse_inode(parent)->nodeid; in fuse_encode_fh()
1123 generation = parent->i_generation; in fuse_encode_fh()
1143 handle.nodeid = (u64) fid->raw[0] << 32; in fuse_fh_to_dentry()
1144 handle.nodeid |= (u64) fid->raw[1]; in fuse_fh_to_dentry()
1145 handle.generation = fid->raw[2]; in fuse_fh_to_dentry()
1157 parent.nodeid = (u64) fid->raw[3] << 32; in fuse_fh_to_parent()
1158 parent.nodeid |= (u64) fid->raw[4]; in fuse_fh_to_parent()
1159 parent.generation = fid->raw[5]; in fuse_fh_to_parent()
1172 if (!fc->export_support) in fuse_get_parent()
1173 return ERR_PTR(-ESTALE); in fuse_get_parent()
1175 err = fuse_lookup_name(child_inode->i_sb, get_node_id(child_inode), in fuse_get_parent()
1178 if (err == -ENOENT) in fuse_get_parent()
1179 return ERR_PTR(-ESTALE); in fuse_get_parent()
1224 *limit = (1 << 16) - 1; in sanitize_global_limit()
1235 sanitize_global_limit((unsigned *)kp->arg); in set_global_limit()
1244 if (arg->minor < 13) in process_init_limits()
1250 spin_lock(&fc->bg_lock); in process_init_limits()
1251 if (arg->max_background) { in process_init_limits()
1252 fc->max_background = arg->max_background; in process_init_limits()
1254 if (!cap_sys_admin && fc->max_background > max_user_bgreq) in process_init_limits()
1255 fc->max_background = max_user_bgreq; in process_init_limits()
1257 if (arg->congestion_threshold) { in process_init_limits()
1258 fc->congestion_threshold = arg->congestion_threshold; in process_init_limits()
1261 fc->congestion_threshold > max_user_congthresh) in process_init_limits()
1262 fc->congestion_threshold = max_user_congthresh; in process_init_limits()
1264 spin_unlock(&fc->bg_lock); in process_init_limits()
1269 fc->timeout.req_timeout = secs_to_jiffies(timeout); in set_request_timeout()
1270 INIT_DELAYED_WORK(&fc->timeout.work, fuse_check_timeout); in set_request_timeout()
1271 queue_delayed_work(system_wq, &fc->timeout.work, in set_request_timeout()
1304 struct fuse_conn *fc = fm->fc; in process_init_reply()
1306 struct fuse_init_out *arg = &ia->out; in process_init_reply()
1309 if (error || arg->major != FUSE_KERNEL_VERSION) in process_init_reply()
1317 if (arg->minor >= 6) { in process_init_reply()
1318 u64 flags = arg->flags; in process_init_reply()
1321 flags |= (u64) arg->flags2 << 32; in process_init_reply()
1323 ra_pages = arg->max_readahead / PAGE_SIZE; in process_init_reply()
1325 fc->async_read = 1; in process_init_reply()
1327 fc->no_lock = 1; in process_init_reply()
1328 if (arg->minor >= 17) { in process_init_reply()
1330 fc->no_flock = 1; in process_init_reply()
1333 fc->no_flock = 1; in process_init_reply()
1336 fc->atomic_o_trunc = 1; in process_init_reply()
1337 if (arg->minor >= 9) { in process_init_reply()
1340 fc->export_support = 1; in process_init_reply()
1343 fc->big_writes = 1; in process_init_reply()
1345 fc->dont_mask = 1; in process_init_reply()
1347 fc->auto_inval_data = 1; in process_init_reply()
1349 fc->explicit_inval_data = 1; in process_init_reply()
1351 fc->do_readdirplus = 1; in process_init_reply()
1353 fc->readdirplus_auto = 1; in process_init_reply()
1356 fc->async_dio = 1; in process_init_reply()
1358 fc->writeback_cache = 1; in process_init_reply()
1360 fc->parallel_dirops = 1; in process_init_reply()
1362 fc->handle_killpriv = 1; in process_init_reply()
1363 if (arg->time_gran && arg->time_gran <= 1000000000) in process_init_reply()
1364 fm->sb->s_time_gran = arg->time_gran; in process_init_reply()
1366 fc->default_permissions = 1; in process_init_reply()
1367 fc->posix_acl = 1; in process_init_reply()
1370 fc->cache_symlinks = 1; in process_init_reply()
1372 fc->abort_err = 1; in process_init_reply()
1374 fc->max_pages = in process_init_reply()
1375 min_t(unsigned int, fc->max_pages_limit, in process_init_reply()
1376 max_t(unsigned int, arg->max_pages, 1)); in process_init_reply()
1382 if (fc->max_pages > 1) in process_init_reply()
1383 fc->name_max = FUSE_NAME_MAX; in process_init_reply()
1387 !fuse_dax_check_alignment(fc, arg->map_alignment)) { in process_init_reply()
1391 fc->inode_dax = 1; in process_init_reply()
1394 fc->handle_killpriv_v2 = 1; in process_init_reply()
1395 fm->sb->s_flags |= SB_NOSEC; in process_init_reply()
1398 fc->setxattr_ext = 1; in process_init_reply()
1400 fc->init_security = 1; in process_init_reply()
1402 fc->create_supp_group = 1; in process_init_reply()
1404 fc->direct_io_allow_mmap = 1; in process_init_reply()
1421 arg->max_stack_depth > 0 && in process_init_reply()
1422 arg->max_stack_depth <= FILESYSTEM_MAX_STACK_DEPTH && in process_init_reply()
1424 fc->passthrough = 1; in process_init_reply()
1425 fc->max_stack_depth = arg->max_stack_depth; in process_init_reply()
1426 fm->sb->s_stack_depth = arg->max_stack_depth; in process_init_reply()
1429 fm->sb->s_export_op = &fuse_export_fid_operations; in process_init_reply()
1431 if (fc->default_permissions) in process_init_reply()
1432 fm->sb->s_iflags &= ~SB_I_NOIDMAP; in process_init_reply()
1437 fc->io_uring = 1; in process_init_reply()
1440 timeout = arg->request_timeout; in process_init_reply()
1442 ra_pages = fc->max_read / PAGE_SIZE; in process_init_reply()
1443 fc->no_lock = 1; in process_init_reply()
1444 fc->no_flock = 1; in process_init_reply()
1449 fm->sb->s_bdi->ra_pages = in process_init_reply()
1450 min(fm->sb->s_bdi->ra_pages, ra_pages); in process_init_reply()
1451 fc->minor = arg->minor; in process_init_reply()
1452 fc->max_write = arg->minor < 5 ? 4096 : arg->max_write; in process_init_reply()
1453 fc->max_write = max_t(unsigned, 4096, fc->max_write); in process_init_reply()
1454 fc->conn_init = 1; in process_init_reply()
1459 fc->conn_init = 0; in process_init_reply()
1460 fc->conn_error = 1; in process_init_reply()
1464 wake_up_all(&fc->blocked_waitq); in process_init_reply()
1474 ia->in.major = FUSE_KERNEL_VERSION; in fuse_send_init()
1475 ia->in.minor = FUSE_KERNEL_MINOR_VERSION; in fuse_send_init()
1476 ia->in.max_readahead = fm->sb->s_bdi->ra_pages * PAGE_SIZE; in fuse_send_init()
1493 if (fm->fc->dax) in fuse_send_init()
1495 if (fuse_is_inode_dax_mode(fm->fc->dax_mode)) in fuse_send_init()
1498 if (fm->fc->auto_submounts) in fuse_send_init()
1505 * the reply - server is either sending IORING_OP_URING_CMD or not. in fuse_send_init()
1510 ia->in.flags = flags; in fuse_send_init()
1511 ia->in.flags2 = flags >> 32; in fuse_send_init()
1513 ia->args.opcode = FUSE_INIT; in fuse_send_init()
1514 ia->args.in_numargs = 1; in fuse_send_init()
1515 ia->args.in_args[0].size = sizeof(ia->in); in fuse_send_init()
1516 ia->args.in_args[0].value = &ia->in; in fuse_send_init()
1517 ia->args.out_numargs = 1; in fuse_send_init()
1521 ia->args.out_argvar = true; in fuse_send_init()
1522 ia->args.out_args[0].size = sizeof(ia->out); in fuse_send_init()
1523 ia->args.out_args[0].value = &ia->out; in fuse_send_init()
1524 ia->args.force = true; in fuse_send_init()
1525 ia->args.nocreds = true; in fuse_send_init()
1526 ia->args.end = process_init_reply; in fuse_send_init()
1528 if (fuse_simple_background(fm, &ia->args, GFP_KERNEL) != 0) in fuse_send_init()
1529 process_init_reply(fm, &ia->args, -ENOTCONN); in fuse_send_init()
1535 WARN_ON(!list_empty(&fc->devices)); in fuse_free_conn()
1545 if (sb->s_bdev) { in fuse_bdi_init()
1546 suffix = "-fuseblk"; in fuse_bdi_init()
1548 * sb->s_bdi points to blkdev's bdi however we want to redirect in fuse_bdi_init()
1551 bdi_put(sb->s_bdi); in fuse_bdi_init()
1552 sb->s_bdi = &noop_backing_dev_info; in fuse_bdi_init()
1554 err = super_setup_bdi_name(sb, "%u:%u%s", MAJOR(fc->dev), in fuse_bdi_init()
1555 MINOR(fc->dev), suffix); in fuse_bdi_init()
1560 sb->s_bdi->capabilities &= ~BDI_CAP_WRITEBACK_ACCT; in fuse_bdi_init()
1561 sb->s_bdi->capabilities |= BDI_CAP_STRICTLIMIT; in fuse_bdi_init()
1575 bdi_set_max_ratio(sb->s_bdi, 1); in fuse_bdi_init()
1595 fud->pq.processing = pq; in fuse_dev_alloc()
1596 fuse_pqueue_init(&fud->pq); in fuse_dev_alloc()
1604 fud->fc = fuse_conn_get(fc); in fuse_dev_install()
1605 spin_lock(&fc->lock); in fuse_dev_install()
1606 list_add_tail(&fud->entry, &fc->devices); in fuse_dev_install()
1607 spin_unlock(&fc->lock); in fuse_dev_install()
1626 struct fuse_conn *fc = fud->fc; in fuse_dev_free()
1629 spin_lock(&fc->lock); in fuse_dev_free()
1630 list_del(&fud->entry); in fuse_dev_free()
1631 spin_unlock(&fc->lock); in fuse_dev_free()
1635 kfree(fud->pq.processing); in fuse_dev_free()
1643 struct timespec64 atime = inode_get_atime(&fi->inode); in fuse_fill_attr_from_inode()
1644 struct timespec64 mtime = inode_get_mtime(&fi->inode); in fuse_fill_attr_from_inode()
1645 struct timespec64 ctime = inode_get_ctime(&fi->inode); in fuse_fill_attr_from_inode()
1648 .ino = fi->inode.i_ino, in fuse_fill_attr_from_inode()
1649 .size = fi->inode.i_size, in fuse_fill_attr_from_inode()
1650 .blocks = fi->inode.i_blocks, in fuse_fill_attr_from_inode()
1657 .mode = fi->inode.i_mode, in fuse_fill_attr_from_inode()
1658 .nlink = fi->inode.i_nlink, in fuse_fill_attr_from_inode()
1659 .uid = __kuid_val(fi->inode.i_uid), in fuse_fill_attr_from_inode()
1660 .gid = __kgid_val(fi->inode.i_gid), in fuse_fill_attr_from_inode()
1661 .rdev = fi->inode.i_rdev, in fuse_fill_attr_from_inode()
1662 .blksize = 1u << fi->inode.i_blkbits, in fuse_fill_attr_from_inode()
1668 sb->s_magic = FUSE_SUPER_MAGIC; in fuse_sb_defaults()
1669 sb->s_op = &fuse_super_operations; in fuse_sb_defaults()
1670 sb->s_xattr = fuse_xattr_handlers; in fuse_sb_defaults()
1671 sb->s_maxbytes = MAX_LFS_FILESIZE; in fuse_sb_defaults()
1672 sb->s_time_gran = 1; in fuse_sb_defaults()
1673 sb->s_export_op = &fuse_export_operations; in fuse_sb_defaults()
1674 sb->s_iflags |= SB_I_IMA_UNVERIFIABLE_SIGNATURE; in fuse_sb_defaults()
1675 sb->s_iflags |= SB_I_NOIDMAP; in fuse_sb_defaults()
1676 if (sb->s_user_ns != &init_user_ns) in fuse_sb_defaults()
1677 sb->s_iflags |= SB_I_UNTRUSTED_MOUNTER; in fuse_sb_defaults()
1678 sb->s_flags &= ~(SB_NOSEC | SB_I_VERSION); in fuse_sb_defaults()
1685 struct super_block *parent_sb = parent_fi->inode.i_sb; in fuse_fill_super_submount()
1692 fm->sb = sb; in fuse_fill_super_submount()
1694 WARN_ON(sb->s_bdi != &noop_backing_dev_info); in fuse_fill_super_submount()
1695 sb->s_bdi = bdi_get(parent_sb->s_bdi); in fuse_fill_super_submount()
1697 sb->s_xattr = parent_sb->s_xattr; in fuse_fill_super_submount()
1698 sb->s_export_op = parent_sb->s_export_op; in fuse_fill_super_submount()
1699 sb->s_time_gran = parent_sb->s_time_gran; in fuse_fill_super_submount()
1700 sb->s_blocksize = parent_sb->s_blocksize; in fuse_fill_super_submount()
1701 sb->s_blocksize_bits = parent_sb->s_blocksize_bits; in fuse_fill_super_submount()
1702 sb->s_subtype = kstrdup(parent_sb->s_subtype, GFP_KERNEL); in fuse_fill_super_submount()
1703 if (parent_sb->s_subtype && !sb->s_subtype) in fuse_fill_super_submount()
1704 return -ENOMEM; in fuse_fill_super_submount()
1707 root = fuse_iget(sb, parent_fi->nodeid, 0, &root_attr, 0, 0, in fuse_fill_super_submount()
1708 fuse_get_evict_ctr(fm->fc)); in fuse_fill_super_submount()
1715 fi->nlookup--; in fuse_fill_super_submount()
1717 sb->s_d_op = &fuse_dentry_operations; in fuse_fill_super_submount()
1718 sb->s_root = d_make_root(root); in fuse_fill_super_submount()
1719 if (!sb->s_root) in fuse_fill_super_submount()
1720 return -ENOMEM; in fuse_fill_super_submount()
1728 sl = parent_fi->submount_lookup; in fuse_fill_super_submount()
1731 refcount_inc(&sl->count); in fuse_fill_super_submount()
1732 fi->submount_lookup = sl; in fuse_fill_super_submount()
1742 struct fuse_inode *mp_fi = fsc->fs_private; in fuse_get_tree_submount()
1743 struct fuse_conn *fc = get_fuse_conn(&mp_fi->inode); in fuse_get_tree_submount()
1749 return -ENOMEM; in fuse_get_tree_submount()
1751 fm->fc = fuse_conn_get(fc); in fuse_get_tree_submount()
1752 fsc->s_fs_info = fm; in fuse_get_tree_submount()
1754 if (fsc->s_fs_info) in fuse_get_tree_submount()
1766 down_write(&fc->killsb); in fuse_get_tree_submount()
1767 list_add_tail(&fm->fc_entry, &fc->mounts); in fuse_get_tree_submount()
1768 up_write(&fc->killsb); in fuse_get_tree_submount()
1770 sb->s_flags |= SB_ACTIVE; in fuse_get_tree_submount()
1771 fsc->root = dget(sb->s_root); in fuse_get_tree_submount()
1782 fsc->ops = &fuse_context_submount_ops; in fuse_init_fs_context_submount()
1791 struct fuse_conn *fc = fm->fc; in fuse_fill_super_common()
1796 err = -EINVAL; in fuse_fill_super_common()
1797 if (sb->s_flags & SB_MANDLOCK) in fuse_fill_super_common()
1800 rcu_assign_pointer(fc->curr_bucket, fuse_sync_bucket_alloc()); in fuse_fill_super_common()
1803 if (ctx->is_bdev) { in fuse_fill_super_common()
1805 err = -EINVAL; in fuse_fill_super_common()
1806 if (!sb_set_blocksize(sb, ctx->blksize)) in fuse_fill_super_common()
1810 sb->s_blocksize = PAGE_SIZE; in fuse_fill_super_common()
1811 sb->s_blocksize_bits = PAGE_SHIFT; in fuse_fill_super_common()
1814 sb->s_subtype = ctx->subtype; in fuse_fill_super_common()
1815 ctx->subtype = NULL; in fuse_fill_super_common()
1817 err = fuse_dax_conn_alloc(fc, ctx->dax_mode, ctx->dax_dev); in fuse_fill_super_common()
1822 if (ctx->fudptr) { in fuse_fill_super_common()
1823 err = -ENOMEM; in fuse_fill_super_common()
1829 fc->dev = sb->s_dev; in fuse_fill_super_common()
1830 fm->sb = sb; in fuse_fill_super_common()
1836 if (sb->s_flags & SB_POSIXACL) in fuse_fill_super_common()
1837 fc->dont_mask = 1; in fuse_fill_super_common()
1838 sb->s_flags |= SB_POSIXACL; in fuse_fill_super_common()
1840 fc->default_permissions = ctx->default_permissions; in fuse_fill_super_common()
1841 fc->allow_other = ctx->allow_other; in fuse_fill_super_common()
1842 fc->user_id = ctx->user_id; in fuse_fill_super_common()
1843 fc->group_id = ctx->group_id; in fuse_fill_super_common()
1844 fc->legacy_opts_show = ctx->legacy_opts_show; in fuse_fill_super_common()
1845 fc->max_read = max_t(unsigned int, 4096, ctx->max_read); in fuse_fill_super_common()
1846 fc->destroy = ctx->destroy; in fuse_fill_super_common()
1847 fc->no_control = ctx->no_control; in fuse_fill_super_common()
1848 fc->no_force_umount = ctx->no_force_umount; in fuse_fill_super_common()
1850 err = -ENOMEM; in fuse_fill_super_common()
1851 root = fuse_get_root_inode(sb, ctx->rootmode); in fuse_fill_super_common()
1852 sb->s_d_op = &fuse_root_dentry_operations; in fuse_fill_super_common()
1857 sb->s_d_op = &fuse_dentry_operations; in fuse_fill_super_common()
1860 err = -EINVAL; in fuse_fill_super_common()
1861 if (ctx->fudptr && *ctx->fudptr) in fuse_fill_super_common()
1868 list_add_tail(&fc->entry, &fuse_conn_list); in fuse_fill_super_common()
1869 sb->s_root = root_dentry; in fuse_fill_super_common()
1870 if (ctx->fudptr) in fuse_fill_super_common()
1871 *ctx->fudptr = fud; in fuse_fill_super_common()
1891 struct fuse_fs_context *ctx = fsc->fs_private; in fuse_fill_super()
1894 if (!ctx->file || !ctx->rootmode_present || in fuse_fill_super()
1895 !ctx->user_id_present || !ctx->group_id_present) in fuse_fill_super()
1896 return -EINVAL; in fuse_fill_super()
1902 if ((ctx->file->f_op != &fuse_dev_operations) || in fuse_fill_super()
1903 (ctx->file->f_cred->user_ns != sb->s_user_ns)) in fuse_fill_super()
1904 return -EINVAL; in fuse_fill_super()
1905 ctx->fudptr = &ctx->file->private_data; in fuse_fill_super()
1910 /* file->private_data shall be visible on all CPUs after this */ in fuse_fill_super()
1922 return -ENOTCONN; in fuse_set_no_super()
1928 return fsc->sget_key == get_fuse_conn_super(sb); in fuse_test_super()
1933 struct fuse_fs_context *ctx = fsc->fs_private; in fuse_get_tree()
1942 return -ENOMEM; in fuse_get_tree()
1947 return -ENOMEM; in fuse_get_tree()
1950 fuse_conn_init(fc, fm, fsc->user_ns, &fuse_dev_fiq_ops, NULL); in fuse_get_tree()
1951 fc->release = fuse_free_conn; in fuse_get_tree()
1953 fsc->s_fs_info = fm; in fuse_get_tree()
1955 if (ctx->fd_present) in fuse_get_tree()
1956 ctx->file = fget(ctx->fd); in fuse_get_tree()
1958 if (IS_ENABLED(CONFIG_BLOCK) && ctx->is_bdev) { in fuse_get_tree()
1966 err = -EINVAL; in fuse_get_tree()
1967 if (!ctx->file) in fuse_get_tree()
1974 fud = READ_ONCE(ctx->file->private_data); in fuse_get_tree()
1975 if (ctx->file->f_op == &fuse_dev_operations && fud) { in fuse_get_tree()
1976 fsc->sget_key = fud->fc; in fuse_get_tree()
1980 fsc->root = dget(sb->s_root); in fuse_get_tree()
1985 if (fsc->s_fs_info) in fuse_get_tree()
1987 if (ctx->file) in fuse_get_tree()
1988 fput(ctx->file); in fuse_get_tree()
2008 return -ENOMEM; in fuse_init_fs_context()
2010 ctx->max_read = ~0; in fuse_init_fs_context()
2011 ctx->blksize = FUSE_DEFAULT_BLKSIZE; in fuse_init_fs_context()
2012 ctx->legacy_opts_show = true; in fuse_init_fs_context()
2015 if (fsc->fs_type == &fuseblk_fs_type) { in fuse_init_fs_context()
2016 ctx->is_bdev = true; in fuse_init_fs_context()
2017 ctx->destroy = true; in fuse_init_fs_context()
2021 fsc->fs_private = ctx; in fuse_init_fs_context()
2022 fsc->ops = &fuse_context_ops; in fuse_init_fs_context()
2028 struct fuse_conn *fc = fm->fc; in fuse_mount_remove()
2031 down_write(&fc->killsb); in fuse_mount_remove()
2032 list_del_init(&fm->fc_entry); in fuse_mount_remove()
2033 if (list_empty(&fc->mounts)) in fuse_mount_remove()
2035 up_write(&fc->killsb); in fuse_mount_remove()
2043 struct fuse_conn *fc = fm->fc; in fuse_conn_destroy()
2045 if (fc->destroy) in fuse_conn_destroy()
2051 if (!list_empty(&fc->entry)) { in fuse_conn_destroy()
2053 list_del(&fc->entry); in fuse_conn_destroy()
2065 if (sb->s_root) { in fuse_sb_destroy()
2074 fuse_conn_put(fm->fc); in fuse_mount_destroy()
2149 err = -ENOMEM; in fuse_fs_init()
2199 err = -ENOMEM; in fuse_sysfs_init()