mirror of
https://github.com/torvalds/linux.git
synced 2024-11-29 07:31:29 +00:00
floppy: remove floppy-specific O_EXCL handling
Block layer now handles O_EXCL in a generic way for block devices.
The semantics is however different for floppy and all other block devices,
as floppy driver contains its own O_EXCL handling.
The semantics for all-but-floppy bdevs is "there can be at most one O_EXCL
open of this file", while for floppy bdev the semantics is "if someone has
the bdev open with O_EXCL, noone else can open it".
There is actual userspace-observable change in behavior because of this
since commit e525fd89d3
("block: make blkdev_get/put() handle exclusive
access") -- on kernels containing this commit, mount of /dev/fd0 causes
the fd0 block device be claimed with _EXCL, preventing subsequent
open(/dev/fd0).
Bring things back into shape, i.e. make it possible, analogically to
other block devices, to mount the floppy and open() it afterwards --
remove the floppy-specific handling and let the generic bdev code O_EXCL
handling take over.
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Acked-by: Tejun Heo <tj@kernel.org>
Acked-by: NeilBrown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
parent
070ad7e793
commit
bfa10b8c98
@ -3607,9 +3607,7 @@ static int floppy_release(struct gendisk *disk, fmode_t mode)
|
||||
|
||||
mutex_lock(&floppy_mutex);
|
||||
mutex_lock(&open_lock);
|
||||
if (UDRS->fd_ref < 0)
|
||||
UDRS->fd_ref = 0;
|
||||
else if (!UDRS->fd_ref--) {
|
||||
if (!UDRS->fd_ref--) {
|
||||
DPRINT("floppy_release with fd_ref == 0");
|
||||
UDRS->fd_ref = 0;
|
||||
}
|
||||
@ -3645,13 +3643,7 @@ static int floppy_open(struct block_device *bdev, fmode_t mode)
|
||||
set_bit(FD_VERIFY_BIT, &UDRS->flags);
|
||||
}
|
||||
|
||||
if (UDRS->fd_ref == -1 || (UDRS->fd_ref && (mode & FMODE_EXCL)))
|
||||
goto out2;
|
||||
|
||||
if (mode & FMODE_EXCL)
|
||||
UDRS->fd_ref = -1;
|
||||
else
|
||||
UDRS->fd_ref++;
|
||||
UDRS->fd_ref++;
|
||||
|
||||
opened_bdev[drive] = bdev;
|
||||
|
||||
@ -3714,10 +3706,8 @@ static int floppy_open(struct block_device *bdev, fmode_t mode)
|
||||
mutex_unlock(&floppy_mutex);
|
||||
return 0;
|
||||
out:
|
||||
if (UDRS->fd_ref < 0)
|
||||
UDRS->fd_ref = 0;
|
||||
else
|
||||
UDRS->fd_ref--;
|
||||
UDRS->fd_ref--;
|
||||
|
||||
if (!UDRS->fd_ref)
|
||||
opened_bdev[drive] = NULL;
|
||||
out2:
|
||||
|
Loading…
Reference in New Issue
Block a user