svn commit: r286996 - in user/marcel/libvdsk: bhyve bhyveload libvdsk

Marcel Moolenaar marcel at FreeBSD.org
Fri Aug 21 15:20:04 UTC 2015


Author: marcel
Date: Fri Aug 21 15:20:01 2015
New Revision: 286996
URL: https://svnweb.freebsd.org/changeset/base/286996

Log:
  o   Add vdsk_trim() to support BOP_DELETE.
  o   Reorder arguments to vdsk_read() and vdsk_write() so that the
      offset is second, like for vdsk_trim().

Modified:
  user/marcel/libvdsk/bhyve/block_if.c
  user/marcel/libvdsk/bhyveload/bhyveload.c
  user/marcel/libvdsk/libvdsk/qcow.c
  user/marcel/libvdsk/libvdsk/raw.c
  user/marcel/libvdsk/libvdsk/vdsk.c
  user/marcel/libvdsk/libvdsk/vdsk.h
  user/marcel/libvdsk/libvdsk/vdsk_int.h
  user/marcel/libvdsk/libvdsk/vhd.c
  user/marcel/libvdsk/libvdsk/vmdk.c

Modified: user/marcel/libvdsk/bhyve/block_if.c
==============================================================================
--- user/marcel/libvdsk/bhyve/block_if.c	Fri Aug 21 15:15:22 2015	(r286995)
+++ user/marcel/libvdsk/bhyve/block_if.c	Fri Aug 21 15:20:01 2015	(r286996)
@@ -202,21 +202,16 @@ blockif_proc(struct blockif_ctxt *bc, st
 	err = 0;
 	switch (be->be_op) {
 	case BOP_READ:
-		err = vdsk_read(bc, br->br_iov, br->br_iovcnt, br->br_offset);
+		err = vdsk_read(bc, br->br_offset, br->br_iov, br->br_iovcnt);
 		break;
 	case BOP_WRITE:
-		err = vdsk_write(bc, br->br_iov, br->br_iovcnt, br->br_offset);
+		err = vdsk_write(bc, br->br_offset, br->br_iov, br->br_iovcnt);
 		break;
 	case BOP_FLUSH:
 		err = vdsk_flush(bc);
 		break;
 	case BOP_DELETE:
-		if (!bc->bc_candelete)
-			err = EOPNOTSUPP;
-		else if (bc->bc_rdonly)
-			err = EROFS;
-		else
-			err = EOPNOTSUPP;
+		err = vdsk_trim(bc, br->br_offset, br->br_resid);
 		break;
 	default:
 		err = EINVAL;

Modified: user/marcel/libvdsk/bhyveload/bhyveload.c
==============================================================================
--- user/marcel/libvdsk/bhyveload/bhyveload.c	Fri Aug 21 15:15:22 2015	(r286995)
+++ user/marcel/libvdsk/bhyveload/bhyveload.c	Fri Aug 21 15:20:01 2015	(r286996)
@@ -296,7 +296,7 @@ cb_diskread(void *arg, int unit, uint64_
 
 	iov.iov_base = to;
 	iov.iov_len = size;
-	error = vdsk_read(disk[unit], &iov, 1, from);
+	error = vdsk_read(disk[unit], from, &iov, 1);
 	if (!error)
 		*resid = 0;
 

Modified: user/marcel/libvdsk/libvdsk/qcow.c
==============================================================================
--- user/marcel/libvdsk/libvdsk/qcow.c	Fri Aug 21 15:15:22 2015	(r286995)
+++ user/marcel/libvdsk/libvdsk/qcow.c	Fri Aug 21 15:20:01 2015	(r286996)
@@ -117,16 +117,24 @@ qcow_close(struct vdsk *vdsk __unused)
 }
 
 static int
-qcow_read(struct vdsk *vdsk __unused, const struct iovec *iov __unused,
-    int iovcnt __unused, off_t offset __unused)
+qcow_read(struct vdsk *vdsk __unused, off_t offset __unused,
+    const struct iovec *iov __unused, int iovcnt __unused)
 {
 
 	return (ENOSYS);
 }
 
 static int
-qcow_write(struct vdsk *vdsk __unused, const struct iovec *iov __unused,
-    int iovcnt __unused, off_t offset __unused)
+qcow_write(struct vdsk *vdsk __unused, off_t offset __unused,
+    const struct iovec *iov __unused, int iovcnt __unused)
+{
+
+	return (ENOSYS);
+}
+
+static int
+qcow_trim(struct vdsk *vdsk __unused, off_t offset __unused,
+    ssize_t length __unused)
 {
 
 	return (ENOSYS);
@@ -148,6 +156,7 @@ static struct vdsk_format qcow_format = 
 	.close = qcow_close,
 	.read = qcow_read,
 	.write = qcow_write,
+	.trim = qcow_trim,
 	.flush = qcow_flush,
 };
 FORMAT_DEFINE(qcow_format);

Modified: user/marcel/libvdsk/libvdsk/raw.c
==============================================================================
--- user/marcel/libvdsk/libvdsk/raw.c	Fri Aug 21 15:15:22 2015	(r286995)
+++ user/marcel/libvdsk/libvdsk/raw.c	Fri Aug 21 15:20:01 2015	(r286996)
@@ -62,7 +62,7 @@ raw_close(struct vdsk *vdsk __unused)
 }
 
 static int
-raw_read(struct vdsk *vdsk, const struct iovec *iov, int iovcnt, off_t offset)
+raw_read(struct vdsk *vdsk, off_t offset, const struct iovec *iov, int iovcnt)
 {
 	ssize_t res;
 
@@ -71,7 +71,7 @@ raw_read(struct vdsk *vdsk, const struct
 }
 
 static int
-raw_write(struct vdsk *vdsk, const struct iovec *iov, int iovcnt, off_t offset)
+raw_write(struct vdsk *vdsk, off_t offset, const struct iovec *iov, int iovcnt)
 {
 	ssize_t res;
 
@@ -80,6 +80,14 @@ raw_write(struct vdsk *vdsk, const struc
 }
 
 static int
+raw_trim(struct vdsk *vdsk __unused, off_t offset __unused,
+    ssize_t length __unused)
+{
+
+	return (EOPNOTSUPP);
+}
+
+static int
 raw_flush(struct vdsk *vdsk)
 {
 	int res;
@@ -97,6 +105,7 @@ static struct vdsk_format raw_format = {
 	.close = raw_close,
 	.read = raw_read,
 	.write = raw_write,
+	.trim = raw_trim,
 	.flush = raw_flush,
 };
 FORMAT_DEFINE(raw_format);

Modified: user/marcel/libvdsk/libvdsk/vdsk.c
==============================================================================
--- user/marcel/libvdsk/libvdsk/vdsk.c	Fri Aug 21 15:15:22 2015	(r286995)
+++ user/marcel/libvdsk/libvdsk/vdsk.c	Fri Aug 21 15:20:01 2015	(r286996)
@@ -209,21 +209,31 @@ vdsk_sectorsize(vdskctx ctx)
 }
 
 int
-vdsk_read(vdskctx ctx, const struct iovec *iov, int iovcnt, off_t offset)
+vdsk_read(vdskctx ctx, off_t offset, const struct iovec *iov, int iovcnt)
 {
 	struct vdsk *vdsk = vdsk_deref(ctx);
 
-	return (vdsk->fmt->read(vdsk, iov, iovcnt, offset));
+	return (vdsk->fmt->read(vdsk, offset, iov, iovcnt));
 }
 
 int
-vdsk_write(vdskctx ctx, const struct iovec *iov, int iovcnt, off_t offset)
+vdsk_write(vdskctx ctx, off_t offset, const struct iovec *iov, int iovcnt)
 {
 	struct vdsk *vdsk = vdsk_deref(ctx);
 
 	if ((vdsk->fflags & FWRITE) == 0)
 		return (EROFS);
-	return (vdsk->fmt->write(vdsk, iov, iovcnt, offset));
+	return (vdsk->fmt->write(vdsk, offset, iov, iovcnt));
+}
+
+int
+vdsk_trim(vdskctx ctx, off_t offset, ssize_t length)
+{
+	struct vdsk *vdsk = vdsk_deref(ctx);
+
+	if ((vdsk->fflags & FWRITE) == 0)
+		return (EROFS);
+	return (vdsk->fmt->trim(vdsk, offset, length));
 }
 
 int

Modified: user/marcel/libvdsk/libvdsk/vdsk.h
==============================================================================
--- user/marcel/libvdsk/libvdsk/vdsk.h	Fri Aug 21 15:15:22 2015	(r286995)
+++ user/marcel/libvdsk/libvdsk/vdsk.h	Fri Aug 21 15:20:01 2015	(r286996)
@@ -41,9 +41,9 @@ int	vdsk_close(vdskctx);
 off_t	vdsk_capacity(vdskctx);
 int	vdsk_sectorsize(vdskctx);
 
-int	vdsk_read(vdskctx, const struct iovec *, int, off_t);
-int	vdsk_write(vdskctx, const struct iovec *, int, off_t);
-
+int	vdsk_read(vdskctx, off_t, const struct iovec *, int);
+int	vdsk_write(vdskctx, off_t, const struct iovec *, int);
+int	vdsk_trim(vdskctx, off_t, ssize_t);
 int	vdsk_flush(vdskctx);
 
 #endif /* __VDSK_H__ */

Modified: user/marcel/libvdsk/libvdsk/vdsk_int.h
==============================================================================
--- user/marcel/libvdsk/libvdsk/vdsk_int.h	Fri Aug 21 15:15:22 2015	(r286995)
+++ user/marcel/libvdsk/libvdsk/vdsk_int.h	Fri Aug 21 15:20:01 2015	(r286996)
@@ -48,8 +48,9 @@ struct vdsk_format {
 	int	(*probe)(struct vdsk *);
 	int	(*open)(struct vdsk *);
 	int	(*close)(struct vdsk *);
-	int	(*read)(struct vdsk *, const struct iovec *, int, off_t);
-	int	(*write)(struct vdsk *, const struct iovec *, int, off_t);
+	int	(*read)(struct vdsk *, off_t, const struct iovec *, int);
+	int	(*write)(struct vdsk *, off_t, const struct iovec *, int);
+	int	(*trim)(struct vdsk *, off_t, ssize_t);
 	int	(*flush)(struct vdsk *);
 };
 

Modified: user/marcel/libvdsk/libvdsk/vhd.c
==============================================================================
--- user/marcel/libvdsk/libvdsk/vhd.c	Fri Aug 21 15:15:22 2015	(r286995)
+++ user/marcel/libvdsk/libvdsk/vhd.c	Fri Aug 21 15:20:01 2015	(r286996)
@@ -63,16 +63,24 @@ vhd_close(struct vdsk *vdsk __unused)
 }
 
 static int
-vhd_read(struct vdsk *vdsk __unused, const struct iovec *iov __unused,
-    int iovcnt __unused, off_t offset __unused)
+vhd_read(struct vdsk *vdsk __unused, off_t offset __unused,
+    const struct iovec *iov __unused, int iovcnt __unused)
 {
 
 	return (ENOSYS);
 }
 
 static int
-vhd_write(struct vdsk *vdsk __unused, const struct iovec *iov __unused,
-    int iovcnt __unused, off_t offset __unused)
+vhd_write(struct vdsk *vdsk __unused, off_t offset __unused,
+    const struct iovec *iov __unused, int iovcnt __unused)
+{
+
+	return (ENOSYS);
+}
+
+static int
+vhd_trim(struct vdsk *vdsk __unused, off_t offset __unused,
+    ssize_t length __unused)
 {
 
 	return (ENOSYS);
@@ -94,6 +102,7 @@ static struct vdsk_format vhd_format = {
 	.close = vhd_close,
 	.read = vhd_read,
 	.write = vhd_write,
+	.trim = vhd_trim,
 	.flush = vhd_flush,
 };
 FORMAT_DEFINE(vhd_format);

Modified: user/marcel/libvdsk/libvdsk/vmdk.c
==============================================================================
--- user/marcel/libvdsk/libvdsk/vmdk.c	Fri Aug 21 15:15:22 2015	(r286995)
+++ user/marcel/libvdsk/libvdsk/vmdk.c	Fri Aug 21 15:20:01 2015	(r286996)
@@ -63,16 +63,24 @@ vmdk_close(struct vdsk *vdsk __unused)
 }
 
 static int
-vmdk_read(struct vdsk *vdsk __unused, const struct iovec *iov __unused,
-    int iovcnt __unused, off_t offset __unused)
+vmdk_read(struct vdsk *vdsk __unused, off_t offset __unused,
+    const struct iovec *iov __unused, int iovcnt __unused)
 {
 
 	return (ENOSYS);
 }
 
 static int
-vmdk_write(struct vdsk *vdsk __unused, const struct iovec *iov __unused,
-    int iovcnt __unused, off_t offset __unused)
+vmdk_write(struct vdsk *vdsk __unused, off_t offset __unused,
+    const struct iovec *iov __unused, int iovcnt __unused)
+{
+
+	return (ENOSYS);
+}
+
+static int
+vmdk_trim(struct vdsk *vdsk __unused, off_t offset __unused, 
+    ssize_t length __unused)
 {
 
 	return (ENOSYS);
@@ -94,6 +102,7 @@ static struct vdsk_format vmdk_format = 
 	.close = vmdk_close,
 	.read = vmdk_read,
 	.write = vmdk_write,
+	.trim = vmdk_trim,
 	.flush = vmdk_flush,
 };
 FORMAT_DEFINE(vmdk_format);


More information about the svn-src-user mailing list