powerpc/spufs: allow spufs files to specify sizes
authorJeremy Kerr <jk@ozlabs.org>
Mon, 30 Jun 2008 02:17:28 +0000 (12:17 +1000)
committerJeremy Kerr <jk@ozlabs.org>
Wed, 9 Jul 2008 00:13:40 +0000 (10:13 +1000)
Currently, spufs never specifies the i_size for the files in context
directories, so stat() always reports 0-byte files.

This change adds allows the spufs_dir_(nosched_)contents arrays to
specify a file size. This allows stat() to report correct file sizes,
and makes SEEK_END work.

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 d0a497d9140b69a89e2057f12209f14ca4071c9a..9533a8ad33f2af96d6cd950c385276789f5dc287 100644 (file)
@@ -2607,7 +2607,7 @@ static const struct file_operations spufs_ctx_fops = {
        .release        = single_release,
 };
 
-struct tree_descr spufs_dir_contents[] = {
+struct spufs_tree_descr spufs_dir_contents[] = {
        { "capabilities", &spufs_caps_fops, 0444, },
        { "mem",  &spufs_mem_fops,  0666, },
        { "regs", &spufs_regs_fops,  0666, },
@@ -2647,7 +2647,7 @@ struct tree_descr spufs_dir_contents[] = {
        {},
 };
 
-struct tree_descr spufs_dir_nosched_contents[] = {
+struct spufs_tree_descr spufs_dir_nosched_contents[] = {
        { "capabilities", &spufs_caps_fops, 0444, },
        { "mem",  &spufs_mem_fops,  0666, },
        { "mbox", &spufs_mbox_fops, 0444, },
index f407b24718554f474a153dc9a66e93d88518739f..c662ca7836015fd8a396e25b9cd41492aaeefcf5 100644 (file)
@@ -109,7 +109,7 @@ spufs_setattr(struct dentry *dentry, struct iattr *attr)
 static int
 spufs_new_file(struct super_block *sb, struct dentry *dentry,
                const struct file_operations *fops, int mode,
-               struct spu_context *ctx)
+               size_t size, struct spu_context *ctx)
 {
        static struct inode_operations spufs_file_iops = {
                .setattr = spufs_setattr,
@@ -125,6 +125,7 @@ spufs_new_file(struct super_block *sb, struct dentry *dentry,
        ret = 0;
        inode->i_op = &spufs_file_iops;
        inode->i_fop = fops;
+       inode->i_size = size;
        inode->i_private = SPUFS_I(inode)->i_ctx = get_spu_context(ctx);
        d_add(dentry, inode);
 out:
@@ -177,7 +178,7 @@ static int spufs_rmdir(struct inode *parent, struct dentry *dir)
        return simple_rmdir(parent, dir);
 }
 
-static int spufs_fill_dir(struct dentry *dir, struct tree_descr *files,
+static int spufs_fill_dir(struct dentry *dir, struct spufs_tree_descr *files,
                          int mode, struct spu_context *ctx)
 {
        struct dentry *dentry, *tmp;
@@ -189,7 +190,7 @@ static int spufs_fill_dir(struct dentry *dir, struct tree_descr *files,
                if (!dentry)
                        goto out;
                ret = spufs_new_file(dir->d_sb, dentry, files->ops,
-                                       files->mode & mode, ctx);
+                                       files->mode & mode, files->size, ctx);
                if (ret)
                        goto out;
                files++;
index 433dece5c823bbc13f9bd4bf8c5be15863fa4154..413605406bdab8d534d4bd41ace2a6182b11386f 100644 (file)
@@ -235,8 +235,15 @@ struct spufs_inode_info {
 #define SPUFS_I(inode) \
        container_of(inode, struct spufs_inode_info, vfs_inode)
 
-extern struct tree_descr spufs_dir_contents[];
-extern struct tree_descr spufs_dir_nosched_contents[];
+struct spufs_tree_descr {
+       const char *name;
+       const struct file_operations *ops;
+       int mode;
+       size_t size;
+};
+
+extern struct spufs_tree_descr spufs_dir_contents[];
+extern struct spufs_tree_descr spufs_dir_nosched_contents[];
 
 /* system call implementation */
 extern struct spufs_calls spufs_calls;