Skip to content

Commit

Permalink
file-posix: Move check_hdev_writable() up
Browse files Browse the repository at this point in the history
We'll need to call it in raw_open_common(), so move the function to
avoid a forward declaration.

Signed-off-by: Kevin Wolf <[email protected]>
Message-Id: <[email protected]>
Reviewed-by: Max Reitz <[email protected]>
Signed-off-by: Kevin Wolf <[email protected]>
  • Loading branch information
kevmw committed Jul 17, 2020
1 parent 5edc855 commit 20eaf1b
Showing 1 changed file with 33 additions and 33 deletions.
66 changes: 33 additions & 33 deletions block/file-posix.c
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,39 @@ static void raw_probe_alignment(BlockDriverState *bs, int fd, Error **errp)
}
}

static int check_hdev_writable(BDRVRawState *s)
{
#if defined(BLKROGET)
/* Linux block devices can be configured "read-only" using blockdev(8).
* This is independent of device node permissions and therefore open(2)
* with O_RDWR succeeds. Actual writes fail with EPERM.
*
* bdrv_open() is supposed to fail if the disk is read-only. Explicitly
* check for read-only block devices so that Linux block devices behave
* properly.
*/
struct stat st;
int readonly = 0;

if (fstat(s->fd, &st)) {
return -errno;
}

if (!S_ISBLK(st.st_mode)) {
return 0;
}

if (ioctl(s->fd, BLKROGET, &readonly) < 0) {
return -errno;
}

if (readonly) {
return -EACCES;
}
#endif /* defined(BLKROGET) */
return 0;
}

static void raw_parse_flags(int bdrv_flags, int *open_flags, bool has_writers)
{
bool read_write = false;
Expand Down Expand Up @@ -3323,39 +3356,6 @@ static int hdev_probe_device(const char *filename)
return 0;
}

static int check_hdev_writable(BDRVRawState *s)
{
#if defined(BLKROGET)
/* Linux block devices can be configured "read-only" using blockdev(8).
* This is independent of device node permissions and therefore open(2)
* with O_RDWR succeeds. Actual writes fail with EPERM.
*
* bdrv_open() is supposed to fail if the disk is read-only. Explicitly
* check for read-only block devices so that Linux block devices behave
* properly.
*/
struct stat st;
int readonly = 0;

if (fstat(s->fd, &st)) {
return -errno;
}

if (!S_ISBLK(st.st_mode)) {
return 0;
}

if (ioctl(s->fd, BLKROGET, &readonly) < 0) {
return -errno;
}

if (readonly) {
return -EACCES;
}
#endif /* defined(BLKROGET) */
return 0;
}

static void hdev_parse_filename(const char *filename, QDict *options,
Error **errp)
{
Expand Down

0 comments on commit 20eaf1b

Please sign in to comment.