[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