mirror of https://github.com/proxmox/mirror_qemu
raw-posix: Factor block size detection out of raw_probe_alignment()
Put it in new probe_logical_blocksize(). Signed-off-by: Ekaterina Tumanova <tumanova@linux.vnet.ibm.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Message-id: 1424087278-49393-3-git-send-email-tumanova@linux.vnet.ibm.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>master
parent
892b7de832
commit
8a4ed0d1b1
|
@ -218,11 +218,43 @@ static int raw_normalize_devicepath(const char **filename)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get logical block size via ioctl. On success store it in @sector_size_p.
|
||||||
|
*/
|
||||||
|
static int probe_logical_blocksize(int fd, unsigned int *sector_size_p)
|
||||||
|
{
|
||||||
|
unsigned int sector_size;
|
||||||
|
bool success = false;
|
||||||
|
|
||||||
|
errno = ENOTSUP;
|
||||||
|
|
||||||
|
/* Try a few ioctls to get the right size */
|
||||||
|
#ifdef BLKSSZGET
|
||||||
|
if (ioctl(fd, BLKSSZGET, §or_size) >= 0) {
|
||||||
|
*sector_size_p = sector_size;
|
||||||
|
success = true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef DKIOCGETBLOCKSIZE
|
||||||
|
if (ioctl(fd, DKIOCGETBLOCKSIZE, §or_size) >= 0) {
|
||||||
|
*sector_size_p = sector_size;
|
||||||
|
success = true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef DIOCGSECTORSIZE
|
||||||
|
if (ioctl(fd, DIOCGSECTORSIZE, §or_size) >= 0) {
|
||||||
|
*sector_size_p = sector_size;
|
||||||
|
success = true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return success ? 0 : -errno;
|
||||||
|
}
|
||||||
|
|
||||||
static void raw_probe_alignment(BlockDriverState *bs, int fd, Error **errp)
|
static void raw_probe_alignment(BlockDriverState *bs, int fd, Error **errp)
|
||||||
{
|
{
|
||||||
BDRVRawState *s = bs->opaque;
|
BDRVRawState *s = bs->opaque;
|
||||||
char *buf;
|
char *buf;
|
||||||
unsigned int sector_size;
|
|
||||||
|
|
||||||
/* For /dev/sg devices the alignment is not really used.
|
/* For /dev/sg devices the alignment is not really used.
|
||||||
With buffered I/O, we don't have any restrictions. */
|
With buffered I/O, we don't have any restrictions. */
|
||||||
|
@ -232,25 +264,12 @@ static void raw_probe_alignment(BlockDriverState *bs, int fd, Error **errp)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try a few ioctls to get the right size */
|
|
||||||
bs->request_alignment = 0;
|
bs->request_alignment = 0;
|
||||||
s->buf_align = 0;
|
s->buf_align = 0;
|
||||||
|
/* Let's try to use the logical blocksize for the alignment. */
|
||||||
#ifdef BLKSSZGET
|
if (probe_logical_blocksize(fd, &bs->request_alignment) < 0) {
|
||||||
if (ioctl(fd, BLKSSZGET, §or_size) >= 0) {
|
bs->request_alignment = 0;
|
||||||
bs->request_alignment = sector_size;
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#ifdef DKIOCGETBLOCKSIZE
|
|
||||||
if (ioctl(fd, DKIOCGETBLOCKSIZE, §or_size) >= 0) {
|
|
||||||
bs->request_alignment = sector_size;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef DIOCGSECTORSIZE
|
|
||||||
if (ioctl(fd, DIOCGSECTORSIZE, §or_size) >= 0) {
|
|
||||||
bs->request_alignment = sector_size;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_XFS
|
#ifdef CONFIG_XFS
|
||||||
if (s->is_xfs) {
|
if (s->is_xfs) {
|
||||||
struct dioattr da;
|
struct dioattr da;
|
||||||
|
|
Loading…
Reference in New Issue