|
@@ -4183,7 +4183,7 @@ static const struct dentry_operations anon_ops = {
|
|
|
.d_dname = simple_dname
|
|
|
};
|
|
|
|
|
|
-static struct file *__shmem_file_setup(const char *name, loff_t size,
|
|
|
+static struct file *__shmem_file_setup(struct vfsmount *mnt, const char *name, loff_t size,
|
|
|
unsigned long flags, unsigned int i_flags)
|
|
|
{
|
|
|
struct file *res;
|
|
@@ -4192,8 +4192,8 @@ static struct file *__shmem_file_setup(const char *name, loff_t size,
|
|
|
struct super_block *sb;
|
|
|
struct qstr this;
|
|
|
|
|
|
- if (IS_ERR(shm_mnt))
|
|
|
- return ERR_CAST(shm_mnt);
|
|
|
+ if (IS_ERR(mnt))
|
|
|
+ return ERR_CAST(mnt);
|
|
|
|
|
|
if (size < 0 || size > MAX_LFS_FILESIZE)
|
|
|
return ERR_PTR(-EINVAL);
|
|
@@ -4205,8 +4205,8 @@ static struct file *__shmem_file_setup(const char *name, loff_t size,
|
|
|
this.name = name;
|
|
|
this.len = strlen(name);
|
|
|
this.hash = 0; /* will go */
|
|
|
- sb = shm_mnt->mnt_sb;
|
|
|
- path.mnt = mntget(shm_mnt);
|
|
|
+ sb = mnt->mnt_sb;
|
|
|
+ path.mnt = mntget(mnt);
|
|
|
path.dentry = d_alloc_pseudo(sb, &this);
|
|
|
if (!path.dentry)
|
|
|
goto put_memory;
|
|
@@ -4251,7 +4251,7 @@ put_path:
|
|
|
*/
|
|
|
struct file *shmem_kernel_file_setup(const char *name, loff_t size, unsigned long flags)
|
|
|
{
|
|
|
- return __shmem_file_setup(name, size, flags, S_PRIVATE);
|
|
|
+ return __shmem_file_setup(shm_mnt, name, size, flags, S_PRIVATE);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -4262,10 +4262,24 @@ struct file *shmem_kernel_file_setup(const char *name, loff_t size, unsigned lon
|
|
|
*/
|
|
|
struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags)
|
|
|
{
|
|
|
- return __shmem_file_setup(name, size, flags, 0);
|
|
|
+ return __shmem_file_setup(shm_mnt, name, size, flags, 0);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(shmem_file_setup);
|
|
|
|
|
|
+/**
|
|
|
+ * shmem_file_setup_with_mnt - get an unlinked file living in tmpfs
|
|
|
+ * @mnt: the tmpfs mount where the file will be created
|
|
|
+ * @name: name for dentry (to be seen in /proc/<pid>/maps
|
|
|
+ * @size: size to be set for the file
|
|
|
+ * @flags: VM_NORESERVE suppresses pre-accounting of the entire object size
|
|
|
+ */
|
|
|
+struct file *shmem_file_setup_with_mnt(struct vfsmount *mnt, const char *name,
|
|
|
+ loff_t size, unsigned long flags)
|
|
|
+{
|
|
|
+ return __shmem_file_setup(mnt, name, size, flags, 0);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(shmem_file_setup_with_mnt);
|
|
|
+
|
|
|
/**
|
|
|
* shmem_zero_setup - setup a shared anonymous mapping
|
|
|
* @vma: the vma to be mmapped is prepared by do_mmap_pgoff
|
|
@@ -4281,7 +4295,7 @@ int shmem_zero_setup(struct vm_area_struct *vma)
|
|
|
* accessible to the user through its mapping, use S_PRIVATE flag to
|
|
|
* bypass file security, in the same way as shmem_kernel_file_setup().
|
|
|
*/
|
|
|
- file = __shmem_file_setup("dev/zero", size, vma->vm_flags, S_PRIVATE);
|
|
|
+ file = shmem_kernel_file_setup("dev/zero", size, vma->vm_flags);
|
|
|
if (IS_ERR(file))
|
|
|
return PTR_ERR(file);
|
|
|
|