]> xenbits.xensource.com Git - people/dstodden/blktap.git/commitdiff
CA-30475; Use the BLKGETSIZE64 ioctl when querying a raw device for it's size.
authorJulian Chesterfield <julian@xensource.com>
Thu, 25 Jun 2009 13:25:23 +0000 (14:25 +0100)
committerJulian Chesterfield <julian@xensource.com>
Thu, 25 Jun 2009 13:25:23 +0000 (14:25 +0100)
drivers/block-aio.c
drivers/tapdisk-utils.c

index 2c5af1483cf97db779441f6d50a3b4d4b98ddf8e..246f2b029c7af8996c3689b12ba2eb1bc92f4f58 100644 (file)
@@ -67,6 +67,7 @@ static int tdaio_get_image_info(int fd, td_disk_info_t *info)
        int ret;
        long size;
        unsigned long total_size;
+       unsigned long long bytes;
        struct statvfs statBuf;
        struct stat stat;
 
@@ -79,8 +80,10 @@ static int tdaio_get_image_info(int fd, td_disk_info_t *info)
        if (S_ISBLK(stat.st_mode)) {
                /*Accessing block device directly*/
                info->size = 0;
-               if (ioctl(fd,BLKGETSIZE,&info->size)!=0) {
-                       DPRINTF("ERR: BLKGETSIZE failed, couldn't stat image");
+               if (ioctl(fd,BLKGETSIZE64,&bytes)==0) {
+                       info->size = bytes >> SECTOR_SHIFT;
+               } else if (ioctl(fd,BLKGETSIZE,&info->size)!=0) {
+                       DPRINTF("ERR: BLKGETSIZE and BLKGETSIZE64 failed, couldn't stat image");
                        return -EINVAL;
                }
 
index 83983c5d20125120d6cf7cf12eca1e58bfc8f45c..7d49104e71abe50f1c001fc287ca8e1d019d1ff0 100644 (file)
@@ -144,7 +144,7 @@ tapdisk_get_image_size(int fd, uint64_t *_sectors, uint32_t *_sector_size)
 {
        int ret;
        struct stat stat;
-       uint64_t sectors;
+       uint64_t sectors, bytes;
        uint32_t sector_size;
 
        sectors       = 0;
@@ -159,8 +159,10 @@ tapdisk_get_image_size(int fd, uint64_t *_sectors, uint32_t *_sector_size)
 
        if (S_ISBLK(stat.st_mode)) {
                /*Accessing block device directly*/
-               if (ioctl(fd, BLKGETSIZE, &sectors)) {
-                       DPRINTF("ERR: BLKGETSIZE failed, couldn't stat image");
+               if (ioctl(fd,BLKGETSIZE64,&bytes)==0) {
+                       sectors = bytes >> SECTOR_SHIFT;
+               } else if (ioctl(fd,BLKGETSIZE,&sectors)!=0) {
+                       DPRINTF("ERR: BLKGETSIZE and BLKGETSIZE64 failed, couldn't stat image");
                        return -EINVAL;
                }