diff options
author | Quentin Lambert <lambert.quentin@gmail.com> | 2015-03-11 15:22:01 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-03-12 11:13:41 +0100 |
commit | c84a083b995b0bde61640b6576f9c80584915b7a (patch) | |
tree | 714df51147159edfeb2d064a4292dbd32aaaa12b /drivers/staging/dgnc | |
parent | f6a14cf04fdb17de8a96c59518909216f6892e19 (diff) | |
download | linux-c84a083b995b0bde61640b6576f9c80584915b7a.tar.bz2 |
Staging: dgnc: Use goto for spinlock release before return
spin_unlock_irqrestore() is called at several
different places before exiting. This patch uses a goto statement
to factorize these calls.
Coccinelle was used to generate this patch.
Signed-off-by: Quentin Lambert <lambert.quentin@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/dgnc')
-rw-r--r-- | drivers/staging/dgnc/dgnc_tty.c | 48 |
1 files changed, 23 insertions, 25 deletions
diff --git a/drivers/staging/dgnc/dgnc_tty.c b/drivers/staging/dgnc/dgnc_tty.c index d78e5bff36c6..8445f84ddaa3 100644 --- a/drivers/staging/dgnc/dgnc_tty.c +++ b/drivers/staging/dgnc/dgnc_tty.c @@ -492,7 +492,7 @@ void dgnc_input(struct channel_t *ch) { struct dgnc_board *bd; struct tty_struct *tp; - struct tty_ldisc *ld; + struct tty_ldisc *ld = NULL; uint rmask; ushort head; ushort tail; @@ -524,10 +524,8 @@ void dgnc_input(struct channel_t *ch) tail = ch->ch_r_tail & rmask; data_len = (head - tail) & rmask; - if (data_len == 0) { - spin_unlock_irqrestore(&ch->ch_lock, flags); - return; - } + if (data_len == 0) + goto exit_unlock; /* * If the device is not open, or CREAD is off, @@ -541,17 +539,14 @@ void dgnc_input(struct channel_t *ch) /* Force queue flow control to be released, if needed */ dgnc_check_queue_flow_control(ch); - spin_unlock_irqrestore(&ch->ch_lock, flags); - return; + goto exit_unlock; } /* * If we are throttled, simply don't read any data. */ - if (ch->ch_flags & CH_FORCED_STOPI) { - spin_unlock_irqrestore(&ch->ch_lock, flags); - return; - } + if (ch->ch_flags & CH_FORCED_STOPI) + goto exit_unlock; flip_len = TTY_FLIPBUF_SIZE; @@ -589,12 +584,8 @@ void dgnc_input(struct channel_t *ch) } } - if (len <= 0) { - spin_unlock_irqrestore(&ch->ch_lock, flags); - if (ld) - tty_ldisc_deref(ld); - return; - } + if (len <= 0) + goto exit_unlock; /* * The tty layer in the kernel has changed in 2.6.16+. @@ -662,6 +653,12 @@ void dgnc_input(struct channel_t *ch) if (ld) tty_ldisc_deref(ld); + return; + +exit_unlock: + if (ld) + tty_ldisc_deref(ld); + spin_unlock_irqrestore(&ch->ch_lock, flags); } @@ -1758,10 +1755,8 @@ static int dgnc_tty_write(struct tty_struct *tty, /* * Bail if no space left. */ - if (count <= 0) { - spin_unlock_irqrestore(&ch->ch_lock, flags); - return 0; - } + if (count <= 0) + goto exit_retry; /* * Output the printer ON string, if we are in terminal mode, but @@ -1788,10 +1783,8 @@ static int dgnc_tty_write(struct tty_struct *tty, /* * If there is nothing left to copy, or I can't handle any more data, leave. */ - if (count <= 0) { - spin_unlock_irqrestore(&ch->ch_lock, flags); - return 0; - } + if (count <= 0) + goto exit_retry; if (from_user) { @@ -1877,6 +1870,11 @@ static int dgnc_tty_write(struct tty_struct *tty, } return count; + +exit_retry: + + spin_unlock_irqrestore(&ch->ch_lock, flags); + return 0; } |