From owner-svn-src-user@FreeBSD.ORG Fri Nov 21 03:22:23 2014 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 91E4450B; Fri, 21 Nov 2014 03:22:23 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 7E896A8B; Fri, 21 Nov 2014 03:22:23 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id sAL3MNwQ040225; Fri, 21 Nov 2014 03:22:23 GMT (envelope-from marcel@FreeBSD.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id sAL3MMsk040209; Fri, 21 Nov 2014 03:22:22 GMT (envelope-from marcel@FreeBSD.org) Message-Id: <201411210322.sAL3MMsk040209@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: marcel set sender to marcel@FreeBSD.org using -f From: Marcel Moolenaar Date: Fri, 21 Nov 2014 03:22:22 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r274783 - in user/marcel/libvdsk: bhyve bhyveload X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 21 Nov 2014 03:22:23 -0000 Author: marcel Date: Fri Nov 21 03:22:22 2014 New Revision: 274783 URL: https://svnweb.freebsd.org/changeset/base/274783 Log: Use libvdsk(3) to implement block devices. Modified: user/marcel/libvdsk/bhyve/Makefile user/marcel/libvdsk/bhyve/block_if.c user/marcel/libvdsk/bhyveload/Makefile user/marcel/libvdsk/bhyveload/bhyveload.c Modified: user/marcel/libvdsk/bhyve/Makefile ============================================================================== --- user/marcel/libvdsk/bhyve/Makefile Fri Nov 21 03:19:51 2014 (r274782) +++ user/marcel/libvdsk/bhyve/Makefile Fri Nov 21 03:22:22 2014 (r274783) @@ -43,8 +43,8 @@ SRCS= \ .PATH: /sys/amd64/vmm SRCS+= vmm_instruction_emul.c -DPADD= ${LIBVMMAPI} ${LIBMD} ${LIBUTIL} ${LIBPTHREAD} -LDADD= -lvmmapi -lmd -lutil -lpthread +DPADD= ${LIBVDSK} ${LIBVMMAPI} ${LIBMD} ${LIBUTIL} ${LIBPTHREAD} +LDADD= -lvdsk -lvmmapi -lmd -lutil -lpthread WARNS?= 2 Modified: user/marcel/libvdsk/bhyve/block_if.c ============================================================================== --- user/marcel/libvdsk/bhyve/block_if.c Fri Nov 21 03:19:51 2014 (r274782) +++ user/marcel/libvdsk/bhyve/block_if.c Fri Nov 21 03:22:22 2014 (r274783) @@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include @@ -79,10 +80,7 @@ struct blockif_elem { struct blockif_ctxt { int bc_magic; - int bc_fd; int bc_rdonly; - off_t bc_size; - int bc_sectsz; pthread_t bc_btid; pthread_mutex_t bc_mtx; pthread_cond_t bc_cond; @@ -176,18 +174,17 @@ blockif_proc(struct blockif_ctxt *bc, st switch (be->be_op) { case BOP_READ: - if (preadv(bc->bc_fd, br->br_iov, br->br_iovcnt, - br->br_offset) < 0) + if (vdsk_readv(bc, br->br_iov, br->br_iovcnt, + br->br_offset) < 0) err = errno; break; case BOP_WRITE: - if (bc->bc_rdonly) - err = EROFS; - else if (pwritev(bc->bc_fd, br->br_iov, br->br_iovcnt, - br->br_offset) < 0) + if (vdsk_writev(bc, br->br_iov, br->br_iovcnt, + br->br_offset) < 0) err = errno; break; case BOP_FLUSH: + err = vdsk_flush(bc); break; default: err = EINVAL; @@ -267,9 +264,7 @@ blockif_open(const char *optstr, const c char tname[MAXCOMLEN + 1]; char *nopt, *xopts; struct blockif_ctxt *bc; - struct stat sbuf; - off_t size; - int extra, fd, i, sectsz; + int extra, i; int nocache, sync, ro; pthread_once(&blockif_once, blockif_init); @@ -300,51 +295,20 @@ blockif_open(const char *optstr, const c if (sync) extra |= O_SYNC; - fd = open(nopt, (ro ? O_RDONLY : O_RDWR) | extra); - if (fd < 0 && !ro) { + bc = vdsk_open(nopt, (ro ? O_RDONLY : O_RDWR) | extra, sizeof(*bc)); + if (bc == NULL && !ro) { /* Attempt a r/w fail with a r/o open */ - fd = open(nopt, O_RDONLY | extra); + bc = vdsk_open(nopt, O_RDONLY | extra, sizeof(*bc)); ro = 1; } - if (fd < 0) { - perror("Could not open backing file"); - return (NULL); - } - - if (fstat(fd, &sbuf) < 0) { - perror("Could not stat backing file"); - close(fd); - return (NULL); - } - - /* - * Deal with raw devices - */ - size = sbuf.st_size; - sectsz = DEV_BSIZE; - if (S_ISCHR(sbuf.st_mode)) { - if (ioctl(fd, DIOCGMEDIASIZE, &size) < 0 || - ioctl(fd, DIOCGSECTORSIZE, §sz)) { - perror("Could not fetch dev blk/sector size"); - close(fd); - return (NULL); - } - assert(size != 0); - assert(sectsz != 0); - } - - bc = calloc(1, sizeof(struct blockif_ctxt)); if (bc == NULL) { - close(fd); + perror("Could not open backing file"); return (NULL); } bc->bc_magic = BLOCKIF_SIG; - bc->bc_fd = fd; bc->bc_rdonly = ro; - bc->bc_size = size; - bc->bc_sectsz = sectsz; pthread_mutex_init(&bc->bc_mtx, NULL); pthread_cond_init(&bc->bc_cond, NULL); TAILQ_INIT(&bc->bc_freeq); @@ -521,8 +485,7 @@ blockif_close(struct blockif_ctxt *bc) * Release resources */ bc->bc_magic = 0; - close(bc->bc_fd); - free(bc); + vdsk_close(bc); return (0); } @@ -541,7 +504,7 @@ blockif_chs(struct blockif_ctxt *bc, uin assert(bc->bc_magic == BLOCKIF_SIG); - sectors = bc->bc_size / bc->bc_sectsz; + sectors = vdsk_capacity(bc) / vdsk_sectorsize(bc); /* Clamp the size to the largest possible with CHS */ if (sectors > 65535UL*16*255) @@ -584,7 +547,7 @@ blockif_size(struct blockif_ctxt *bc) { assert(bc->bc_magic == BLOCKIF_SIG); - return (bc->bc_size); + return (vdsk_capacity(bc)); } int @@ -592,7 +555,7 @@ blockif_sectsz(struct blockif_ctxt *bc) { assert(bc->bc_magic == BLOCKIF_SIG); - return (bc->bc_sectsz); + return (vdsk_sectorsize(bc)); } int Modified: user/marcel/libvdsk/bhyveload/Makefile ============================================================================== --- user/marcel/libvdsk/bhyveload/Makefile Fri Nov 21 03:19:51 2014 (r274782) +++ user/marcel/libvdsk/bhyveload/Makefile Fri Nov 21 03:22:22 2014 (r274783) @@ -4,8 +4,8 @@ PROG= bhyveload SRCS= bhyveload.c MAN= bhyveload.8 -DPADD+= ${LIBVMMAPI} ${LIBUTIL} -LDADD+= -lvmmapi -lutil +DPADD+= ${LIBVDSK} ${LIBVMMAPI} ${LIBUTIL} +LDADD+= -lvdsk -lvmmapi -lutil WARNS?= 3 Modified: user/marcel/libvdsk/bhyveload/bhyveload.c ============================================================================== --- user/marcel/libvdsk/bhyveload/bhyveload.c Fri Nov 21 03:19:51 2014 (r274782) +++ user/marcel/libvdsk/bhyveload/bhyveload.c Fri Nov 21 03:22:22 2014 (r274783) @@ -79,7 +79,7 @@ __FBSDID("$FreeBSD$"); #include #include #include - +#include #include #include "userboot.h" @@ -92,7 +92,7 @@ __FBSDID("$FreeBSD$"); static char *host_base; static struct termios term, oldterm; -static int disk_fd[NDISKS]; +static vdskctx disk[NDISKS]; static int ndisks; static int consin_fd, consout_fd; @@ -290,9 +290,9 @@ cb_diskread(void *arg, int unit, uint64_ { ssize_t n; - if (unit < 0 || unit >= ndisks ) + if (unit < 0 || unit >= ndisks) return (EIO); - n = pread(disk_fd[unit], to, size, from); + n = vdsk_read(disk[unit], to, size, from); if (n < 0) return (errno); *resid = size - n; @@ -302,20 +302,16 @@ cb_diskread(void *arg, int unit, uint64_ static int cb_diskioctl(void *arg, int unit, u_long cmd, void *data) { - struct stat sb; if (unit < 0 || unit >= ndisks) return (EBADF); switch (cmd) { case DIOCGSECTORSIZE: - *(u_int *)data = 512; + *(u_int *)data = vdsk_sectorsize(disk[unit]); break; case DIOCGMEDIASIZE: - if (fstat(disk_fd[unit], &sb) == 0) - *(off_t *)data = sb.st_size; - else - return (ENOTTY); + *(off_t *)data = vdsk_capacity(disk[unit]); break; default: return (ENOTTY); @@ -607,21 +603,17 @@ altcons_open(char *path) static int disk_open(char *path) { - int err, fd; + vdskctx vdsk; - if (ndisks > NDISKS) + if (ndisks >= NDISKS) return (ERANGE); - err = 0; - fd = open(path, O_RDONLY); - - if (fd > 0) { - disk_fd[ndisks] = fd; - ndisks++; - } else - err = errno; + vdsk = vdsk_open(path, O_RDONLY, 0); + if (vdsk == NULL) + return (errno); - return (err); + disk[ndisks++] = vdsk; + return (0); } static void