Lines Matching +full:mode +full:- +full:loader
1 // SPDX-License-Identifier: GPL-2.0-or-later
16 #include <linux/backing-dev.h>
43 return sb->s_fs_info; in spufs_get_sb_info()
55 ei->i_gang = NULL; in spufs_alloc_inode()
56 ei->i_ctx = NULL; in spufs_alloc_inode()
57 ei->i_openers = 0; in spufs_alloc_inode()
59 return &ei->vfs_inode; in spufs_alloc_inode()
72 inode_init_once(&ei->vfs_inode); in spufs_init_once()
76 spufs_new_inode(struct super_block *sb, umode_t mode) in spufs_new_inode() argument
84 inode->i_ino = get_next_ino(); in spufs_new_inode()
85 inode->i_mode = mode; in spufs_new_inode()
86 inode->i_uid = current_fsuid(); in spufs_new_inode()
87 inode->i_gid = current_fsgid(); in spufs_new_inode()
88 inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode); in spufs_new_inode()
99 if ((attr->ia_valid & ATTR_SIZE) && in spufs_setattr()
100 (attr->ia_size != inode->i_size)) in spufs_setattr()
101 return -EINVAL; in spufs_setattr()
110 const struct file_operations *fops, umode_t mode, in spufs_new_file() argument
119 ret = -ENOSPC; in spufs_new_file()
120 inode = spufs_new_inode(sb, S_IFREG | mode); in spufs_new_file()
125 inode->i_op = &spufs_file_iops; in spufs_new_file()
126 inode->i_fop = fops; in spufs_new_file()
127 inode->i_size = size; in spufs_new_file()
128 inode->i_private = SPUFS_I(inode)->i_ctx = get_spu_context(ctx); in spufs_new_file()
139 if (ei->i_ctx) in spufs_evict_inode()
140 put_spu_context(ei->i_ctx); in spufs_evict_inode()
141 if (ei->i_gang) in spufs_evict_inode()
142 put_spu_gang(ei->i_gang); in spufs_evict_inode()
150 list_for_each_entry_safe(dentry, tmp, &dir->d_subdirs, d_child) { in spufs_prune_dir()
151 spin_lock(&dentry->d_lock); in spufs_prune_dir()
155 spin_unlock(&dentry->d_lock); in spufs_prune_dir()
162 spin_unlock(&dentry->d_lock); in spufs_prune_dir()
169 /* Caller must hold parent->i_mutex */
178 spu_forget(SPUFS_I(d_inode(dir))->i_ctx); in spufs_rmdir()
183 const struct spufs_tree_descr *files, umode_t mode, in spufs_fill_dir() argument
186 while (files->name && files->name[0]) { in spufs_fill_dir()
188 struct dentry *dentry = d_alloc_name(dir, files->name); in spufs_fill_dir()
190 return -ENOMEM; in spufs_fill_dir()
191 ret = spufs_new_file(dir->d_sb, dentry, files->ops, in spufs_fill_dir()
192 files->mode & mode, files->size, ctx); in spufs_fill_dir()
206 dir = file->f_path.dentry; in spufs_dir_close()
207 parent = d_inode(dir->d_parent); in spufs_dir_close()
229 umode_t mode) in spufs_mkdir() argument
235 inode = spufs_new_inode(dir->i_sb, mode | S_IFDIR); in spufs_mkdir()
237 return -ENOSPC; in spufs_mkdir()
239 inode_init_owner(&init_user_ns, inode, dir, mode | S_IFDIR); in spufs_mkdir()
240 ctx = alloc_spu_context(SPUFS_I(dir)->i_gang); /* XXX gang */ in spufs_mkdir()
241 SPUFS_I(inode)->i_ctx = ctx; in spufs_mkdir()
244 return -ENOSPC; in spufs_mkdir()
247 ctx->flags = flags; in spufs_mkdir()
248 inode->i_op = &simple_dir_inode_operations; in spufs_mkdir()
249 inode->i_fop = &simple_dir_operations; in spufs_mkdir()
261 mode, ctx); in spufs_mkdir()
263 ret = spufs_fill_dir(dentry, spufs_dir_contents, mode, ctx); in spufs_mkdir()
265 if (!ret && spufs_get_sb_info(dir->i_sb)->debug) in spufs_mkdir()
267 mode, ctx); in spufs_mkdir()
292 filp->f_op = &spufs_context_fops; in spufs_context_open()
306 struct spu, cbe_list))->aff_list); in spufs_assert_affinity()
309 return ERR_PTR(-EINVAL); in spufs_assert_affinity()
312 return ERR_PTR(-EINVAL); in spufs_assert_affinity()
315 gang->aff_ref_ctx && in spufs_assert_affinity()
316 gang->aff_ref_ctx->flags & SPU_CREATE_AFFINITY_MEM) in spufs_assert_affinity()
317 return ERR_PTR(-EEXIST); in spufs_assert_affinity()
319 if (gang->aff_flags & AFF_MERGED) in spufs_assert_affinity()
320 return ERR_PTR(-EBUSY); in spufs_assert_affinity()
324 if (!filp || filp->f_op != &spufs_context_fops) in spufs_assert_affinity()
325 return ERR_PTR(-EINVAL); in spufs_assert_affinity()
328 SPUFS_I(file_inode(filp))->i_ctx); in spufs_assert_affinity()
330 if (!list_empty(&neighbor->aff_list) && !(neighbor->aff_head) && in spufs_assert_affinity()
331 !list_is_last(&neighbor->aff_list, &gang->aff_list_head) && in spufs_assert_affinity()
332 !list_entry(neighbor->aff_list.next, struct spu_context, in spufs_assert_affinity()
333 aff_list)->aff_head) { in spufs_assert_affinity()
334 err = ERR_PTR(-EEXIST); in spufs_assert_affinity()
338 if (gang != neighbor->gang) { in spufs_assert_affinity()
339 err = ERR_PTR(-EINVAL); in spufs_assert_affinity()
344 list_for_each_entry(tmp, &gang->aff_list_head, aff_list) in spufs_assert_affinity()
346 if (list_empty(&neighbor->aff_list)) in spufs_assert_affinity()
350 if ((cbe_spu_info[node].n_spus - atomic_read( in spufs_assert_affinity()
356 err = ERR_PTR(-EEXIST); in spufs_assert_affinity()
373 ctx->gang->aff_ref_ctx = ctx; in spufs_set_affinity()
376 if (list_empty(&neighbor->aff_list)) { in spufs_set_affinity()
377 list_add_tail(&neighbor->aff_list, in spufs_set_affinity()
378 &ctx->gang->aff_list_head); in spufs_set_affinity()
379 neighbor->aff_head = 1; in spufs_set_affinity()
382 if (list_is_last(&neighbor->aff_list, &ctx->gang->aff_list_head) in spufs_set_affinity()
383 || list_entry(neighbor->aff_list.next, struct spu_context, in spufs_set_affinity()
384 aff_list)->aff_head) { in spufs_set_affinity()
385 list_add(&ctx->aff_list, &neighbor->aff_list); in spufs_set_affinity()
387 list_add_tail(&ctx->aff_list, &neighbor->aff_list); in spufs_set_affinity()
388 if (neighbor->aff_head) { in spufs_set_affinity()
389 neighbor->aff_head = 0; in spufs_set_affinity()
390 ctx->aff_head = 1; in spufs_set_affinity()
394 if (!ctx->gang->aff_ref_ctx) in spufs_set_affinity()
395 ctx->gang->aff_ref_ctx = ctx; in spufs_set_affinity()
401 struct vfsmount *mnt, int flags, umode_t mode, in spufs_create_context() argument
412 return -EPERM; in spufs_create_context()
416 return -EINVAL; in spufs_create_context()
419 return -ENODEV; in spufs_create_context()
425 gang = SPUFS_I(inode)->i_gang; in spufs_create_context()
427 return -EINVAL; in spufs_create_context()
428 mutex_lock(&gang->aff_mutex); in spufs_create_context()
436 ret = spufs_mkdir(inode, dentry, flags, mode & 0777); in spufs_create_context()
441 spufs_set_affinity(flags, SPUFS_I(d_inode(dentry))->i_ctx, in spufs_create_context()
453 mutex_unlock(&gang->aff_mutex); in spufs_create_context()
458 spufs_mkgang(struct inode *dir, struct dentry *dentry, umode_t mode) in spufs_mkgang() argument
464 ret = -ENOSPC; in spufs_mkgang()
465 inode = spufs_new_inode(dir->i_sb, mode | S_IFDIR); in spufs_mkgang()
470 inode_init_owner(&init_user_ns, inode, dir, mode | S_IFDIR); in spufs_mkgang()
472 SPUFS_I(inode)->i_ctx = NULL; in spufs_mkgang()
473 SPUFS_I(inode)->i_gang = gang; in spufs_mkgang()
475 ret = -ENOMEM; in spufs_mkgang()
479 inode->i_op = &simple_dir_inode_operations; in spufs_mkgang()
480 inode->i_fop = &simple_dir_operations; in spufs_mkgang()
512 filp->f_op = &simple_dir_operations; in spufs_gang_open()
519 struct vfsmount *mnt, umode_t mode) in spufs_create_gang() argument
524 ret = spufs_mkgang(inode, dentry, mode & 0777); in spufs_create_gang()
539 unsigned int flags, umode_t mode, struct file *filp) in spufs_create() argument
541 struct inode *dir = d_inode(path->dentry); in spufs_create()
545 if (path->dentry->d_sb->s_type != &spufs_type) in spufs_create()
546 return -EINVAL; in spufs_create()
550 return -EINVAL; in spufs_create()
553 if (path->dentry != path->dentry->d_sb->s_root) in spufs_create()
554 if ((flags & SPU_CREATE_GANG) || !SPUFS_I(dir)->i_gang) in spufs_create()
555 return -EINVAL; in spufs_create()
557 mode &= ~current_umask(); in spufs_create()
560 ret = spufs_create_gang(dir, dentry, path->mnt, mode); in spufs_create()
562 ret = spufs_create_context(dir, dentry, path->mnt, flags, mode, in spufs_create()
574 umode_t mode; member
583 fsparam_u32oct ("mode", Opt_mode),
591 struct spufs_sb_info *sbi = spufs_get_sb_info(root->d_sb); in spufs_show_options()
592 struct inode *inode = root->d_inode; in spufs_show_options()
594 if (!uid_eq(inode->i_uid, GLOBAL_ROOT_UID)) in spufs_show_options()
596 from_kuid_munged(&init_user_ns, inode->i_uid)); in spufs_show_options()
597 if (!gid_eq(inode->i_gid, GLOBAL_ROOT_GID)) in spufs_show_options()
599 from_kgid_munged(&init_user_ns, inode->i_gid)); in spufs_show_options()
600 if ((inode->i_mode & S_IALLUGO) != 0775) in spufs_show_options()
601 seq_printf(m, ",mode=%o", inode->i_mode); in spufs_show_options()
602 if (sbi->debug) in spufs_show_options()
609 struct spufs_fs_context *ctx = fc->fs_private; in spufs_parse_param()
610 struct spufs_sb_info *sbi = fc->s_fs_info; in spufs_parse_param()
625 ctx->uid = uid; in spufs_parse_param()
631 ctx->gid = gid; in spufs_parse_param()
634 ctx->mode = result.uint_32 & S_IALLUGO; in spufs_parse_param()
637 sbi->debug = true; in spufs_parse_param()
654 const char *loader; in spufs_init_isolated_loader() local
657 dn = of_find_node_by_path("/spu-isolation"); in spufs_init_isolated_loader()
661 loader = of_get_property(dn, "loader", &size); in spufs_init_isolated_loader()
662 if (!loader) in spufs_init_isolated_loader()
665 /* the loader must be align on a 16 byte boundary */ in spufs_init_isolated_loader()
671 memcpy(isolated_loader, loader, size); in spufs_init_isolated_loader()
672 printk(KERN_INFO "spufs: SPU isolation mode enabled\n"); in spufs_init_isolated_loader()
677 struct spufs_fs_context *ctx = fc->fs_private; in spufs_create_root()
681 return -ENODEV; in spufs_create_root()
683 inode = spufs_new_inode(sb, S_IFDIR | ctx->mode); in spufs_create_root()
685 return -ENOMEM; in spufs_create_root()
687 inode->i_uid = ctx->uid; in spufs_create_root()
688 inode->i_gid = ctx->gid; in spufs_create_root()
689 inode->i_op = &simple_dir_inode_operations; in spufs_create_root()
690 inode->i_fop = &simple_dir_operations; in spufs_create_root()
691 SPUFS_I(inode)->i_ctx = NULL; in spufs_create_root()
694 sb->s_root = d_make_root(inode); in spufs_create_root()
695 if (!sb->s_root) in spufs_create_root()
696 return -ENOMEM; in spufs_create_root()
710 sb->s_maxbytes = MAX_LFS_FILESIZE; in spufs_fill_super()
711 sb->s_blocksize = PAGE_SIZE; in spufs_fill_super()
712 sb->s_blocksize_bits = PAGE_SHIFT; in spufs_fill_super()
713 sb->s_magic = SPUFS_MAGIC; in spufs_fill_super()
714 sb->s_op = &spufs_ops; in spufs_fill_super()
726 kfree(fc->s_fs_info); in spufs_free_fc()
748 ctx->uid = current_uid(); in spufs_init_fs_context()
749 ctx->gid = current_gid(); in spufs_init_fs_context()
750 ctx->mode = 0755; in spufs_init_fs_context()
752 fc->fs_private = ctx; in spufs_init_fs_context()
753 fc->s_fs_info = sbi; in spufs_init_fs_context()
754 fc->ops = &spufs_context_ops; in spufs_init_fs_context()
760 return -ENOMEM; in spufs_init_fs_context()
776 ret = -ENODEV; in spufs_init()
780 ret = -ENOMEM; in spufs_init()