Lines Matching +full:mode +full:- +full:loader

1 // SPDX-License-Identifier: GPL-2.0-or-later
16 #include <linux/backing-dev.h>
44 return sb->s_fs_info; in spufs_get_sb_info()
56 ei->i_gang = NULL; in spufs_alloc_inode()
57 ei->i_ctx = NULL; in spufs_alloc_inode()
58 ei->i_openers = 0; in spufs_alloc_inode()
60 return &ei->vfs_inode; in spufs_alloc_inode()
73 inode_init_once(&ei->vfs_inode); in spufs_init_once()
77 spufs_new_inode(struct super_block *sb, umode_t mode) in spufs_new_inode() argument
85 inode->i_ino = get_next_ino(); in spufs_new_inode()
86 inode->i_mode = mode; in spufs_new_inode()
87 inode->i_uid = current_fsuid(); in spufs_new_inode()
88 inode->i_gid = current_fsgid(); in spufs_new_inode()
100 if ((attr->ia_valid & ATTR_SIZE) && in spufs_setattr()
101 (attr->ia_size != inode->i_size)) in spufs_setattr()
102 return -EINVAL; in spufs_setattr()
111 const struct file_operations *fops, umode_t mode, in spufs_new_file() argument
120 ret = -ENOSPC; in spufs_new_file()
121 inode = spufs_new_inode(sb, S_IFREG | mode); in spufs_new_file()
126 inode->i_op = &spufs_file_iops; in spufs_new_file()
127 inode->i_fop = fops; in spufs_new_file()
128 inode->i_size = size; in spufs_new_file()
129 inode->i_private = SPUFS_I(inode)->i_ctx = get_spu_context(ctx); in spufs_new_file()
140 if (ei->i_ctx) in spufs_evict_inode()
141 put_spu_context(ei->i_ctx); in spufs_evict_inode()
142 if (ei->i_gang) in spufs_evict_inode()
143 put_spu_gang(ei->i_gang); in spufs_evict_inode()
152 hlist_for_each_entry_safe(dentry, n, &dir->d_children, d_sib) { in spufs_prune_dir()
153 spin_lock(&dentry->d_lock); in spufs_prune_dir()
157 spin_unlock(&dentry->d_lock); in spufs_prune_dir()
164 spin_unlock(&dentry->d_lock); in spufs_prune_dir()
171 /* Caller must hold parent->i_mutex */
180 spu_forget(SPUFS_I(d_inode(dir))->i_ctx); in spufs_rmdir()
185 const struct spufs_tree_descr *files, umode_t mode, in spufs_fill_dir() argument
188 while (files->name && files->name[0]) { in spufs_fill_dir()
190 struct dentry *dentry = d_alloc_name(dir, files->name); in spufs_fill_dir()
192 return -ENOMEM; in spufs_fill_dir()
193 ret = spufs_new_file(dir->d_sb, dentry, files->ops, in spufs_fill_dir()
194 files->mode & mode, files->size, ctx); in spufs_fill_dir()
208 dir = file->f_path.dentry; in spufs_dir_close()
209 parent = d_inode(dir->d_parent); in spufs_dir_close()
231 umode_t mode) in spufs_mkdir() argument
237 inode = spufs_new_inode(dir->i_sb, mode | S_IFDIR); in spufs_mkdir()
239 return -ENOSPC; in spufs_mkdir()
241 inode_init_owner(&nop_mnt_idmap, inode, dir, mode | S_IFDIR); in spufs_mkdir()
242 ctx = alloc_spu_context(SPUFS_I(dir)->i_gang); /* XXX gang */ in spufs_mkdir()
243 SPUFS_I(inode)->i_ctx = ctx; in spufs_mkdir()
246 return -ENOSPC; in spufs_mkdir()
249 ctx->flags = flags; in spufs_mkdir()
250 inode->i_op = &simple_dir_inode_operations; in spufs_mkdir()
251 inode->i_fop = &simple_dir_operations; in spufs_mkdir()
263 mode, ctx); in spufs_mkdir()
265 ret = spufs_fill_dir(dentry, spufs_dir_contents, mode, ctx); in spufs_mkdir()
267 if (!ret && spufs_get_sb_info(dir->i_sb)->debug) in spufs_mkdir()
269 mode, ctx); in spufs_mkdir()
294 filp->f_op = &spufs_context_fops; in spufs_context_open()
308 struct spu, cbe_list))->aff_list); in spufs_assert_affinity()
311 return ERR_PTR(-EINVAL); in spufs_assert_affinity()
314 return ERR_PTR(-EINVAL); in spufs_assert_affinity()
317 gang->aff_ref_ctx && in spufs_assert_affinity()
318 gang->aff_ref_ctx->flags & SPU_CREATE_AFFINITY_MEM) in spufs_assert_affinity()
319 return ERR_PTR(-EEXIST); in spufs_assert_affinity()
321 if (gang->aff_flags & AFF_MERGED) in spufs_assert_affinity()
322 return ERR_PTR(-EBUSY); in spufs_assert_affinity()
326 if (!filp || filp->f_op != &spufs_context_fops) in spufs_assert_affinity()
327 return ERR_PTR(-EINVAL); in spufs_assert_affinity()
330 SPUFS_I(file_inode(filp))->i_ctx); in spufs_assert_affinity()
332 if (!list_empty(&neighbor->aff_list) && !(neighbor->aff_head) && in spufs_assert_affinity()
333 !list_is_last(&neighbor->aff_list, &gang->aff_list_head) && in spufs_assert_affinity()
334 !list_entry(neighbor->aff_list.next, struct spu_context, in spufs_assert_affinity()
335 aff_list)->aff_head) { in spufs_assert_affinity()
336 err = ERR_PTR(-EEXIST); in spufs_assert_affinity()
340 if (gang != neighbor->gang) { in spufs_assert_affinity()
341 err = ERR_PTR(-EINVAL); in spufs_assert_affinity()
346 list_for_each_entry(tmp, &gang->aff_list_head, aff_list) in spufs_assert_affinity()
348 if (list_empty(&neighbor->aff_list)) in spufs_assert_affinity()
352 if ((cbe_spu_info[node].n_spus - atomic_read( in spufs_assert_affinity()
358 err = ERR_PTR(-EEXIST); in spufs_assert_affinity()
375 ctx->gang->aff_ref_ctx = ctx; in spufs_set_affinity()
378 if (list_empty(&neighbor->aff_list)) { in spufs_set_affinity()
379 list_add_tail(&neighbor->aff_list, in spufs_set_affinity()
380 &ctx->gang->aff_list_head); in spufs_set_affinity()
381 neighbor->aff_head = 1; in spufs_set_affinity()
384 if (list_is_last(&neighbor->aff_list, &ctx->gang->aff_list_head) in spufs_set_affinity()
385 || list_entry(neighbor->aff_list.next, struct spu_context, in spufs_set_affinity()
386 aff_list)->aff_head) { in spufs_set_affinity()
387 list_add(&ctx->aff_list, &neighbor->aff_list); in spufs_set_affinity()
389 list_add_tail(&ctx->aff_list, &neighbor->aff_list); in spufs_set_affinity()
390 if (neighbor->aff_head) { in spufs_set_affinity()
391 neighbor->aff_head = 0; in spufs_set_affinity()
392 ctx->aff_head = 1; in spufs_set_affinity()
396 if (!ctx->gang->aff_ref_ctx) in spufs_set_affinity()
397 ctx->gang->aff_ref_ctx = ctx; in spufs_set_affinity()
403 struct vfsmount *mnt, int flags, umode_t mode, in spufs_create_context() argument
414 return -EPERM; in spufs_create_context()
418 return -EINVAL; in spufs_create_context()
421 return -ENODEV; in spufs_create_context()
427 gang = SPUFS_I(inode)->i_gang; in spufs_create_context()
429 return -EINVAL; in spufs_create_context()
430 mutex_lock(&gang->aff_mutex); in spufs_create_context()
438 ret = spufs_mkdir(inode, dentry, flags, mode & 0777); in spufs_create_context()
443 spufs_set_affinity(flags, SPUFS_I(d_inode(dentry))->i_ctx, in spufs_create_context()
455 mutex_unlock(&gang->aff_mutex); in spufs_create_context()
460 spufs_mkgang(struct inode *dir, struct dentry *dentry, umode_t mode) in spufs_mkgang() argument
466 ret = -ENOSPC; in spufs_mkgang()
467 inode = spufs_new_inode(dir->i_sb, mode | S_IFDIR); in spufs_mkgang()
472 inode_init_owner(&nop_mnt_idmap, inode, dir, mode | S_IFDIR); in spufs_mkgang()
474 SPUFS_I(inode)->i_ctx = NULL; in spufs_mkgang()
475 SPUFS_I(inode)->i_gang = gang; in spufs_mkgang()
477 ret = -ENOMEM; in spufs_mkgang()
481 inode->i_op = &simple_dir_inode_operations; in spufs_mkgang()
482 inode->i_fop = &simple_dir_operations; in spufs_mkgang()
514 filp->f_op = &simple_dir_operations; in spufs_gang_open()
521 struct vfsmount *mnt, umode_t mode) in spufs_create_gang() argument
526 ret = spufs_mkgang(inode, dentry, mode & 0777); in spufs_create_gang()
541 unsigned int flags, umode_t mode, struct file *filp) in spufs_create() argument
543 struct inode *dir = d_inode(path->dentry); in spufs_create()
547 if (path->dentry->d_sb->s_type != &spufs_type) in spufs_create()
548 return -EINVAL; in spufs_create()
552 return -EINVAL; in spufs_create()
555 if (path->dentry != path->dentry->d_sb->s_root) in spufs_create()
556 if ((flags & SPU_CREATE_GANG) || !SPUFS_I(dir)->i_gang) in spufs_create()
557 return -EINVAL; in spufs_create()
559 mode &= ~current_umask(); in spufs_create()
562 ret = spufs_create_gang(dir, dentry, path->mnt, mode); in spufs_create()
564 ret = spufs_create_context(dir, dentry, path->mnt, flags, mode, in spufs_create()
576 umode_t mode; member
585 fsparam_u32oct ("mode", Opt_mode),
593 struct spufs_sb_info *sbi = spufs_get_sb_info(root->d_sb); in spufs_show_options()
594 struct inode *inode = root->d_inode; in spufs_show_options()
596 if (!uid_eq(inode->i_uid, GLOBAL_ROOT_UID)) in spufs_show_options()
598 from_kuid_munged(&init_user_ns, inode->i_uid)); in spufs_show_options()
599 if (!gid_eq(inode->i_gid, GLOBAL_ROOT_GID)) in spufs_show_options()
601 from_kgid_munged(&init_user_ns, inode->i_gid)); in spufs_show_options()
602 if ((inode->i_mode & S_IALLUGO) != 0775) in spufs_show_options()
603 seq_printf(m, ",mode=%o", inode->i_mode); in spufs_show_options()
604 if (sbi->debug) in spufs_show_options()
611 struct spufs_fs_context *ctx = fc->fs_private; in spufs_parse_param()
612 struct spufs_sb_info *sbi = fc->s_fs_info; in spufs_parse_param()
627 ctx->uid = uid; in spufs_parse_param()
633 ctx->gid = gid; in spufs_parse_param()
636 ctx->mode = result.uint_32 & S_IALLUGO; in spufs_parse_param()
639 sbi->debug = true; in spufs_parse_param()
656 const char *loader; in spufs_init_isolated_loader() local
659 dn = of_find_node_by_path("/spu-isolation"); in spufs_init_isolated_loader()
663 loader = of_get_property(dn, "loader", &size); in spufs_init_isolated_loader()
665 if (!loader) in spufs_init_isolated_loader()
668 /* the loader must be align on a 16 byte boundary */ in spufs_init_isolated_loader()
674 memcpy(isolated_loader, loader, size); in spufs_init_isolated_loader()
675 printk(KERN_INFO "spufs: SPU isolation mode enabled\n"); in spufs_init_isolated_loader()
680 struct spufs_fs_context *ctx = fc->fs_private; in spufs_create_root()
684 return -ENODEV; in spufs_create_root()
686 inode = spufs_new_inode(sb, S_IFDIR | ctx->mode); in spufs_create_root()
688 return -ENOMEM; in spufs_create_root()
690 inode->i_uid = ctx->uid; in spufs_create_root()
691 inode->i_gid = ctx->gid; in spufs_create_root()
692 inode->i_op = &simple_dir_inode_operations; in spufs_create_root()
693 inode->i_fop = &simple_dir_operations; in spufs_create_root()
694 SPUFS_I(inode)->i_ctx = NULL; in spufs_create_root()
697 sb->s_root = d_make_root(inode); in spufs_create_root()
698 if (!sb->s_root) in spufs_create_root()
699 return -ENOMEM; in spufs_create_root()
713 sb->s_maxbytes = MAX_LFS_FILESIZE; in spufs_fill_super()
714 sb->s_blocksize = PAGE_SIZE; in spufs_fill_super()
715 sb->s_blocksize_bits = PAGE_SHIFT; in spufs_fill_super()
716 sb->s_magic = SPUFS_MAGIC; in spufs_fill_super()
717 sb->s_op = &spufs_ops; in spufs_fill_super()
729 kfree(fc->s_fs_info); in spufs_free_fc()
751 ctx->uid = current_uid(); in spufs_init_fs_context()
752 ctx->gid = current_gid(); in spufs_init_fs_context()
753 ctx->mode = 0755; in spufs_init_fs_context()
755 fc->fs_private = ctx; in spufs_init_fs_context()
756 fc->s_fs_info = sbi; in spufs_init_fs_context()
757 fc->ops = &spufs_context_ops; in spufs_init_fs_context()
763 return -ENOMEM; in spufs_init_fs_context()
779 ret = -ENODEV; in spufs_init()
783 ret = -ENOMEM; in spufs_init()