Date: Fri, 21 Nov 2014 03:01:32 +0000 (UTC) From: Marcel Moolenaar <marcel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r274779 - user/marcel/libvdsk/libvdsk Message-ID: <201411210301.sAL31WQW014286@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: marcel Date: Fri Nov 21 03:01:31 2014 New Revision: 274779 URL: https://svnweb.freebsd.org/changeset/base/274779 Log: Add libvdsk(3). This has effective enough to handle bhyveload and bhyve in their current (limited) form. Under the hood this will grow support for probing disk image formats and handling them. Added: user/marcel/libvdsk/libvdsk/ user/marcel/libvdsk/libvdsk/Makefile (contents, props changed) user/marcel/libvdsk/libvdsk/vdsk.c (contents, props changed) user/marcel/libvdsk/libvdsk/vdsk.h (contents, props changed) user/marcel/libvdsk/libvdsk/vdsk_int.h (contents, props changed) Added: user/marcel/libvdsk/libvdsk/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/marcel/libvdsk/libvdsk/Makefile Fri Nov 21 03:01:31 2014 (r274779) @@ -0,0 +1,7 @@ +# $FreeBSD$ + +LIB= vdsk +SRCS= vdsk.c +INCS= vdsk.h + +.include <bsd.lib.mk> Added: user/marcel/libvdsk/libvdsk/vdsk.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/marcel/libvdsk/libvdsk/vdsk.c Fri Nov 21 03:01:31 2014 (r274779) @@ -0,0 +1,150 @@ +/*- + * Copyright (c) 2014 Marcel Moolenaar + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/disk.h> +#include <sys/param.h> +#include <sys/stat.h> +#include <errno.h> +#include <fcntl.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <vdsk.h> + +#include "vdsk_int.h" + +static struct vdsk * +vdsk_deref(vdskctx ctx) +{ + struct vdsk *vdsk = ctx; + + return (vdsk - 1); +} + +vdskctx +vdsk_open(const char *path, int flags, size_t size) +{ + struct stat sb; + struct vdsk *vdsk; + + size += sizeof(struct vdsk); + vdsk = malloc(size); + if (vdsk == NULL) + return (NULL); + + vdsk->fd = open(path, flags); + if (vdsk->fd == -1) { + free(vdsk); + return (NULL); + } + + if (fstat(vdsk->fd, &sb) == -1) { + close(vdsk->fd); + free(vdsk); + return (NULL); + } + + if (S_ISCHR(sb.st_mode)) { + if (ioctl(vdsk->fd, DIOCGMEDIASIZE, &vdsk->capacity) < 0 || + ioctl(vdsk->fd, DIOCGSECTORSIZE, &vdsk->sectorsize) < 0) { + close(vdsk->fd); + free(vdsk); + return (NULL); + } + } else { + vdsk->capacity = sb.st_size; + vdsk->sectorsize = DEV_BSIZE; + } + return (vdsk + 1); +} + +int +vdsk_close(vdskctx ctx) +{ + struct vdsk *vdsk = vdsk_deref(ctx); + + close(vdsk->fd); + free(vdsk); + return (0); +} + +off_t +vdsk_capacity(vdskctx ctx) +{ + struct vdsk *vdsk = vdsk_deref(ctx); + + return (vdsk->capacity); +} + +int +vdsk_sectorsize(vdskctx ctx) +{ + struct vdsk *vdsk = vdsk_deref(ctx); + + return (vdsk->sectorsize); +} + +ssize_t +vdsk_read(vdskctx ctx, void *buf, size_t nbytes, off_t offset) +{ + struct vdsk *vdsk = vdsk_deref(ctx); + ssize_t res; + + res = pread(vdsk->fd, buf, nbytes, offset); + return (res); +} + +ssize_t +vdsk_readv(vdskctx ctx, const struct iovec *iov, int iovcnt, off_t offset) +{ + struct vdsk *vdsk = vdsk_deref(ctx); + ssize_t res; + + res = preadv(vdsk->fd, iov, iovcnt, offset); + return (res); +} + +ssize_t +vdsk_writev(vdskctx ctx, const struct iovec *iov, int iovcnt, off_t offset) +{ + struct vdsk *vdsk = vdsk_deref(ctx); + ssize_t res; + + res = pwritev(vdsk->fd, iov, iovcnt, offset); + return (res); +} + +int +vdsk_flush(vdskctx ctx __unused) +{ + + return (0); +} + Added: user/marcel/libvdsk/libvdsk/vdsk.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/marcel/libvdsk/libvdsk/vdsk.h Fri Nov 21 03:01:31 2014 (r274779) @@ -0,0 +1,50 @@ +/*- + * Copyright (c) 2014 Marcel Moolenaar + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef __VDSK_H__ +#define __VDSK_H__ + +#include <sys/types.h> +#include <sys/uio.h> +#include <unistd.h> + +typedef void *vdskctx; + +vdskctx vdsk_open(const char *, int, size_t); +int vdsk_close(vdskctx); + +off_t vdsk_capacity(vdskctx); +int vdsk_sectorsize(vdskctx); + +ssize_t vdsk_read(vdskctx, void *, size_t, off_t); +ssize_t vdsk_readv(vdskctx, const struct iovec *, int, off_t); +ssize_t vdsk_writev(vdskctx, const struct iovec *, int, off_t); + +int vdsk_flush(vdskctx); + +#endif /* __VDSK_H__ */ Added: user/marcel/libvdsk/libvdsk/vdsk_int.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/marcel/libvdsk/libvdsk/vdsk_int.h Fri Nov 21 03:01:31 2014 (r274779) @@ -0,0 +1,38 @@ +/*- + * Copyright (c) 2014 Marcel Moolenaar + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef __VDSK_INT_H__ +#define __VDSK_INT_H__ + +struct vdsk { + int fd; + int sectorsize; + off_t capacity; +}; + +#endif /* __VDSK_INT_H__ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201411210301.sAL31WQW014286>