|
@@ -89,6 +89,7 @@ void shm_init_ns(struct ipc_namespace *ns)
|
|
|
static void do_shm_rmid(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp)
|
|
|
{
|
|
|
struct shmid_kernel *shp;
|
|
|
+
|
|
|
shp = container_of(ipcp, struct shmid_kernel, shm_perm);
|
|
|
|
|
|
if (shp->shm_nattch) {
|
|
@@ -387,6 +388,7 @@ static int shm_set_policy(struct vm_area_struct *vma, struct mempolicy *new)
|
|
|
struct file *file = vma->vm_file;
|
|
|
struct shm_file_data *sfd = shm_file_data(file);
|
|
|
int err = 0;
|
|
|
+
|
|
|
if (sfd->vm_ops->set_policy)
|
|
|
err = sfd->vm_ops->set_policy(vma, new);
|
|
|
return err;
|
|
@@ -417,7 +419,7 @@ static int shm_mmap(struct file *file, struct vm_area_struct *vma)
|
|
|
* In case of remap_file_pages() emulation, the file can represent
|
|
|
* removed IPC ID: propogate shm_lock() error to caller.
|
|
|
*/
|
|
|
- ret =__shm_open(vma);
|
|
|
+ ret = __shm_open(vma);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
@@ -468,6 +470,7 @@ static unsigned long shm_get_unmapped_area(struct file *file,
|
|
|
unsigned long flags)
|
|
|
{
|
|
|
struct shm_file_data *sfd = shm_file_data(file);
|
|
|
+
|
|
|
return sfd->file->f_op->get_unmapped_area(sfd->file, addr, len,
|
|
|
pgoff, flags);
|
|
|
}
|
|
@@ -766,6 +769,7 @@ static void shm_add_rss_swap(struct shmid_kernel *shp,
|
|
|
} else {
|
|
|
#ifdef CONFIG_SHMEM
|
|
|
struct shmem_inode_info *info = SHMEM_I(inode);
|
|
|
+
|
|
|
spin_lock_irq(&info->lock);
|
|
|
*rss_add += inode->i_mapping->nrpages;
|
|
|
*swp_add += info->swapped;
|
|
@@ -1028,6 +1032,7 @@ SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf)
|
|
|
|
|
|
if (!ns_capable(ns->user_ns, CAP_IPC_LOCK)) {
|
|
|
kuid_t euid = current_euid();
|
|
|
+
|
|
|
if (!uid_eq(euid, shp->shm_perm.uid) &&
|
|
|
!uid_eq(euid, shp->shm_perm.cuid)) {
|
|
|
err = -EPERM;
|
|
@@ -1045,6 +1050,7 @@ SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf)
|
|
|
|
|
|
if (cmd == SHM_LOCK) {
|
|
|
struct user_struct *user = current_user();
|
|
|
+
|
|
|
err = shmem_lock(shm_file, 1, user);
|
|
|
if (!err && !(shp->shm_perm.mode & SHM_LOCKED)) {
|
|
|
shp->shm_perm.mode |= SHM_LOCKED;
|
|
@@ -1354,9 +1360,10 @@ SYSCALL_DEFINE1(shmdt, char __user *, shmaddr)
|
|
|
vma = next;
|
|
|
}
|
|
|
|
|
|
-#else /* CONFIG_MMU */
|
|
|
+#else /* CONFIG_MMU */
|
|
|
/* under NOMMU conditions, the exact address to be destroyed must be
|
|
|
- * given */
|
|
|
+ * given
|
|
|
+ */
|
|
|
if (vma && vma->vm_start == addr && vma->vm_ops == &shm_vm_ops) {
|
|
|
do_munmap(mm, vma->vm_start, vma->vm_end - vma->vm_start);
|
|
|
retval = 0;
|