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()
98 if ((attr->ia_valid & ATTR_SIZE) && in spufs_setattr()
99 (attr->ia_size != inode->i_size)) in spufs_setattr()
100 return -EINVAL; in spufs_setattr()
109 const struct file_operations *fops, umode_t mode, in spufs_new_file() argument
118 ret = -ENOSPC; in spufs_new_file()
119 inode = spufs_new_inode(sb, S_IFREG | mode); in spufs_new_file()
124 inode->i_op = &spufs_file_iops; in spufs_new_file()
125 inode->i_fop = fops; in spufs_new_file()
126 inode->i_size = size; in spufs_new_file()
127 inode->i_private = SPUFS_I(inode)->i_ctx = get_spu_context(ctx); in spufs_new_file()
138 if (ei->i_ctx) in spufs_evict_inode()
139 put_spu_context(ei->i_ctx); in spufs_evict_inode()
140 if (ei->i_gang) in spufs_evict_inode()
141 put_spu_gang(ei->i_gang); in spufs_evict_inode()
149 list_for_each_entry_safe(dentry, tmp, &dir->d_subdirs, d_child) { in spufs_prune_dir()
150 spin_lock(&dentry->d_lock); in spufs_prune_dir()
154 spin_unlock(&dentry->d_lock); in spufs_prune_dir()
161 spin_unlock(&dentry->d_lock); in spufs_prune_dir()
168 /* Caller must hold parent->i_mutex */
177 spu_forget(SPUFS_I(d_inode(dir))->i_ctx); in spufs_rmdir()
182 const struct spufs_tree_descr *files, umode_t mode, in spufs_fill_dir() argument
185 while (files->name && files->name[0]) { in spufs_fill_dir()
187 struct dentry *dentry = d_alloc_name(dir, files->name); in spufs_fill_dir()
189 return -ENOMEM; in spufs_fill_dir()
190 ret = spufs_new_file(dir->d_sb, dentry, files->ops, in spufs_fill_dir()
191 files->mode & mode, files->size, ctx); in spufs_fill_dir()
205 dir = file->f_path.dentry; in spufs_dir_close()
206 parent = d_inode(dir->d_parent); in spufs_dir_close()
228 umode_t mode) in spufs_mkdir() argument
234 inode = spufs_new_inode(dir->i_sb, mode | S_IFDIR); in spufs_mkdir()
236 return -ENOSPC; in spufs_mkdir()
238 if (dir->i_mode & S_ISGID) { in spufs_mkdir()
239 inode->i_gid = dir->i_gid; in spufs_mkdir()
240 inode->i_mode &= S_ISGID; 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 if (dir->i_mode & S_ISGID) { in spufs_mkgang()
473 inode->i_gid = dir->i_gid; in spufs_mkgang()
474 inode->i_mode &= S_ISGID; in spufs_mkgang()
477 SPUFS_I(inode)->i_ctx = NULL; in spufs_mkgang()
478 SPUFS_I(inode)->i_gang = gang; in spufs_mkgang()
480 ret = -ENOMEM; in spufs_mkgang()
484 inode->i_op = &simple_dir_inode_operations; in spufs_mkgang()
485 inode->i_fop = &simple_dir_operations; in spufs_mkgang()
517 filp->f_op = &simple_dir_operations; in spufs_gang_open()
524 struct vfsmount *mnt, umode_t mode) in spufs_create_gang() argument
529 ret = spufs_mkgang(inode, dentry, mode & 0777); in spufs_create_gang()
544 unsigned int flags, umode_t mode, struct file *filp) in spufs_create() argument
546 struct inode *dir = d_inode(path->dentry); in spufs_create()
550 if (path->dentry->d_sb->s_type != &spufs_type) in spufs_create()
551 return -EINVAL; in spufs_create()
555 return -EINVAL; in spufs_create()
558 if (path->dentry != path->dentry->d_sb->s_root) in spufs_create()
559 if ((flags & SPU_CREATE_GANG) || !SPUFS_I(dir)->i_gang) in spufs_create()
560 return -EINVAL; in spufs_create()
562 mode &= ~current_umask(); in spufs_create()
565 ret = spufs_create_gang(dir, dentry, path->mnt, mode); in spufs_create()
567 ret = spufs_create_context(dir, dentry, path->mnt, flags, mode, in spufs_create()
579 umode_t mode; member
588 fsparam_u32oct ("mode", Opt_mode),
596 struct spufs_sb_info *sbi = spufs_get_sb_info(root->d_sb); in spufs_show_options()
597 struct inode *inode = root->d_inode; in spufs_show_options()
599 if (!uid_eq(inode->i_uid, GLOBAL_ROOT_UID)) in spufs_show_options()
601 from_kuid_munged(&init_user_ns, inode->i_uid)); in spufs_show_options()
602 if (!gid_eq(inode->i_gid, GLOBAL_ROOT_GID)) in spufs_show_options()
604 from_kgid_munged(&init_user_ns, inode->i_gid)); in spufs_show_options()
605 if ((inode->i_mode & S_IALLUGO) != 0775) in spufs_show_options()
606 seq_printf(m, ",mode=%o", inode->i_mode); in spufs_show_options()
607 if (sbi->debug) in spufs_show_options()
614 struct spufs_fs_context *ctx = fc->fs_private; in spufs_parse_param()
615 struct spufs_sb_info *sbi = fc->s_fs_info; in spufs_parse_param()
630 ctx->uid = uid; in spufs_parse_param()
636 ctx->gid = gid; in spufs_parse_param()
639 ctx->mode = result.uint_32 & S_IALLUGO; in spufs_parse_param()
642 sbi->debug = true; in spufs_parse_param()
659 const char *loader; in spufs_init_isolated_loader() local
662 dn = of_find_node_by_path("/spu-isolation"); in spufs_init_isolated_loader()
666 loader = of_get_property(dn, "loader", &size); in spufs_init_isolated_loader()
667 if (!loader) in spufs_init_isolated_loader()
670 /* the loader must be align on a 16 byte boundary */ in spufs_init_isolated_loader()
676 memcpy(isolated_loader, loader, size); in spufs_init_isolated_loader()
677 printk(KERN_INFO "spufs: SPU isolation mode enabled\n"); in spufs_init_isolated_loader()
682 struct spufs_fs_context *ctx = fc->fs_private; in spufs_create_root()
686 return -ENODEV; in spufs_create_root()
688 inode = spufs_new_inode(sb, S_IFDIR | ctx->mode); in spufs_create_root()
690 return -ENOMEM; in spufs_create_root()
692 inode->i_uid = ctx->uid; in spufs_create_root()
693 inode->i_gid = ctx->gid; in spufs_create_root()
694 inode->i_op = &simple_dir_inode_operations; in spufs_create_root()
695 inode->i_fop = &simple_dir_operations; in spufs_create_root()
696 SPUFS_I(inode)->i_ctx = NULL; in spufs_create_root()
699 sb->s_root = d_make_root(inode); in spufs_create_root()
700 if (!sb->s_root) in spufs_create_root()
701 return -ENOMEM; in spufs_create_root()
715 sb->s_maxbytes = MAX_LFS_FILESIZE; in spufs_fill_super()
716 sb->s_blocksize = PAGE_SIZE; in spufs_fill_super()
717 sb->s_blocksize_bits = PAGE_SHIFT; in spufs_fill_super()
718 sb->s_magic = SPUFS_MAGIC; in spufs_fill_super()
719 sb->s_op = &spufs_ops; in spufs_fill_super()
731 kfree(fc->s_fs_info); in spufs_free_fc()
753 ctx->uid = current_uid(); in spufs_init_fs_context()
754 ctx->gid = current_gid(); in spufs_init_fs_context()
755 ctx->mode = 0755; in spufs_init_fs_context()
757 fc->fs_private = ctx; in spufs_init_fs_context()
758 fc->s_fs_info = sbi; in spufs_init_fs_context()
759 fc->ops = &spufs_context_ops; in spufs_init_fs_context()
765 return -ENOMEM; in spufs_init_fs_context()
781 ret = -ENODEV; in spufs_init()
785 ret = -ENOMEM; in spufs_init()