Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ff06db1e authored by Jiri Kosina's avatar Jiri Kosina Committed by Jens Axboe
Browse files

floppy: fix open(O_ACCMODE) for ioctl-only open



Commit 09954bad ("floppy: refactor open() flags handling"), as a
side-effect, causes open(/dev/fdX, O_ACCMODE) to fail. It turns out that
this is being used setfdprm userspace for ioctl-only open().

Reintroduce back the original behavior wrt !(FMODE_READ|FMODE_WRITE)
modes, while still keeping the original O_NDELAY bug fixed.

Cc: stable@vger.kernel.org # v4.5+
Reported-by: default avatarWim Osterholt <wim@djo.tudelft.nl>
Tested-by: default avatarWim Osterholt <wim@djo.tudelft.nl>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent c1ece767
Loading
Loading
Loading
Loading
+9 −12
Original line number Diff line number Diff line
@@ -3663,11 +3663,6 @@ static int floppy_open(struct block_device *bdev, fmode_t mode)

	opened_bdev[drive] = bdev;

	if (!(mode & (FMODE_READ|FMODE_WRITE))) {
		res = -EINVAL;
		goto out;
	}

	res = -ENXIO;

	if (!floppy_track_buffer) {
@@ -3711,6 +3706,7 @@ static int floppy_open(struct block_device *bdev, fmode_t mode)
	if (UFDCS->rawcmd == 1)
		UFDCS->rawcmd = 2;

	if (mode & (FMODE_READ|FMODE_WRITE)) {
		UDRS->last_checked = 0;
		clear_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags);
		check_disk_change(bdev);
@@ -3718,6 +3714,7 @@ static int floppy_open(struct block_device *bdev, fmode_t mode)
			goto out;
		if (test_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags))
			goto out;
	}

	res = -EROFS;