Commit 9d66586f authored by Eric W. Biederman's avatar Eric W. Biederman Committed by Linus Torvalds

shm: fix the filename of hugetlb sysv shared memory

Some user space tools need to identify SYSV shared memory when examining
/proc/<pid>/maps.  To do so they look for a block device with major zero, a
dentry named SYSV<sysv key>, and having the minor of the internal sysv
shared memory kernel mount.

To help these tools and to make it easier for people just browsing
/proc/<pid>/maps this patch modifies hugetlb sysv shared memory to use the
SYSV<key> dentry naming convention.

User space tools will still have to be aware that hugetlb sysv shared
memory lives on a different internal kernel mount and so has a different
block device minor number from the rest of sysv shared memory.
Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
Cc: "Serge E. Hallyn" <serge@hallyn.com>
Cc: Albert Cahalan <acahalan@gmail.com>
Cc: Badari Pulavarty <pbadari@us.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 22741925
...@@ -736,15 +736,13 @@ static int can_do_hugetlb_shm(void) ...@@ -736,15 +736,13 @@ static int can_do_hugetlb_shm(void)
can_do_mlock()); can_do_mlock());
} }
struct file *hugetlb_zero_setup(size_t size) struct file *hugetlb_file_setup(const char *name, size_t size)
{ {
int error = -ENOMEM; int error = -ENOMEM;
struct file *file; struct file *file;
struct inode *inode; struct inode *inode;
struct dentry *dentry, *root; struct dentry *dentry, *root;
struct qstr quick_string; struct qstr quick_string;
char buf[16];
static atomic_t counter;
if (!hugetlbfs_vfsmount) if (!hugetlbfs_vfsmount)
return ERR_PTR(-ENOENT); return ERR_PTR(-ENOENT);
...@@ -756,8 +754,7 @@ struct file *hugetlb_zero_setup(size_t size) ...@@ -756,8 +754,7 @@ struct file *hugetlb_zero_setup(size_t size)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
root = hugetlbfs_vfsmount->mnt_root; root = hugetlbfs_vfsmount->mnt_root;
snprintf(buf, 16, "%u", atomic_inc_return(&counter)); quick_string.name = name;
quick_string.name = buf;
quick_string.len = strlen(quick_string.name); quick_string.len = strlen(quick_string.name);
quick_string.hash = 0; quick_string.hash = 0;
dentry = d_alloc(root, &quick_string); dentry = d_alloc(root, &quick_string);
......
...@@ -163,7 +163,7 @@ static inline struct hugetlbfs_sb_info *HUGETLBFS_SB(struct super_block *sb) ...@@ -163,7 +163,7 @@ static inline struct hugetlbfs_sb_info *HUGETLBFS_SB(struct super_block *sb)
extern const struct file_operations hugetlbfs_file_operations; extern const struct file_operations hugetlbfs_file_operations;
extern struct vm_operations_struct hugetlb_vm_ops; extern struct vm_operations_struct hugetlb_vm_ops;
struct file *hugetlb_zero_setup(size_t); struct file *hugetlb_file_setup(const char *name, size_t);
int hugetlb_get_quota(struct address_space *mapping); int hugetlb_get_quota(struct address_space *mapping);
void hugetlb_put_quota(struct address_space *mapping); void hugetlb_put_quota(struct address_space *mapping);
...@@ -185,7 +185,7 @@ static inline void set_file_hugepages(struct file *file) ...@@ -185,7 +185,7 @@ static inline void set_file_hugepages(struct file *file)
#define is_file_hugepages(file) 0 #define is_file_hugepages(file) 0
#define set_file_hugepages(file) BUG() #define set_file_hugepages(file) BUG()
#define hugetlb_zero_setup(size) ERR_PTR(-ENOSYS) #define hugetlb_file_setup(name,size) ERR_PTR(-ENOSYS)
#endif /* !CONFIG_HUGETLBFS */ #endif /* !CONFIG_HUGETLBFS */
......
...@@ -366,9 +366,10 @@ static int newseg (struct ipc_namespace *ns, key_t key, int shmflg, size_t size) ...@@ -366,9 +366,10 @@ static int newseg (struct ipc_namespace *ns, key_t key, int shmflg, size_t size)
return error; return error;
} }
sprintf (name, "SYSV%08x", key);
if (shmflg & SHM_HUGETLB) { if (shmflg & SHM_HUGETLB) {
/* hugetlb_zero_setup takes care of mlock user accounting */ /* hugetlb_file_setup takes care of mlock user accounting */
file = hugetlb_zero_setup(size); file = hugetlb_file_setup(name, size);
shp->mlock_user = current->user; shp->mlock_user = current->user;
} else { } else {
int acctflag = VM_ACCOUNT; int acctflag = VM_ACCOUNT;
...@@ -379,7 +380,6 @@ static int newseg (struct ipc_namespace *ns, key_t key, int shmflg, size_t size) ...@@ -379,7 +380,6 @@ static int newseg (struct ipc_namespace *ns, key_t key, int shmflg, size_t size)
if ((shmflg & SHM_NORESERVE) && if ((shmflg & SHM_NORESERVE) &&
sysctl_overcommit_memory != OVERCOMMIT_NEVER) sysctl_overcommit_memory != OVERCOMMIT_NEVER)
acctflag = 0; acctflag = 0;
sprintf (name, "SYSV%08x", key);
file = shmem_file_setup(name, size, acctflag); file = shmem_file_setup(name, size, acctflag);
} }
error = PTR_ERR(file); error = PTR_ERR(file);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment