[PATCH 3/3] hmmm
Matthew Auld
matthew.auld at intel.com
Thu May 25 18:56:22 UTC 2017
---
drivers/gpu/drm/i915/i915_gemfs.c | 27 ++++++++++++++-------------
include/linux/shmem_fs.h | 2 ++
mm/shmem.c | 5 +++--
3 files changed, 19 insertions(+), 15 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_gemfs.c b/drivers/gpu/drm/i915/i915_gemfs.c
index f1d6d5d14f91..594af363f998 100644
--- a/drivers/gpu/drm/i915/i915_gemfs.c
+++ b/drivers/gpu/drm/i915/i915_gemfs.c
@@ -49,7 +49,7 @@ int i915_gemfs_create(struct drm_i915_private *i915)
struct super_block *sb;
int flags = 0;
int ret;
- char options[] = "huge=within_size";
+ char options[] = "huge=never";
type = get_fs_type("tmpfs");
if (!type) {
@@ -77,8 +77,10 @@ int i915_gemfs_create(struct drm_i915_private *i915)
return PTR_ERR(gemfs_mnt);
}
- WARN_ON(SHMEM_SB(sb)->huge == 0);
#endif
+ WARN_ON(!(sb->s_flags & (MS_KERNMOUNT | MS_NOUSER)));
+ WARN_ON(SHMEM_SB(sb)->max_blocks > 0);
+ WARN_ON(SHMEM_SB(sb)->max_inodes > 0);
i915->gemfs_mnt = gemfs_mnt;
@@ -99,7 +101,6 @@ struct file *i915_gemfs_file_setup(struct drm_i915_private *i915,
struct path path;
struct qstr this;
struct file *res;
- int ret;
if (size < 0 || size > MAX_LFS_FILESIZE)
return ERR_PTR(-EINVAL);
@@ -116,26 +117,26 @@ struct file *i915_gemfs_file_setup(struct drm_i915_private *i915,
}
d_set_d_op(path.dentry, &anon_ops);
- ret = vfs_create(d_inode(sb->s_root), path.dentry, S_IFREG, false);
- if (ret) {
- res = ERR_PTR(ret);
+ inode = shmem_get_inode(sb, NULL, S_IFREG | S_IRWXUGO, 0, VM_NORESERVE);
+ if (!inode) {
+ res = ERR_PTR(-ENOMEM);
goto put_path;
}
- inode = d_inode(path.dentry);
- i_size_write(inode, size);
- clear_nlink(inode);
+ d_instantiate(path.dentry, inode);
+ inode->i_size = size;
+ clear_nlink(inode); /* It is unlinked */
- ret = ramfs_nommu_expand_for_mapping(inode, size);
- if (ret) {
- res = ERR_PTR(ret);
+ res = ERR_PTR(ramfs_nommu_expand_for_mapping(inode, size));
+ if (IS_ERR(res))
goto put_path;
- }
res = alloc_file(&path, FMODE_WRITE | FMODE_READ, inode->i_fop);
if (IS_ERR(res))
goto put_path;
+ WARN_ON(!(SHMEM_I(inode)->flags & VM_NORESERVE));
+
return res;
put_path:
diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h
index a7d6bd2a918f..13a9141f083e 100644
--- a/include/linux/shmem_fs.h
+++ b/include/linux/shmem_fs.h
@@ -44,6 +44,8 @@ static inline struct shmem_inode_info *SHMEM_I(struct inode *inode)
return container_of(inode, struct shmem_inode_info, vfs_inode);
}
+extern struct inode *shmem_get_inode(struct super_block *sb, const struct inode *dir,
+ umode_t mode, dev_t dev, unsigned long flags);
/*
* Functions in mm/shmem.c called directly from elsewhere:
*/
diff --git a/mm/shmem.c b/mm/shmem.c
index e67d6ba4e98e..3b1f784c43c5 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -2132,8 +2132,8 @@ static int shmem_mmap(struct file *file, struct vm_area_struct *vma)
return 0;
}
-static struct inode *shmem_get_inode(struct super_block *sb, const struct inode *dir,
- umode_t mode, dev_t dev, unsigned long flags)
+struct inode *shmem_get_inode(struct super_block *sb, const struct inode *dir,
+ umode_t mode, dev_t dev, unsigned long flags)
{
struct inode *inode;
struct shmem_inode_info *info;
@@ -2190,6 +2190,7 @@ static struct inode *shmem_get_inode(struct super_block *sb, const struct inode
shmem_free_inode(sb);
return inode;
}
+EXPORT_SYMBOL_GPL(shmem_get_inode);
bool shmem_mapping(struct address_space *mapping)
{
--
2.9.4
More information about the Intel-gfx-trybot
mailing list