Module Name:    src
Committed By:   pooka
Date:           Fri Nov 20 17:48:53 UTC 2009

Modified Files:
        src/sys/rump/librump/rumpvfs: rumpblk.c

Log Message:
Generate fictional disklabel and return that from ioctl() instead
of the halfwitted semi-host semi-virtual ioctl nonsense that was
here previously.


To generate a diff of this commit:
cvs rdiff -u -r1.30 -r1.31 src/sys/rump/librump/rumpvfs/rumpblk.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/librump/rumpvfs/rumpblk.c
diff -u src/sys/rump/librump/rumpvfs/rumpblk.c:1.30 src/sys/rump/librump/rumpvfs/rumpblk.c:1.31
--- src/sys/rump/librump/rumpvfs/rumpblk.c:1.30	Thu Nov 19 13:46:55 2009
+++ src/sys/rump/librump/rumpvfs/rumpblk.c	Fri Nov 20 17:48:52 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpblk.c,v 1.30 2009/11/19 13:46:55 pooka Exp $	*/
+/*	$NetBSD: rumpblk.c,v 1.31 2009/11/20 17:48:52 pooka Exp $	*/
 
 /*
  * Copyright (c) 2009 Antti Kantee.  All Rights Reserved.
@@ -52,7 +52,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rumpblk.c,v 1.30 2009/11/19 13:46:55 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rumpblk.c,v 1.31 2009/11/20 17:48:52 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/buf.h>
@@ -113,9 +113,7 @@
 	TAILQ_HEAD(winlru, blkwin) rblk_lruq;
 	bool rblk_waiting;
 
-	struct partition *rblk_curpi;
-	struct partition rblk_pi;
-	struct disklabel rblk_dl;
+	struct disklabel rblk_label;
 } minors[RUMPBLK_SIZE];
 
 static struct evcnt ev_io_total;
@@ -159,6 +157,42 @@
 static unsigned randstate;
 static kmutex_t rumpblk_lock;
 
+static void
+makedefaultlabel(struct disklabel *lp, off_t size, int part)
+{
+	int i;
+
+	memset(lp, 0, sizeof(*lp));
+
+	lp->d_secperunit = size;
+	lp->d_secsize = DEV_BSIZE;
+	lp->d_nsectors = size >> DEV_BSHIFT;
+	lp->d_ntracks = 1;
+	lp->d_ncylinders = 1;
+	lp->d_secpercyl = lp->d_nsectors;
+
+	/* oh dear oh dear */
+	strncpy(lp->d_typename, "rumpd", sizeof(lp->d_typename));
+	strncpy(lp->d_packname, "fictitious", sizeof(lp->d_packname));
+
+	lp->d_type = DTYPE_RUMPD;
+	lp->d_rpm = 11;
+	lp->d_interleave = 1;
+	lp->d_flags = 0;
+
+	/* XXX: RAW_PART handling? */
+	for (i = 0; i < part; i++) {
+		lp->d_partitions[i].p_fstype = FS_UNUSED;
+	}
+	lp->d_partitions[part].p_size = size;
+	lp->d_npartitions = part+1;
+	/* XXX: file system type? */
+
+	lp->d_magic = DISKMAGIC;
+	lp->d_magic2 = DISKMAGIC;
+	lp->d_checksum = 0; /* XXX */
+}
+
 static struct blkwin *
 getwindow(struct rblkdev *rblk, off_t off, int *wsize, int *error)
 {
@@ -387,6 +421,7 @@
 		rblk->rblk_size = flen - offset;
 	}
 	rblk->rblk_ftype = ftype;
+	makedefaultlabel(&rblk->rblk_label, rblk->rblk_size, i);
 	mutex_exit(&rumpblk_lock);
 
 	*dmin = i;
@@ -397,7 +432,6 @@
 rumpblk_open(dev_t dev, int flag, int fmt, struct lwp *l)
 {
 	struct rblkdev *rblk = &minors[minor(dev)];
-	int dummy;
 	int error, fd;
 
 	if (rblk->rblk_path == NULL)
@@ -458,21 +492,6 @@
 				break;
 			}
 		}
-
-		memset(&rblk->rblk_dl, 0, sizeof(rblk->rblk_dl));
-		rblk->rblk_pi.p_size = fsize >> DEV_BSHIFT;
-		rblk->rblk_dl.d_secsize = DEV_BSIZE;
-		rblk->rblk_curpi = &rblk->rblk_pi;
-	} else {
-		rblk->rblk_fd = fd;
-
-		if ((error = rumpblk_ioctl(dev, DIOCGDINFO, &rblk->rblk_dl,
-		    0, curlwp)) != 0) {
-			rumpuser_close(fd, &dummy);
-			return error;
-		}
-
-		rblk->rblk_curpi = &rblk->rblk_dl.d_partitions[0];
 	}
 
 	KASSERT(rblk->rblk_fd != -1);
@@ -497,23 +516,28 @@
 int
 rumpblk_ioctl(dev_t dev, u_long xfer, void *addr, int flag, struct lwp *l)
 {
-	struct rblkdev *rblk = &minors[minor(dev)];
-	int rv, error;
-
-	if (xfer == DIOCGPART) {
-		struct partinfo *pi = (struct partinfo *)addr;
-
-		pi->part = rblk->rblk_curpi;
-		pi->disklab = &rblk->rblk_dl;
-
-		return 0;
+	devminor_t dmin = minor(dev);
+	struct rblkdev *rblk = &minors[dmin];
+	struct partinfo *pi;
+	int error = 0;
+
+	/* well, me should support a few more, but we don't for now */
+	switch (xfer) {
+	case DIOCGDINFO:
+		*(struct disklabel *)addr = rblk->rblk_label;
+		break;
+
+	case DIOCGPART:
+		pi = addr;
+		pi->part = &rblk->rblk_label.d_partitions[DISKPART(dmin)];
+		pi->disklab = &rblk->rblk_label;
+		break;
+	default:
+		error = ENOTTY;
+		break;
 	}
 
-	rv = rumpuser_ioctl(rblk->rblk_fd, xfer, addr, &error);
-	if (rv == -1)
-		return error;
-
-	return 0;
+	return error;
 }
 
 static int

Reply via email to