]> pilppa.com Git - linux-2.6-omap-h63xx.git/commitdiff
powerpc/spufs: only add ".ctx" file with "debug" mount option
authorJeremy Kerr <jk@ozlabs.org>
Thu, 3 Jul 2008 01:42:20 +0000 (11:42 +1000)
committerJeremy Kerr <jk@ozlabs.org>
Wed, 9 Jul 2008 00:13:41 +0000 (10:13 +1000)
Currently, the .ctx debug file in spu context directories is always
present.

We'd prefer to prevent users from relying on this file, so add a
"debug" mount option to spufs. The .ctx file will only be added to
the context directories when this option is present.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
arch/powerpc/platforms/cell/spufs/file.c
arch/powerpc/platforms/cell/spufs/inode.c
arch/powerpc/platforms/cell/spufs/spufs.h

index fee645b580cc58de3a17631aebda9c45f5103194..99c73066b82f860cefc09f496d682be15b012aa0 100644 (file)
@@ -2645,7 +2645,6 @@ struct spufs_tree_descr spufs_dir_contents[] = {
        { "tid", &spufs_tid_fops, 0444, },
        { "stat", &spufs_stat_fops, 0444, },
        { "switch_log", &spufs_switch_log_fops, 0444 },
-       { ".ctx", &spufs_ctx_fops, 0444, },
        {},
 };
 
@@ -2671,6 +2670,10 @@ struct spufs_tree_descr spufs_dir_nosched_contents[] = {
        { "object-id", &spufs_object_id_ops, 0666, },
        { "tid", &spufs_tid_fops, 0444, },
        { "stat", &spufs_stat_fops, 0444, },
+       {},
+};
+
+struct spufs_tree_descr spufs_dir_debug_contents[] = {
        { ".ctx", &spufs_ctx_fops, 0444, },
        {},
 };
index c662ca7836015fd8a396e25b9cd41492aaeefcf5..7123472801d922067ba5e801808245b4eef10b15 100644 (file)
 
 #include "spufs.h"
 
+struct spufs_sb_info {
+       int debug;
+};
+
 static struct kmem_cache *spufs_inode_cache;
 char *isolated_loader;
 static int isolated_loader_size;
 
+static struct spufs_sb_info *spufs_get_sb_info(struct super_block *sb)
+{
+       return sb->s_fs_info;
+}
+
 static struct inode *
 spufs_alloc_inode(struct super_block *sb)
 {
@@ -280,6 +289,13 @@ spufs_mkdir(struct inode *dir, struct dentry *dentry, unsigned int flags,
        if (ret)
                goto out_free_ctx;
 
+       if (spufs_get_sb_info(dir->i_sb)->debug)
+               ret = spufs_fill_dir(dentry, spufs_dir_debug_contents,
+                               mode, ctx);
+
+       if (ret)
+               goto out_free_ctx;
+
        d_instantiate(dentry, inode);
        dget(dentry);
        dir->i_nlink++;
@@ -640,18 +656,19 @@ out:
 
 /* File system initialization */
 enum {
-       Opt_uid, Opt_gid, Opt_mode, Opt_err,
+       Opt_uid, Opt_gid, Opt_mode, Opt_debug, Opt_err,
 };
 
 static match_table_t spufs_tokens = {
-       { Opt_uid,  "uid=%d" },
-       { Opt_gid,  "gid=%d" },
-       { Opt_mode, "mode=%o" },
-       { Opt_err,   NULL  },
+       { Opt_uid,   "uid=%d" },
+       { Opt_gid,   "gid=%d" },
+       { Opt_mode,  "mode=%o" },
+       { Opt_debug, "debug" },
+       { Opt_err,    NULL  },
 };
 
 static int
-spufs_parse_options(char *options, struct inode *root)
+spufs_parse_options(struct super_block *sb, char *options, struct inode *root)
 {
        char *p;
        substring_t args[MAX_OPT_ARGS];
@@ -679,6 +696,9 @@ spufs_parse_options(char *options, struct inode *root)
                                return 0;
                        root->i_mode = option | S_IFDIR;
                        break;
+               case Opt_debug:
+                       spufs_get_sb_info(sb)->debug = 1;
+                       break;
                default:
                        return 0;
                }
@@ -737,7 +757,7 @@ spufs_create_root(struct super_block *sb, void *data)
        SPUFS_I(inode)->i_ctx = NULL;
 
        ret = -EINVAL;
-       if (!spufs_parse_options(data, inode))
+       if (!spufs_parse_options(sb, data, inode))
                goto out_iput;
 
        ret = -ENOMEM;
@@ -755,6 +775,7 @@ out:
 static int
 spufs_fill_super(struct super_block *sb, void *data, int silent)
 {
+       struct spufs_sb_info *info;
        static struct super_operations s_ops = {
                .alloc_inode = spufs_alloc_inode,
                .destroy_inode = spufs_destroy_inode,
@@ -766,11 +787,16 @@ spufs_fill_super(struct super_block *sb, void *data, int silent)
 
        save_mount_options(sb, data);
 
+       info = kzalloc(sizeof(*info), GFP_KERNEL);
+       if (!info)
+               return -ENOMEM;
+
        sb->s_maxbytes = MAX_LFS_FILESIZE;
        sb->s_blocksize = PAGE_CACHE_SIZE;
        sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
        sb->s_magic = SPUFS_MAGIC;
        sb->s_op = &s_ops;
+       sb->s_fs_info = info;
 
        return spufs_create_root(sb, data);
 }
index 413605406bdab8d534d4bd41ace2a6182b11386f..8ae8ef9dfc22dd5a73bfba0899ddffa7d375b693 100644 (file)
@@ -244,6 +244,7 @@ struct spufs_tree_descr {
 
 extern struct spufs_tree_descr spufs_dir_contents[];
 extern struct spufs_tree_descr spufs_dir_nosched_contents[];
+extern struct spufs_tree_descr spufs_dir_debug_contents[];
 
 /* system call implementation */
 extern struct spufs_calls spufs_calls;