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