[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 2/6] geometry: Detect blocksize via ioctls in
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [PATCH v2 2/6] geometry: Detect blocksize via ioctls in separate static functions |
Date: |
Fri, 28 Nov 2014 13:52:56 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) |
Ekaterina Tumanova <address@hidden> writes:
>>
>> Suggest function comment
>>
>> /**
>> * Return logical block size, or zero if we can't figure it out
>> */
>>
>>> {
>>> - BDRVRawState *s = bs->opaque;
>>> - char *buf;
>>> - unsigned int sector_size;
>>> -
>>> - /* For /dev/sg devices the alignment is not really used.
>>> - With buffered I/O, we don't have any restrictions. */
>>> - if (bs->sg || !s->needs_alignment) {
>>> - bs->request_alignment = 1;
>>> - s->buf_align = 1;
>>> - return;
>>> - }
>>> + unsigned int sector_size = 0;
>>
>> Pointless initialization.
>
> If I do not initialize the sector_size, and the ioctl fails,
> I will return garbage as a blocksize to the caller.
Where? As far as I can see, we return it only after ioctl() succeeded.
>>>
>>> /* Try a few ioctls to get the right size */
>>> - bs->request_alignment = 0;
>>> - s->buf_align = 0;
>>> -
>>> #ifdef BLKSSZGET
>>> if (ioctl(fd, BLKSSZGET, §or_size) >= 0) {
>>> - bs->request_alignment = sector_size;
>>> + return sector_size;
>>> }
>>> #endif
>>> #ifdef DKIOCGETBLOCKSIZE
>>> if (ioctl(fd, DKIOCGETBLOCKSIZE, §or_size) >= 0) {
>>> - bs->request_alignment = sector_size;
>>> + return sector_size;
>>> }
>>> #endif
>>> #ifdef DIOCGSECTORSIZE
>>> if (ioctl(fd, DIOCGSECTORSIZE, §or_size) >= 0) {
>>> - bs->request_alignment = sector_size;
>>> + return sector_size;
>>> }
>>> #endif
>>> #ifdef CONFIG_XFS
>>> if (s->is_xfs) {
>>> struct dioattr da;
>>> if (xfsctl(NULL, fd, XFS_IOC_DIOINFO, &da) >= 0) {
>>> - bs->request_alignment = da.d_miniosz;
>>> + sector_size = da.d_miniosz;
>>> /* The kernel returns wrong information for d_mem */
>>> /* s->buf_align = da.d_mem; */
>>
>> Since you keep the enabled assignments to s->buf_align out of this
>> function, you should keep out this disabled one, too.
>>
>>> + return sector_size;
>>> }
>>> }
>>> #endif
>>>
>>> + return 0;
>>> +}
>>> +
>>> +static unsigned int probe_physical_blocksize(BlockDriverState *bs, int fd)
>>
>> Parameter bs is unused, let's drop it.
>>
>>> +{
>>> + unsigned int blk_size = 0;
>>
>> Pointless initialization.
>
> Same here.
Again, we return it only after ioctl() succeeded.
>>> +#ifdef BLKPBSZGET
>>> + if (ioctl(fd, BLKPBSZGET, &blk_size) >= 0) {
>>> + return blk_size;
>>> + }
>>> +#endif
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +static void raw_probe_alignment(BlockDriverState *bs, int fd, Error **errp)
>>> +{
>>> + BDRVRawState *s = bs->opaque;
>>> + char *buf;
>>> +
>>> + /* For /dev/sg devices the alignment is not really used.
>>> + With buffered I/O, we don't have any restrictions. */
>>> + if (bs->sg || !s->needs_alignment) {
>>> + bs->request_alignment = 1;
>>> + s->buf_align = 1;
>>> + return;
>>> + }
>>> +
>>> + s->buf_align = 0;
>>> + /* Let's try to use the logical blocksize for the alignment. */
>>> + bs->request_alignment = probe_logical_blocksize(bs, fd);
>>> +
>>> /* If we could not get the sizes so far, we can only guess them */
>>> if (!s->buf_align) {
>>> size_t align;
>>
[Qemu-devel] [PATCH v2 3/6] geometry: Add driver methods to probe blocksizes and geometry, Ekaterina Tumanova, 2014/11/19
[Qemu-devel] [PATCH v2 4/6] geometry: Add block-backend wrappers for geometry probing, Ekaterina Tumanova, 2014/11/19
[Qemu-devel] [PATCH v2 5/6] geometry: Call backend function to detect geometry and blocksize, Ekaterina Tumanova, 2014/11/19
Re: [Qemu-devel] [PATCH v2 5/6] geometry: Call backend function to detect geometry and blocksize, Markus Armbruster, 2014/11/28