block: allow filenames with colons again for host devices

Before the raw/file split we used to allow filenames with colons for host
device only.  While this was more by accident than by design people rely
on it, so we need to bring it back.

So move the host device probing to be before the protocol detection
again.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Christoph Hellwig 2010-06-23 12:25:17 +02:00 committed by Kevin Wolf
parent 19dbcbf7cc
commit 39508e7adb

33
block.c
View File

@ -288,24 +288,31 @@ BlockDriver *bdrv_find_protocol(const char *filename)
char protocol[128]; char protocol[128];
int len; int len;
const char *p; const char *p;
int is_drive;
/* TODO Drivers without bdrv_file_open must be specified explicitly */ /* TODO Drivers without bdrv_file_open must be specified explicitly */
#ifdef _WIN32 /*
is_drive = is_windows_drive(filename) || * XXX(hch): we really should not let host device detection
is_windows_drive_prefix(filename); * override an explicit protocol specification, but moving this
#else * later breaks access to device names with colons in them.
is_drive = 0; * Thanks to the brain-dead persistent naming schemes on udev-
#endif * based Linux systems those actually are quite common.
p = strchr(filename, ':'); */
if (!p || is_drive) { drv1 = find_hdev_driver(filename);
drv1 = find_hdev_driver(filename); if (drv1) {
if (!drv1) {
drv1 = bdrv_find_format("file");
}
return drv1; return drv1;
} }
#ifdef _WIN32
if (is_windows_drive(filename) ||
is_windows_drive_prefix(filename))
return bdrv_find_format("file");
#endif
p = strchr(filename, ':');
if (!p) {
return bdrv_find_format("file");
}
len = p - filename; len = p - filename;
if (len > sizeof(protocol) - 1) if (len > sizeof(protocol) - 1)
len = sizeof(protocol) - 1; len = sizeof(protocol) - 1;