git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
nfsd4: don't try to map gid's in generic rpc code
[safe/jmp/linux-2.6]
/
ipc
/
shm.c
diff --git
a/ipc/shm.c
b/ipc/shm.c
index
5608183
..
464694e
100644
(file)
--- a/
ipc/shm.c
+++ b/
ipc/shm.c
@@
-55,7
+55,7
@@
struct shm_file_data {
#define shm_file_data(file) (*((struct shm_file_data **)&(file)->private_data))
static const struct file_operations shm_file_operations;
#define shm_file_data(file) (*((struct shm_file_data **)&(file)->private_data))
static const struct file_operations shm_file_operations;
-static struct vm_operations_struct shm_vm_ops;
+static
const
struct vm_operations_struct shm_vm_ops;
#define shm_ids(ns) ((ns)->ids[IPC_SHM_IDS])
#define shm_ids(ns) ((ns)->ids[IPC_SHM_IDS])
@@
-174,7
+174,7
@@
static void shm_destroy(struct ipc_namespace *ns, struct shmid_kernel *shp)
shm_unlock(shp);
if (!is_file_hugepages(shp->shm_file))
shmem_lock(shp->shm_file, 0, shp->mlock_user);
shm_unlock(shp);
if (!is_file_hugepages(shp->shm_file))
shmem_lock(shp->shm_file, 0, shp->mlock_user);
- else
+ else
if (shp->mlock_user)
user_shm_unlock(shp->shm_file->f_path.dentry->d_inode->i_size,
shp->mlock_user);
fput (shp->shm_file);
user_shm_unlock(shp->shm_file->f_path.dentry->d_inode->i_size,
shp->mlock_user);
fput (shp->shm_file);
@@
-312,7
+312,7
@@
static const struct file_operations shm_file_operations = {
.get_unmapped_area = shm_get_unmapped_area,
};
.get_unmapped_area = shm_get_unmapped_area,
};
-static struct vm_operations_struct shm_vm_ops = {
+static
const
struct vm_operations_struct shm_vm_ops = {
.open = shm_open, /* callback for a new vm-area open */
.close = shm_close, /* callback for when the vm-area is released */
.fault = shm_fault,
.open = shm_open, /* callback for a new vm-area open */
.close = shm_close, /* callback for when the vm-area is released */
.fault = shm_fault,
@@
-369,8
+369,8
@@
static int newseg(struct ipc_namespace *ns, struct ipc_params *params)
/* hugetlb_file_setup applies strict accounting */
if (shmflg & SHM_NORESERVE)
acctflag = VM_NORESERVE;
/* hugetlb_file_setup applies strict accounting */
if (shmflg & SHM_NORESERVE)
acctflag = VM_NORESERVE;
- file = hugetlb_file_setup(name, size, acctflag
);
-
shp->mlock_user = current_user(
);
+ file = hugetlb_file_setup(name, size, acctflag
,
+
&shp->mlock_user, HUGETLB_SHMFS_INODE
);
} else {
/*
* Do not allow no accounting for OVERCOMMIT_NEVER, even
} else {
/*
* Do not allow no accounting for OVERCOMMIT_NEVER, even
@@
-410,6
+410,8
@@
static int newseg(struct ipc_namespace *ns, struct ipc_params *params)
return error;
no_id:
return error;
no_id:
+ if (is_file_hugepages(file) && shp->mlock_user)
+ user_shm_unlock(size, shp->mlock_user);
fput(file);
no_file:
security_shm_free(shp);
fput(file);
no_file:
security_shm_free(shp);
@@
-968,10
+970,13
@@
SYSCALL_DEFINE3(shmat, int, shmid, char __user *, shmaddr, int, shmflg)
SYSCALL_DEFINE1(shmdt, char __user *, shmaddr)
{
struct mm_struct *mm = current->mm;
SYSCALL_DEFINE1(shmdt, char __user *, shmaddr)
{
struct mm_struct *mm = current->mm;
- struct vm_area_struct *vma
, *next
;
+ struct vm_area_struct *vma;
unsigned long addr = (unsigned long)shmaddr;
unsigned long addr = (unsigned long)shmaddr;
- loff_t size = 0;
int retval = -EINVAL;
int retval = -EINVAL;
+#ifdef CONFIG_MMU
+ loff_t size = 0;
+ struct vm_area_struct *next;
+#endif
if (addr & ~PAGE_MASK)
return retval;
if (addr & ~PAGE_MASK)
return retval;