From: "Ed L. Cashin" Adam Richter suggested eliminating this goto. Signed-off-by: Ed L. Cashin Cc: Greg KH Signed-off-by: Andrew Morton --- drivers/block/aoe/aoechr.c | 71 +++++++++++++++++------------------ 1 file changed, 35 insertions(+), 36 deletions(-) diff -puN drivers/block/aoe/aoechr.c~aoe-eliminate-goto-and-improve-readability drivers/block/aoe/aoechr.c --- a/drivers/block/aoe/aoechr.c~aoe-eliminate-goto-and-improve-readability +++ a/drivers/block/aoe/aoechr.c @@ -194,52 +194,51 @@ aoechr_read(struct file *filp, char __us ulong flags; n = (unsigned long) filp->private_data; - switch (n) { - case MINOR_ERR: - spin_lock_irqsave(&emsgs_lock, flags); -loop: - em = emsgs + emsgs_head_idx; - if ((em->flags & EMFL_VALID) == 0) { - if (filp->f_flags & O_NDELAY) { - spin_unlock_irqrestore(&emsgs_lock, flags); - return -EAGAIN; - } - nblocked_emsgs_readers++; + if (n != MINOR_ERR) + return -EFAULT; + spin_lock_irqsave(&emsgs_lock, flags); + + for (;;) { + em = emsgs + emsgs_head_idx; + if ((em->flags & EMFL_VALID) != 0) + break; + if (filp->f_flags & O_NDELAY) { spin_unlock_irqrestore(&emsgs_lock, flags); + return -EAGAIN; + } + nblocked_emsgs_readers++; - n = down_interruptible(&emsgs_sema); + spin_unlock_irqrestore(&emsgs_lock, flags); - spin_lock_irqsave(&emsgs_lock, flags); + n = down_interruptible(&emsgs_sema); - nblocked_emsgs_readers--; + spin_lock_irqsave(&emsgs_lock, flags); - if (n) { - spin_unlock_irqrestore(&emsgs_lock, flags); - return -ERESTARTSYS; - } - goto loop; - } - if (em->len > cnt) { + nblocked_emsgs_readers--; + + if (n) { spin_unlock_irqrestore(&emsgs_lock, flags); - return -EAGAIN; + return -ERESTARTSYS; } - mp = em->msg; - len = em->len; - em->msg = NULL; - em->flags &= ~EMFL_VALID; - - emsgs_head_idx++; - emsgs_head_idx %= ARRAY_SIZE(emsgs); - + } + if (em->len > cnt) { spin_unlock_irqrestore(&emsgs_lock, flags); - - n = copy_to_user(buf, mp, len); - kfree(mp); - return n == 0 ? len : -EFAULT; - default: - return -EFAULT; + return -EAGAIN; } + mp = em->msg; + len = em->len; + em->msg = NULL; + em->flags &= ~EMFL_VALID; + + emsgs_head_idx++; + emsgs_head_idx %= ARRAY_SIZE(emsgs); + + spin_unlock_irqrestore(&emsgs_lock, flags); + + n = copy_to_user(buf, mp, len); + kfree(mp); + return n == 0 ? len : -EFAULT; } static const struct file_operations aoe_fops = { _