Skip to content

Commit

Permalink
ipc: simplify semtimedop/semctl_main() common error path handling
Browse files Browse the repository at this point in the history
With various straight RCU lock/unlock movements, one common exit path
pattern had become

	rcu_read_unlock();
	goto out_wakeup;

and in fact there were no cases where we wanted to exit to out_wakeup
_without_ releasing the RCU read lock.

So replace that pattern with "goto out_rcu_wakeup", and remove the old
out_wakeup.

Acked-by: Davidlohr Bueso <[email protected]>
Cc: Rik van Riel <[email protected]>
Cc: Al Viro <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
torvalds committed May 5, 2013
1 parent 321310c commit c728b9c
Showing 1 changed file with 14 additions and 27 deletions.
41 changes: 14 additions & 27 deletions ipc/sem.c
Original file line number Diff line number Diff line change
Expand Up @@ -1077,17 +1077,12 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,
nsems = sma->sem_nsems;

err = -EACCES;
if (ipcperms(ns, &sma->sem_perm,
cmd == SETALL ? S_IWUGO : S_IRUGO)) {
rcu_read_unlock();
goto out_wakeup;
}
if (ipcperms(ns, &sma->sem_perm, cmd == SETALL ? S_IWUGO : S_IRUGO))
goto out_rcu_wakeup;

err = security_sem_semctl(sma, cmd);
if (err) {
rcu_read_unlock();
goto out_wakeup;
}
if (err)
goto out_rcu_wakeup;

err = -EACCES;
switch (cmd) {
Expand Down Expand Up @@ -1188,10 +1183,8 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,
/* GETVAL, GETPID, GETNCTN, GETZCNT: fall-through */
}
err = -EINVAL;
if (semnum < 0 || semnum >= nsems) {
rcu_read_unlock();
goto out_wakeup;
}
if (semnum < 0 || semnum >= nsems)
goto out_rcu_wakeup;

sem_lock(sma, NULL, -1);
curr = &sma->sem_base[semnum];
Expand All @@ -1213,8 +1206,8 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,

out_unlock:
sem_unlock(sma, -1);
out_rcu_wakeup:
rcu_read_unlock();
out_wakeup:
wake_up_sem_queue_do(&tasks);
out_free:
if(sem_io != fast_sem_io)
Expand Down Expand Up @@ -1585,22 +1578,16 @@ SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops,
}

error = -EFBIG;
if (max >= sma->sem_nsems) {
rcu_read_unlock();
goto out_wakeup;
}
if (max >= sma->sem_nsems)
goto out_rcu_wakeup;

error = -EACCES;
if (ipcperms(ns, &sma->sem_perm, alter ? S_IWUGO : S_IRUGO)) {
rcu_read_unlock();
goto out_wakeup;
}
if (ipcperms(ns, &sma->sem_perm, alter ? S_IWUGO : S_IRUGO))
goto out_rcu_wakeup;

error = security_sem_semop(sma, sops, nsops, alter);
if (error) {
rcu_read_unlock();
goto out_wakeup;
}
if (error)
goto out_rcu_wakeup;

/*
* semid identifiers are not unique - find_alloc_undo may have
Expand Down Expand Up @@ -1718,8 +1705,8 @@ SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops,

out_unlock_free:
sem_unlock(sma, locknum);
out_rcu_wakeup:
rcu_read_unlock();
out_wakeup:
wake_up_sem_queue_do(&tasks);
out_free:
if(sops != fast_sops)
Expand Down

0 comments on commit c728b9c

Please sign in to comment.