|
@@ -438,7 +438,8 @@ static QemuOptsList raw_runtime_opts = {
|
|
|
};
|
|
|
|
|
|
static int raw_open_common(BlockDriverState *bs, QDict *options,
|
|
|
- int bdrv_flags, int open_flags, Error **errp)
|
|
|
+ int bdrv_flags, int open_flags,
|
|
|
+ bool device, Error **errp)
|
|
|
{
|
|
|
BDRVRawState *s = bs->opaque;
|
|
|
QemuOpts *opts;
|
|
@@ -585,10 +586,32 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
|
|
|
error_setg_errno(errp, errno, "Could not stat file");
|
|
|
goto fail;
|
|
|
}
|
|
|
- if (S_ISREG(st.st_mode)) {
|
|
|
- s->discard_zeroes = true;
|
|
|
- s->has_fallocate = true;
|
|
|
+
|
|
|
+ if (!device) {
|
|
|
+ if (S_ISBLK(st.st_mode)) {
|
|
|
+ warn_report("Opening a block device as a file using the '%s' "
|
|
|
+ "driver is deprecated", bs->drv->format_name);
|
|
|
+ } else if (S_ISCHR(st.st_mode)) {
|
|
|
+ warn_report("Opening a character device as a file using the '%s' "
|
|
|
+ "driver is deprecated", bs->drv->format_name);
|
|
|
+ } else if (!S_ISREG(st.st_mode)) {
|
|
|
+ error_setg(errp, "A regular file was expected by the '%s' driver, "
|
|
|
+ "but something else was given", bs->drv->format_name);
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto fail;
|
|
|
+ } else {
|
|
|
+ s->discard_zeroes = true;
|
|
|
+ s->has_fallocate = true;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (!(S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode))) {
|
|
|
+ error_setg(errp, "'%s' driver expects either "
|
|
|
+ "a character or block device", bs->drv->format_name);
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto fail;
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
if (S_ISBLK(st.st_mode)) {
|
|
|
#ifdef BLKDISCARDZEROES
|
|
|
unsigned int arg;
|
|
@@ -641,7 +664,7 @@ static int raw_open(BlockDriverState *bs, QDict *options, int flags,
|
|
|
BDRVRawState *s = bs->opaque;
|
|
|
|
|
|
s->type = FTYPE_FILE;
|
|
|
- return raw_open_common(bs, options, flags, 0, errp);
|
|
|
+ return raw_open_common(bs, options, flags, 0, false, errp);
|
|
|
}
|
|
|
|
|
|
typedef enum {
|
|
@@ -2939,7 +2962,7 @@ hdev_open_Mac_error:
|
|
|
|
|
|
s->type = FTYPE_FILE;
|
|
|
|
|
|
- ret = raw_open_common(bs, options, flags, 0, &local_err);
|
|
|
+ ret = raw_open_common(bs, options, flags, 0, true, &local_err);
|
|
|
if (ret < 0) {
|
|
|
error_propagate(errp, local_err);
|
|
|
#if defined(__APPLE__) && defined(__MACH__)
|
|
@@ -3170,7 +3193,7 @@ static int cdrom_open(BlockDriverState *bs, QDict *options, int flags,
|
|
|
s->type = FTYPE_CD;
|
|
|
|
|
|
/* open will not fail even if no CD is inserted, so add O_NONBLOCK */
|
|
|
- return raw_open_common(bs, options, flags, O_NONBLOCK, errp);
|
|
|
+ return raw_open_common(bs, options, flags, O_NONBLOCK, true, errp);
|
|
|
}
|
|
|
|
|
|
static int cdrom_probe_device(const char *filename)
|
|
@@ -3284,7 +3307,7 @@ static int cdrom_open(BlockDriverState *bs, QDict *options, int flags,
|
|
|
|
|
|
s->type = FTYPE_CD;
|
|
|
|
|
|
- ret = raw_open_common(bs, options, flags, 0, &local_err);
|
|
|
+ ret = raw_open_common(bs, options, flags, 0, true, &local_err);
|
|
|
if (ret) {
|
|
|
error_propagate(errp, local_err);
|
|
|
return ret;
|