|
@@ -98,7 +98,7 @@ struct sem {
|
|
|
* - semctl, via SETVAL and SETALL.
|
|
|
* - at task exit when performing undo adjustments (see exit_sem).
|
|
|
*/
|
|
|
- int sempid;
|
|
|
+ struct pid *sempid;
|
|
|
spinlock_t lock; /* spinlock for fine-grained semtimedop */
|
|
|
struct list_head pending_alter; /* pending single-sop operations */
|
|
|
/* that alter the semaphore */
|
|
@@ -128,7 +128,7 @@ struct sem_queue {
|
|
|
struct list_head list; /* queue of pending operations */
|
|
|
struct task_struct *sleeper; /* this process */
|
|
|
struct sem_undo *undo; /* undo structure */
|
|
|
- int pid; /* process id of requesting process */
|
|
|
+ struct pid *pid; /* process id of requesting process */
|
|
|
int status; /* completion status of operation */
|
|
|
struct sembuf *sops; /* array of pending operations */
|
|
|
struct sembuf *blocking; /* the operation that blocked */
|
|
@@ -628,7 +628,8 @@ SYSCALL_DEFINE3(semget, key_t, key, int, nsems, int, semflg)
|
|
|
*/
|
|
|
static int perform_atomic_semop_slow(struct sem_array *sma, struct sem_queue *q)
|
|
|
{
|
|
|
- int result, sem_op, nsops, pid;
|
|
|
+ int result, sem_op, nsops;
|
|
|
+ struct pid *pid;
|
|
|
struct sembuf *sop;
|
|
|
struct sem *curr;
|
|
|
struct sembuf *sops;
|
|
@@ -666,7 +667,7 @@ static int perform_atomic_semop_slow(struct sem_array *sma, struct sem_queue *q)
|
|
|
sop--;
|
|
|
pid = q->pid;
|
|
|
while (sop >= sops) {
|
|
|
- sma->sems[sop->sem_num].sempid = pid;
|
|
|
+ ipc_update_pid(&sma->sems[sop->sem_num].sempid, pid);
|
|
|
sop--;
|
|
|
}
|
|
|
|
|
@@ -753,7 +754,7 @@ static int perform_atomic_semop(struct sem_array *sma, struct sem_queue *q)
|
|
|
un->semadj[sop->sem_num] = undo;
|
|
|
}
|
|
|
curr->semval += sem_op;
|
|
|
- curr->sempid = q->pid;
|
|
|
+ ipc_update_pid(&curr->sempid, q->pid);
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
@@ -1160,6 +1161,7 @@ static void freeary(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp)
|
|
|
unlink_queue(sma, q);
|
|
|
wake_up_sem_queue_prepare(q, -EIDRM, &wake_q);
|
|
|
}
|
|
|
+ ipc_update_pid(&sem->sempid, NULL);
|
|
|
}
|
|
|
|
|
|
/* Remove the semaphore set from the IDR */
|
|
@@ -1352,7 +1354,7 @@ static int semctl_setval(struct ipc_namespace *ns, int semid, int semnum,
|
|
|
un->semadj[semnum] = 0;
|
|
|
|
|
|
curr->semval = val;
|
|
|
- curr->sempid = task_tgid_vnr(current);
|
|
|
+ ipc_update_pid(&curr->sempid, task_tgid(current));
|
|
|
sma->sem_ctime = ktime_get_real_seconds();
|
|
|
/* maybe some queued-up processes were waiting for this */
|
|
|
do_smart_update(sma, NULL, 0, 0, &wake_q);
|
|
@@ -1473,7 +1475,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,
|
|
|
|
|
|
for (i = 0; i < nsems; i++) {
|
|
|
sma->sems[i].semval = sem_io[i];
|
|
|
- sma->sems[i].sempid = task_tgid_vnr(current);
|
|
|
+ ipc_update_pid(&sma->sems[i].sempid, task_tgid(current));
|
|
|
}
|
|
|
|
|
|
ipc_assert_locked_object(&sma->sem_perm);
|
|
@@ -1505,7 +1507,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,
|
|
|
err = curr->semval;
|
|
|
goto out_unlock;
|
|
|
case GETPID:
|
|
|
- err = curr->sempid;
|
|
|
+ err = pid_vnr(curr->sempid);
|
|
|
goto out_unlock;
|
|
|
case GETNCNT:
|
|
|
err = count_semcnt(sma, semnum, 0);
|
|
@@ -2024,7 +2026,7 @@ static long do_semtimedop(int semid, struct sembuf __user *tsops,
|
|
|
queue.sops = sops;
|
|
|
queue.nsops = nsops;
|
|
|
queue.undo = un;
|
|
|
- queue.pid = task_tgid_vnr(current);
|
|
|
+ queue.pid = task_tgid(current);
|
|
|
queue.alter = alter;
|
|
|
queue.dupsop = dupsop;
|
|
|
|
|
@@ -2318,7 +2320,7 @@ void exit_sem(struct task_struct *tsk)
|
|
|
semaphore->semval = 0;
|
|
|
if (semaphore->semval > SEMVMX)
|
|
|
semaphore->semval = SEMVMX;
|
|
|
- semaphore->sempid = task_tgid_vnr(current);
|
|
|
+ ipc_update_pid(&semaphore->sempid, task_tgid(current));
|
|
|
}
|
|
|
}
|
|
|
/* maybe some queued-up processes were waiting for this */
|