| From: Finn Thain <fthain@telegraphics.com.au> |
| Date: Mon, 31 Dec 2018 16:44:09 +1100 |
| Subject: block/swim3: Fix -EBUSY error when re-opening device after unmount |
| |
| commit 296dcc40f2f2e402facf7cd26cf3f2c8f4b17d47 upstream. |
| |
| When the block device is opened with FMODE_EXCL, ref_count is set to -1. |
| This value doesn't get reset when the device is closed which means the |
| device cannot be opened again. Fix this by checking for refcount <= 0 |
| in the release method. |
| |
| Reported-and-tested-by: Stan Johnson <userm57@yahoo.com> |
| Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") |
| Cc: linuxppc-dev@lists.ozlabs.org |
| Signed-off-by: Finn Thain <fthain@telegraphics.com.au> |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/block/swim3.c | 6 +++++- |
| 1 file changed, 5 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/block/swim3.c |
| +++ b/drivers/block/swim3.c |
| @@ -1027,7 +1027,11 @@ static void floppy_release(struct gendis |
| struct swim3 __iomem *sw = fs->swim3; |
| |
| mutex_lock(&swim3_mutex); |
| - if (fs->ref_count > 0 && --fs->ref_count == 0) { |
| + if (fs->ref_count > 0) |
| + --fs->ref_count; |
| + else if (fs->ref_count == -1) |
| + fs->ref_count = 0; |
| + if (fs->ref_count == 0) { |
| swim3_action(fs, MOTOR_OFF); |
| out_8(&sw->control_bic, 0xff); |
| swim3_select(fs, RELAX); |