Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/external/cddl/osnet/dist/lib/libzpool/common Hacks to get zd...
details: https://anonhg.NetBSD.org/src/rev/c04c267b3f4d
branches: trunk
changeset: 990448:c04c267b3f4d
user: simonb <simonb%NetBSD.org@localhost>
date: Wed Oct 27 11:35:23 2021 +0000
description:
Hacks to get zdb working on NetBSD:
- Force accessing raw device but we're passed the block device.
- Deal with wedges not returning their size on a stat(2) and use
the DIOCGMEDIASIZE ioctl instead.
Ok chs@.
diffstat:
external/cddl/osnet/dist/lib/libzpool/common/kernel.c | 32 +++++++++++++++++++
1 files changed, 32 insertions(+), 0 deletions(-)
diffs (63 lines):
diff -r a8490e4fbabf -r c04c267b3f4d external/cddl/osnet/dist/lib/libzpool/common/kernel.c
--- a/external/cddl/osnet/dist/lib/libzpool/common/kernel.c Wed Oct 27 11:27:25 2021 +0000
+++ b/external/cddl/osnet/dist/lib/libzpool/common/kernel.c Wed Oct 27 11:35:23 2021 +0000
@@ -41,6 +41,11 @@
#include <sys/utsname.h>
#include <sys/systeminfo.h>
+#ifdef __NetBSD__
+#include <sys/dkio.h>
+#include <sys/ioctl.h>
+#endif
+
/*
* Emulation of kernel services in userland.
*/
@@ -447,6 +452,17 @@
*/
if (strncmp(path, "/dev/", 5) == 0) {
char *dsk;
+#ifdef __NetBSD__
+ /*
+ * For NetBSD, we've been passed in a block device name
+ * but need to convert to the character device name.
+ * XXX a bit ugly...
+ */
+ char rawpath[MAXPATHLEN];
+
+ snprintf(rawpath, sizeof(rawpath), "/dev/r%s", path + 5);
+ path = rawpath; /* gets strdup()'d below */
+#endif /* __NetBSD__ */
fd = open64(path, O_RDONLY);
if (fd == -1)
return (errno);
@@ -454,6 +470,14 @@
close(fd);
return (errno);
}
+#ifdef __NetBSD__
+ if (st.st_size == 0) {
+ off_t dsize;
+
+ if (ioctl(fd, DIOCGMEDIASIZE, &dsize) == 0)
+ st.st_size = dsize;
+ }
+#endif /* __NetBSD__ */
close(fd);
(void) sprintf(realpath, "%s", path);
dsk = strstr(path, "/dsk/");
@@ -587,6 +611,14 @@
close(vp->v_fd);
return (errno);
}
+#ifdef __NetBSD__
+ if (st.st_size == 0) {
+ off_t dsize;
+
+ if (ioctl(vp->v_fd, DIOCGMEDIASIZE, &dsize) == 0)
+ st.st_size = dsize;
+ }
+#endif /* __NetBSD__ */
vap->va_size = st.st_size;
return (0);
Home |
Main Index |
Thread Index |
Old Index