[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v7 12/35] util: let qemu_fd_getlength support block
From: |
Xiao Guangrong |
Subject: |
[Qemu-devel] [PATCH v7 12/35] util: let qemu_fd_getlength support block device |
Date: |
Mon, 2 Nov 2015 17:13:14 +0800 |
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;
--
1.8.3.1
- Re: [Qemu-devel] [PATCH v7 11/35] util: introduce qemu_file_getlength(), (continued)
Re: [Qemu-devel] [PATCH v7 11/35] util: introduce qemu_file_getlength(), Eduardo Habkost, 2015/11/06
[Qemu-devel] [PATCH v7 13/35] hostmem-file: use whole file size if possible, Xiao Guangrong, 2015/11/02
[Qemu-devel] [PATCH v7 14/35] pc-dimm: remove DEFAULT_PC_DIMMSIZE, Xiao Guangrong, 2015/11/02
[Qemu-devel] [PATCH v7 12/35] util: let qemu_fd_getlength support block device,
Xiao Guangrong <=
Re: [Qemu-devel] [PATCH v7 12/35] util: let qemu_fd_getlength support block device, Eduardo Habkost, 2015/11/06
Re: [Qemu-devel] [PATCH v7 12/35] util: let qemu_fd_getlength support block device, Eduardo Habkost, 2015/11/06
[Qemu-devel] [PATCH v7 15/35] pc-dimm: make pc_existing_dimms_capacity static and rename it, Xiao Guangrong, 2015/11/02
[Qemu-devel] [PATCH v7 18/35] pc-dimm: rename pc-dimm.c and pc-dimm.h, Xiao Guangrong, 2015/11/02
[Qemu-devel] [PATCH v7 16/35] pc-dimm: drop the prefix of pc-dimm, Xiao Guangrong, 2015/11/02