Module Name: src Committed By: pooka Date: Wed Oct 7 09:17:54 UTC 2009
Modified Files: src/sys/rump/include/rump: rump.h src/sys/rump/librump/rumpvfs: rump_vfs_private.h rumpblk.c rumpfs.c Log Message: Allow to set size and host file offset for etfs files and rumpblk. To generate a diff of this commit: cvs rdiff -u -r1.25 -r1.26 src/sys/rump/include/rump/rump.h cvs rdiff -u -r1.4 -r1.5 src/sys/rump/librump/rumpvfs/rump_vfs_private.h cvs rdiff -u -r1.26 -r1.27 src/sys/rump/librump/rumpvfs/rumpblk.c cvs rdiff -u -r1.24 -r1.25 src/sys/rump/librump/rumpvfs/rumpfs.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/rump/include/rump/rump.h diff -u src/sys/rump/include/rump/rump.h:1.25 src/sys/rump/include/rump/rump.h:1.26 --- src/sys/rump/include/rump/rump.h:1.25 Tue Oct 6 16:23:03 2009 +++ src/sys/rump/include/rump/rump.h Wed Oct 7 09:17:54 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: rump.h,v 1.25 2009/10/06 16:23:03 pooka Exp $ */ +/* $NetBSD: rump.h,v 1.26 2009/10/07 09:17:54 pooka Exp $ */ /* * Copyright (c) 2007 Antti Kantee. All Rights Reserved. @@ -95,7 +95,10 @@ void rump_getvninfo(struct vnode *, enum vtype *, off_t * /*XXX*/, dev_t *); enum rump_etfs_type { RUMP_ETFS_REG, RUMP_ETFS_BLK, RUMP_ETFS_CHR }; +#define RUMP_ETFS_SIZE_ENDOFF ((uint64_t)-1) int rump_etfs_register(const char *, const char *, enum rump_etfs_type); +int rump_etfs_register_withsize(const char *, const char *, + enum rump_etfs_type, uint64_t, uint64_t); int rump_etfs_remove(const char *); struct vfsops *rump_vfslist_iterate(struct vfsops *); Index: src/sys/rump/librump/rumpvfs/rump_vfs_private.h diff -u src/sys/rump/librump/rumpvfs/rump_vfs_private.h:1.4 src/sys/rump/librump/rumpvfs/rump_vfs_private.h:1.5 --- src/sys/rump/librump/rumpvfs/rump_vfs_private.h:1.4 Sun Sep 6 20:42:25 2009 +++ src/sys/rump/librump/rumpvfs/rump_vfs_private.h Wed Oct 7 09:17:54 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: rump_vfs_private.h,v 1.4 2009/09/06 20:42:25 pooka Exp $ */ +/* $NetBSD: rump_vfs_private.h,v 1.5 2009/10/07 09:17:54 pooka Exp $ */ /* * Copyright (c) 2008 Antti Kantee. All Rights Reserved. @@ -34,7 +34,8 @@ void rumpfs_init(void); #define RUMPBLK 254 -int rumpblk_register(const char *, devminor_t *); +#define RUMPBLK_SIZENOTSET ((uint64_t)-1) +int rumpblk_register(const char *, devminor_t *, uint64_t, uint64_t); int rumpblk_init(void); void rump_biodone(void *, size_t, int); Index: src/sys/rump/librump/rumpvfs/rumpblk.c diff -u src/sys/rump/librump/rumpvfs/rumpblk.c:1.26 src/sys/rump/librump/rumpvfs/rumpblk.c:1.27 --- src/sys/rump/librump/rumpvfs/rumpblk.c:1.26 Tue Oct 6 13:05:44 2009 +++ src/sys/rump/librump/rumpvfs/rumpblk.c Wed Oct 7 09:17:54 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpblk.c,v 1.26 2009/10/06 13:05:44 pooka Exp $ */ +/* $NetBSD: rumpblk.c,v 1.27 2009/10/07 09:17:54 pooka Exp $ */ /* * Copyright (c) 2009 Antti Kantee. All Rights Reserved. @@ -43,7 +43,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rumpblk.c,v 1.26 2009/10/06 13:05:44 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rumpblk.c,v 1.27 2009/10/07 09:17:54 pooka Exp $"); #include <sys/param.h> #include <sys/buf.h> @@ -94,6 +94,8 @@ int rblk_dfd; #endif uint64_t rblk_size; + uint64_t rblk_hostoffset; + int rblk_ftype; /* for mmap */ int rblk_mmflags; @@ -327,14 +329,24 @@ /* XXX: no deregister */ int -rumpblk_register(const char *path, devminor_t *dmin) +rumpblk_register(const char *path, devminor_t *dmin, + uint64_t offset, uint64_t size) { + struct rblkdev *rblk; uint64_t flen; size_t len; - int ftype, error, i; + int ftype, error, dummy, i; + int fd; - if (rumpuser_getfileinfo(path, &flen, &ftype, &error)) + /* devices might not report correct size unless they're open */ + fd = rumpuser_open(path, O_RDONLY, &error); + if (fd == -1) return error; + rumpuser_getfileinfo(path, &flen, &ftype, &error); + rumpuser_close(fd, &dummy); + if (error) + return error; + /* verify host file is of supported type */ if (!(ftype == RUMPUSER_FT_REG || ftype == RUMPUSER_FT_BLK @@ -358,10 +370,20 @@ return EBUSY; } + rblk = &minors[i]; len = strlen(path); - minors[i].rblk_path = malloc(len + 1, M_TEMP, M_WAITOK); - strcpy(minors[i].rblk_path, path); - minors[i].rblk_fd = -1; + rblk->rblk_path = malloc(len + 1, M_TEMP, M_WAITOK); + strcpy(rblk->rblk_path, path); + rblk->rblk_fd = -1; + rblk->rblk_hostoffset = offset; + if (size == RUMPBLK_SIZENOTSET) { + KASSERT(size + offset <= flen); + rblk->rblk_size = size; + } else { + KASSERT(offset < flen); + rblk->rblk_size = flen - offset; + } + rblk->rblk_ftype = ftype; mutex_exit(&rumpblk_lock); *dmin = i; @@ -373,20 +395,18 @@ { struct rblkdev *rblk = &minors[minor(dev)]; uint64_t fsize; - int ft, dummy; + int dummy; int error, fd; + if (rblk->rblk_path == NULL) + return ENXIO; + if (rblk->rblk_fd != -1) return 0; /* XXX: refcount, open mode */ fd = rumpuser_open(rblk->rblk_path, OFLAGS(flag), &error); if (error) return error; - if (rumpuser_getfileinfo(rblk->rblk_path, &fsize, &ft, &error) == -1) { - rumpuser_close(fd, &dummy); - return error; - } - #ifdef HAS_ODIRECT rblk->rblk_dfd = rumpuser_open(rblk->rblk_path, OFLAGS(flag) | O_DIRECT, &error); @@ -394,7 +414,7 @@ return error; #endif - if (ft == RUMPUSER_FT_REG) { + if (rblk->rblk_ftype == RUMPUSER_FT_REG) { struct blkwin *win; int i, winsize; @@ -413,7 +433,6 @@ } TAILQ_INIT(&rblk->rblk_lruq); - rblk->rblk_size = fsize; rblk->rblk_fd = fd; for (i = 0; i < memwincnt && i * memwinsize < fsize; i++) { @@ -541,13 +560,14 @@ } off = bp->b_blkno << DEV_BSHIFT; + off += rblk->rblk_hostoffset; /* * Do bounds checking if we're working on a file. Otherwise * invalid file systems might attempt to read beyond EOF. This * is bad(tm) especially on mmapped images. This is essentially * the kernel bounds_check() routines. */ - if (rblk->rblk_size && off + bp->b_bcount > rblk->rblk_size) { + if (off + bp->b_bcount > rblk->rblk_size) { int64_t sz = rblk->rblk_size - off; /* EOF */ Index: src/sys/rump/librump/rumpvfs/rumpfs.c diff -u src/sys/rump/librump/rumpvfs/rumpfs.c:1.24 src/sys/rump/librump/rumpvfs/rumpfs.c:1.25 --- src/sys/rump/librump/rumpvfs/rumpfs.c:1.24 Sun Oct 4 16:31:08 2009 +++ src/sys/rump/librump/rumpvfs/rumpfs.c Wed Oct 7 09:17:54 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpfs.c,v 1.24 2009/10/04 16:31:08 pooka Exp $ */ +/* $NetBSD: rumpfs.c,v 1.25 2009/10/07 09:17:54 pooka Exp $ */ /* * Copyright (c) 2007 Antti Kantee. All Rights Reserved. @@ -28,7 +28,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.24 2009/10/04 16:31:08 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.25 2009/10/07 09:17:54 pooka Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -199,9 +199,9 @@ return rv; } -int -rump_etfs_register(const char *key, const char *hostpath, - enum rump_etfs_type ftype) +static int +doregister(const char *key, const char *hostpath, + enum rump_etfs_type ftype, uint64_t begin, uint64_t size) { struct etfs *et; struct rumpfs_node *rn_dummy; @@ -213,8 +213,16 @@ if (rumpuser_getfileinfo(hostpath, &fsize, &hft, &error)) return error; + /* check that we give sensible arguments */ + if (begin > fsize) + return EINVAL; + if (size == RUMP_ETFS_SIZE_ENDOFF) + size = fsize - begin; + if (begin + size > fsize) + return EINVAL; + if (ftype == RUMP_ETFS_BLK || ftype == RUMP_ETFS_CHR) { - error = rumpblk_register(hostpath, &dmin); + error = rumpblk_register(hostpath, &dmin, begin, size); if (error != 0) { return error; } @@ -224,7 +232,7 @@ et = kmem_alloc(sizeof(*et), KM_SLEEP); strcpy(et->et_key, key); et->et_keylen = strlen(et->et_key); - et->et_rn = makeprivate(ettype_to_vtype(ftype), rdev, fsize, hostpath); + et->et_rn = makeprivate(ettype_to_vtype(ftype), rdev, size, hostpath); mutex_enter(&etfs_lock); if (etfs_find(key, &rn_dummy)) { @@ -240,6 +248,33 @@ } int +rump_etfs_register(const char *key, const char *hostpath, + enum rump_etfs_type ftype) +{ + + return doregister(key, hostpath, ftype, 0, RUMP_ETFS_SIZE_ENDOFF); +} + +int +rump_etfs_register_withsize(const char *key, const char *hostpath, + enum rump_etfs_type ftype, uint64_t begin, uint64_t size) +{ + + /* + * Check that we're mapping at block offsets. I guess this + * is not technically necessary except for BLK/CHR backends + * (i.e. what getfileinfo() returns, not ftype) and can be + * removed later if there are problems. + */ + if ((begin & (DEV_BSIZE-1)) != 0) + return EINVAL; + if (size != RUMP_ETFS_SIZE_ENDOFF && (size & (DEV_BSIZE-1)) != 0) + return EINVAL; + + return doregister(key, hostpath, ftype, begin, size); +} + +int rump_etfs_remove(const char *key) { struct etfs *et; @@ -688,6 +723,8 @@ struct rumpfs_node *rn; int rv; + CTASSERT(RUMP_ETFS_SIZE_ENDOFF == RUMPBLK_SIZENOTSET); + mutex_init(&reclock, MUTEX_DEFAULT, IPL_NONE); mutex_init(&etfs_lock, MUTEX_DEFAULT, IPL_NONE);