Commit d5cedb89 authored by Dave Olien's avatar Dave Olien Committed by Linus Torvalds

[PATCH] 2.5.9 SEM_UNDO patch

As we discussed some time ago, here is a patch for the SEM_UNDO change
that can be applied to linux-2.5.9.
parent 40bbbd47
...@@ -45,6 +45,7 @@ struct exec_domain; ...@@ -45,6 +45,7 @@ struct exec_domain;
#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */ #define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
#define CLONE_THREAD 0x00010000 /* Same thread group? */ #define CLONE_THREAD 0x00010000 /* Same thread group? */
#define CLONE_NEWNS 0x00020000 /* New namespace group? */ #define CLONE_NEWNS 0x00020000 /* New namespace group? */
#define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */
#define CLONE_SIGNAL (CLONE_SIGHAND | CLONE_THREAD) #define CLONE_SIGNAL (CLONE_SIGHAND | CLONE_THREAD)
...@@ -315,8 +316,7 @@ struct task_struct { ...@@ -315,8 +316,7 @@ struct task_struct {
struct tty_struct *tty; /* NULL if no tty */ struct tty_struct *tty; /* NULL if no tty */
unsigned int locks; /* How many file locks are being held */ unsigned int locks; /* How many file locks are being held */
/* ipc stuff */ /* ipc stuff */
struct sem_undo *semundo; struct sysv_sem sysvsem;
struct sem_queue *semsleeping;
/* CPU-specific state of this task */ /* CPU-specific state of this task */
struct thread_struct thread; struct thread_struct thread;
/* filesystem information */ /* filesystem information */
......
...@@ -121,6 +121,21 @@ struct sem_undo { ...@@ -121,6 +121,21 @@ struct sem_undo {
short * semadj; /* array of adjustments, one per semaphore */ short * semadj; /* array of adjustments, one per semaphore */
}; };
/* sem_undo_list controls shared access to the list of sem_undo structures
* that may be shared among all a CLONE_SYSVSEM task group.
*/
struct sem_undo_list {
atomic_t refcnt;
spinlock_t lock;
volatile unsigned long add_count;
struct sem_undo *proc_list;
};
struct sysv_sem {
struct sem_undo_list *undo_list;
struct sem_queue *sleep_list;
};
asmlinkage long sys_semget (key_t key, int nsems, int semflg); asmlinkage long sys_semget (key_t key, int nsems, int semflg);
asmlinkage long sys_semop (int semid, struct sembuf *sops, unsigned nsops); asmlinkage long sys_semop (int semid, struct sembuf *sops, unsigned nsops);
asmlinkage long sys_semctl (int semid, int semnum, int cmd, union semun arg); asmlinkage long sys_semctl (int semid, int semnum, int cmd, union semun arg);
......
This diff is collapsed.
...@@ -340,6 +340,17 @@ int ipc_parse_version (int *cmd) ...@@ -340,6 +340,17 @@ int ipc_parse_version (int *cmd)
* Dummy functions when SYSV IPC isn't configured * Dummy functions when SYSV IPC isn't configured
*/ */
int copy_semundo(unsigned long clone_flags, struct task_struct *tsk)
{
return 0;
}
void exit_semundo(struct task_struct *tsk)
{
return;
}
void sem_exit (void) void sem_exit (void)
{ {
return; return;
......
...@@ -34,6 +34,9 @@ ...@@ -34,6 +34,9 @@
static kmem_cache_t *task_struct_cachep; static kmem_cache_t *task_struct_cachep;
extern int copy_semundo(unsigned long clone_flags, struct task_struct *tsk);
extern void exit_semundo(struct task_struct *tsk);
/* The idle threads do not count.. */ /* The idle threads do not count.. */
int nr_threads; int nr_threads;
...@@ -710,8 +713,10 @@ int do_fork(unsigned long clone_flags, unsigned long stack_start, ...@@ -710,8 +713,10 @@ int do_fork(unsigned long clone_flags, unsigned long stack_start,
retval = -ENOMEM; retval = -ENOMEM;
/* copy all the process information */ /* copy all the process information */
if (copy_files(clone_flags, p)) if (copy_semundo(clone_flags, p))
goto bad_fork_cleanup; goto bad_fork_cleanup;
if (copy_files(clone_flags, p))
goto bad_fork_cleanup_semundo;
if (copy_fs(clone_flags, p)) if (copy_fs(clone_flags, p))
goto bad_fork_cleanup_files; goto bad_fork_cleanup_files;
if (copy_sighand(clone_flags, p)) if (copy_sighand(clone_flags, p))
...@@ -723,7 +728,6 @@ int do_fork(unsigned long clone_flags, unsigned long stack_start, ...@@ -723,7 +728,6 @@ int do_fork(unsigned long clone_flags, unsigned long stack_start,
retval = copy_thread(0, clone_flags, stack_start, stack_size, p, regs); retval = copy_thread(0, clone_flags, stack_start, stack_size, p, regs);
if (retval) if (retval)
goto bad_fork_cleanup_namespace; goto bad_fork_cleanup_namespace;
p->semundo = NULL;
/* Our parent execution domain becomes current domain /* Our parent execution domain becomes current domain
These must match for thread signalling to apply */ These must match for thread signalling to apply */
...@@ -815,6 +819,8 @@ int do_fork(unsigned long clone_flags, unsigned long stack_start, ...@@ -815,6 +819,8 @@ int do_fork(unsigned long clone_flags, unsigned long stack_start,
exit_fs(p); /* blocking */ exit_fs(p); /* blocking */
bad_fork_cleanup_files: bad_fork_cleanup_files:
exit_files(p); /* blocking */ exit_files(p); /* blocking */
bad_fork_cleanup_semundo:
exit_semundo(p);
bad_fork_cleanup: bad_fork_cleanup:
put_exec_domain(p->thread_info->exec_domain); put_exec_domain(p->thread_info->exec_domain);
if (p->binfmt && p->binfmt->module) if (p->binfmt && p->binfmt->module)
......
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