qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v7 12/35] util: let qemu_fd_getlength support bl


From: Xiao Guangrong
Subject: Re: [Qemu-devel] [PATCH v7 12/35] util: let qemu_fd_getlength support block device
Date: Tue, 3 Nov 2015 00:21:30 +0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0



On 11/03/2015 12:11 AM, Vladimir Sementsov-Ogievskiy wrote:
On 02.11.2015 12:13, Xiao Guangrong wrote:
lseek can not work for all block devices as the man page says:
| Some devices are incapable of seeking and POSIX does not specify
| which devices must support lseek().

This patch tries to add the support on Linux by using BLKGETSIZE64
ioctl

Signed-off-by: Xiao Guangrong <address@hidden>
---
  util/osdep.c | 20 ++++++++++++++++++++
  1 file changed, 20 insertions(+)

diff --git a/util/osdep.c b/util/osdep.c
index 5a61e19..b20c793 100644
--- a/util/osdep.c
+++ b/util/osdep.c
@@ -45,6 +45,11 @@
  extern int madvise(caddr_t, size_t, int);
  #endif
+#ifdef CONFIG_LINUX
+#include <sys/ioctl.h>
+#include <linux/fs.h>
+#endif
+
  #include "qemu-common.h"
  #include "qemu/sockets.h"
  #include "qemu/error-report.h"
@@ -433,6 +438,21 @@ int64_t qemu_fd_getlength(int fd)
  {
      int64_t size;
+#ifdef CONFIG_LINUX
+    struct stat stat_buf;
+    if (fstat(fd, &stat_buf) < 0) {
+        return -errno;
+    }
+
+    if ((S_ISBLK(stat_buf.st_mode)) && !ioctl(fd, BLKGETSIZE64, &size)) {
+        /* The size of block device is larger than max int64_t? */
+        if (size < 0) {
+            return -EOVERFLOW;
+        }
+        return size;
+    }
+#endif
+
      size = lseek(fd, 0, SEEK_END);
      if (size < 0) {
          return -errno;

Reviewed-by: Vladimir Sementsov-Ogievskiy <address@hidden>

just a question: is there any use for stat.st_size ? Is it always worse then 
lseek?

The man page says:
The  st_size field gives the size of the file (if it is a regular file or a 
symbolic link)
in bytes.  The size of a symbolic link is the length of the pathname it 
contains, without a
terminating null byte.

So it can not work on symbolic link.

Does it work for
blk?


Quickly checked with a program written by myself and 'stat' command, the answer 
is NO. :)

also, "This patch tries to add..". Hmm. It looks like this patch is not sure 
about will it success.
I'd prefer "This patch adds", but this is not important


Thanks for your sharing. I did not know the different, now, i got it. :)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]