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()
206 struct inode *inode = dir->d_inode; in unuse_gang()
207 struct spu_gang *gang = SPUFS_I(inode)->i_gang; in unuse_gang()
213 dead = !--gang->alive; in unuse_gang()
227 dir = file->f_path.dentry; in spufs_dir_close()
228 parent = d_inode(dir->d_parent); in spufs_dir_close()
235 unuse_gang(dir->d_parent); in spufs_dir_close()
251 umode_t mode) in spufs_mkdir() argument
257 inode = spufs_new_inode(dir->i_sb, mode | S_IFDIR); in spufs_mkdir()
259 return -ENOSPC; in spufs_mkdir()
261 inode_init_owner(&nop_mnt_idmap, inode, dir, mode | S_IFDIR); in spufs_mkdir()
262 ctx = alloc_spu_context(SPUFS_I(dir)->i_gang); /* XXX gang */ in spufs_mkdir()
263 SPUFS_I(inode)->i_ctx = ctx; in spufs_mkdir()
266 return -ENOSPC; in spufs_mkdir()
269 ctx->flags = flags; in spufs_mkdir()
270 inode->i_op = &simple_dir_inode_operations; in spufs_mkdir()
271 inode->i_fop = &simple_dir_operations; in spufs_mkdir()
283 mode, ctx); in spufs_mkdir()
285 ret = spufs_fill_dir(dentry, spufs_dir_contents, mode, ctx); in spufs_mkdir()
287 if (!ret && spufs_get_sb_info(dir->i_sb)->debug) in spufs_mkdir()
289 mode, ctx); in spufs_mkdir()
314 filp->f_op = &spufs_context_fops; in spufs_context_open()
328 struct spu, cbe_list))->aff_list); in spufs_assert_affinity()
331 return ERR_PTR(-EINVAL); in spufs_assert_affinity()
334 return ERR_PTR(-EINVAL); in spufs_assert_affinity()
337 gang->aff_ref_ctx && in spufs_assert_affinity()
338 gang->aff_ref_ctx->flags & SPU_CREATE_AFFINITY_MEM) in spufs_assert_affinity()
339 return ERR_PTR(-EEXIST); in spufs_assert_affinity()
341 if (gang->aff_flags & AFF_MERGED) in spufs_assert_affinity()
342 return ERR_PTR(-EBUSY); in spufs_assert_affinity()
346 if (!filp || filp->f_op != &spufs_context_fops) in spufs_assert_affinity()
347 return ERR_PTR(-EINVAL); in spufs_assert_affinity()
350 SPUFS_I(file_inode(filp))->i_ctx); in spufs_assert_affinity()
352 if (!list_empty(&neighbor->aff_list) && !(neighbor->aff_head) && in spufs_assert_affinity()
353 !list_is_last(&neighbor->aff_list, &gang->aff_list_head) && in spufs_assert_affinity()
354 !list_entry(neighbor->aff_list.next, struct spu_context, in spufs_assert_affinity()
355 aff_list)->aff_head) { in spufs_assert_affinity()
356 err = ERR_PTR(-EEXIST); in spufs_assert_affinity()
360 if (gang != neighbor->gang) { in spufs_assert_affinity()
361 err = ERR_PTR(-EINVAL); in spufs_assert_affinity()
366 list_for_each_entry(tmp, &gang->aff_list_head, aff_list) in spufs_assert_affinity()
368 if (list_empty(&neighbor->aff_list)) in spufs_assert_affinity()
372 if ((cbe_spu_info[node].n_spus - atomic_read( in spufs_assert_affinity()
378 err = ERR_PTR(-EEXIST); in spufs_assert_affinity()
395 ctx->gang->aff_ref_ctx = ctx; in spufs_set_affinity()
398 if (list_empty(&neighbor->aff_list)) { in spufs_set_affinity()
399 list_add_tail(&neighbor->aff_list, in spufs_set_affinity()
400 &ctx->gang->aff_list_head); in spufs_set_affinity()
401 neighbor->aff_head = 1; in spufs_set_affinity()
404 if (list_is_last(&neighbor->aff_list, &ctx->gang->aff_list_head) in spufs_set_affinity()
405 || list_entry(neighbor->aff_list.next, struct spu_context, in spufs_set_affinity()
406 aff_list)->aff_head) { in spufs_set_affinity()
407 list_add(&ctx->aff_list, &neighbor->aff_list); in spufs_set_affinity()
409 list_add_tail(&ctx->aff_list, &neighbor->aff_list); in spufs_set_affinity()
410 if (neighbor->aff_head) { in spufs_set_affinity()
411 neighbor->aff_head = 0; in spufs_set_affinity()
412 ctx->aff_head = 1; in spufs_set_affinity()
416 if (!ctx->gang->aff_ref_ctx) in spufs_set_affinity()
417 ctx->gang->aff_ref_ctx = ctx; in spufs_set_affinity()
423 struct vfsmount *mnt, int flags, umode_t mode, in spufs_create_context() argument
428 struct spu_gang *gang = SPUFS_I(inode)->i_gang; in spufs_create_context()
434 return -EPERM; in spufs_create_context()
438 return -EINVAL; in spufs_create_context()
441 return -ENODEV; in spufs_create_context()
444 if (!gang->alive) in spufs_create_context()
445 return -ENOENT; in spufs_create_context()
446 gang->alive++; in spufs_create_context()
453 return -EINVAL; in spufs_create_context()
454 mutex_lock(&gang->aff_mutex); in spufs_create_context()
462 ret = spufs_mkdir(inode, dentry, flags, mode & 0777); in spufs_create_context()
470 spufs_set_affinity(flags, SPUFS_I(d_inode(dentry))->i_ctx, in spufs_create_context()
482 mutex_unlock(&gang->aff_mutex); in spufs_create_context()
484 gang->alive--; // can't reach 0 in spufs_create_context()
489 spufs_mkgang(struct inode *dir, struct dentry *dentry, umode_t mode) in spufs_mkgang() argument
495 ret = -ENOSPC; in spufs_mkgang()
496 inode = spufs_new_inode(dir->i_sb, mode | S_IFDIR); in spufs_mkgang()
501 inode_init_owner(&nop_mnt_idmap, inode, dir, mode | S_IFDIR); in spufs_mkgang()
503 SPUFS_I(inode)->i_ctx = NULL; in spufs_mkgang()
504 SPUFS_I(inode)->i_gang = gang; in spufs_mkgang()
506 ret = -ENOMEM; in spufs_mkgang()
510 inode->i_op = &simple_dir_inode_operations; in spufs_mkgang()
511 inode->i_fop = &simple_dir_operations; in spufs_mkgang()
527 unuse_gang(file->f_path.dentry); in spufs_gang_close()
559 filp->f_op = &spufs_gang_fops; in spufs_gang_open()
566 struct vfsmount *mnt, umode_t mode) in spufs_create_gang() argument
571 ret = spufs_mkgang(inode, dentry, mode & 0777); in spufs_create_gang()
584 unsigned int flags, umode_t mode, struct file *filp) in spufs_create() argument
586 struct inode *dir = d_inode(path->dentry); in spufs_create()
590 if (path->dentry->d_sb->s_type != &spufs_type) in spufs_create()
591 return -EINVAL; in spufs_create()
595 return -EINVAL; in spufs_create()
598 if (path->dentry != path->dentry->d_sb->s_root) in spufs_create()
599 if ((flags & SPU_CREATE_GANG) || !SPUFS_I(dir)->i_gang) in spufs_create()
600 return -EINVAL; in spufs_create()
602 mode &= ~current_umask(); in spufs_create()
605 ret = spufs_create_gang(dir, dentry, path->mnt, mode); in spufs_create()
607 ret = spufs_create_context(dir, dentry, path->mnt, flags, mode, in spufs_create()
619 umode_t mode; member
628 fsparam_u32oct ("mode", Opt_mode),
636 struct spufs_sb_info *sbi = spufs_get_sb_info(root->d_sb); in spufs_show_options()
637 struct inode *inode = root->d_inode; in spufs_show_options()
639 if (!uid_eq(inode->i_uid, GLOBAL_ROOT_UID)) in spufs_show_options()
641 from_kuid_munged(&init_user_ns, inode->i_uid)); in spufs_show_options()
642 if (!gid_eq(inode->i_gid, GLOBAL_ROOT_GID)) in spufs_show_options()
644 from_kgid_munged(&init_user_ns, inode->i_gid)); in spufs_show_options()
645 if ((inode->i_mode & S_IALLUGO) != 0775) in spufs_show_options()
646 seq_printf(m, ",mode=%o", inode->i_mode); in spufs_show_options()
647 if (sbi->debug) in spufs_show_options()
654 struct spufs_fs_context *ctx = fc->fs_private; in spufs_parse_param()
655 struct spufs_sb_info *sbi = fc->s_fs_info; in spufs_parse_param()
670 ctx->uid = uid; in spufs_parse_param()
676 ctx->gid = gid; in spufs_parse_param()
679 ctx->mode = result.uint_32 & S_IALLUGO; in spufs_parse_param()
682 sbi->debug = true; in spufs_parse_param()
699 const char *loader; in spufs_init_isolated_loader() local
702 dn = of_find_node_by_path("/spu-isolation"); in spufs_init_isolated_loader()
706 loader = of_get_property(dn, "loader", &size); in spufs_init_isolated_loader()
708 if (!loader) in spufs_init_isolated_loader()
711 /* the loader must be align on a 16 byte boundary */ in spufs_init_isolated_loader()
717 memcpy(isolated_loader, loader, size); in spufs_init_isolated_loader()
718 printk(KERN_INFO "spufs: SPU isolation mode enabled\n"); in spufs_init_isolated_loader()
723 struct spufs_fs_context *ctx = fc->fs_private; in spufs_create_root()
727 return -ENODEV; in spufs_create_root()
729 inode = spufs_new_inode(sb, S_IFDIR | ctx->mode); in spufs_create_root()
731 return -ENOMEM; in spufs_create_root()
733 inode->i_uid = ctx->uid; in spufs_create_root()
734 inode->i_gid = ctx->gid; in spufs_create_root()
735 inode->i_op = &simple_dir_inode_operations; in spufs_create_root()
736 inode->i_fop = &simple_dir_operations; in spufs_create_root()
737 SPUFS_I(inode)->i_ctx = NULL; in spufs_create_root()
740 sb->s_root = d_make_root(inode); in spufs_create_root()
741 if (!sb->s_root) in spufs_create_root()
742 return -ENOMEM; in spufs_create_root()
756 sb->s_maxbytes = MAX_LFS_FILESIZE; in spufs_fill_super()
757 sb->s_blocksize = PAGE_SIZE; in spufs_fill_super()
758 sb->s_blocksize_bits = PAGE_SHIFT; in spufs_fill_super()
759 sb->s_magic = SPUFS_MAGIC; in spufs_fill_super()
760 sb->s_op = &spufs_ops; in spufs_fill_super()
772 kfree(fc->s_fs_info); in spufs_free_fc()
794 ctx->uid = current_uid(); in spufs_init_fs_context()
795 ctx->gid = current_gid(); in spufs_init_fs_context()
796 ctx->mode = 0755; in spufs_init_fs_context()
798 fc->fs_private = ctx; in spufs_init_fs_context()
799 fc->s_fs_info = sbi; in spufs_init_fs_context()
800 fc->ops = &spufs_context_ops; in spufs_init_fs_context()
806 return -ENOMEM; in spufs_init_fs_context()
822 ret = -ENODEV; in spufs_init()
826 ret = -ENOMEM; in spufs_init()