mirror of https://gitee.com/openkylin/linux.git
powerpc/spufs: allow spufs files to specify sizes
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>
This commit is contained in:
parent
87ff6090bf
commit
23d893f51c
|
@ -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, },
|
||||
|
|
|
@ -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++;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue