Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 12 Jun 2013 12:51:44 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r251651 - in head/sys/dev: cfi nand
Message-ID:  <201306121251.r5CCpiFo092933@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Wed Jun 12 12:51:43 2013
New Revision: 251651
URL: http://svnweb.freebsd.org/changeset/base/251651

Log:
  Use direct custom implementations instead of g_handleattr() for CFI and NAND
  d_getattr().  Since these drivers use disk(9) KPI and not directly GEOM, use
  of that function means KPI layering violation, causing extra g_io_deliver()
  call for the request.

Modified:
  head/sys/dev/cfi/cfi_disk.c
  head/sys/dev/nand/nand_geom.c

Modified: head/sys/dev/cfi/cfi_disk.c
==============================================================================
--- head/sys/dev/cfi/cfi_disk.c	Wed Jun 12 12:38:12 2013	(r251650)
+++ head/sys/dev/cfi/cfi_disk.c	Wed Jun 12 12:51:43 2013	(r251651)
@@ -292,14 +292,13 @@ cfi_disk_getattr(struct bio *bp)
 	sc = dsc->parent;
 	dev = sc->sc_dev;
 
-	do {
-		if (g_handleattr(bp, "CFI::device", &dev, sizeof(device_t)))
-			break;
-
-		return (ERESTART);
-	} while(0);
-
-	return (EJUSTRETURN);
+	if (strcmp(bp->bio_attribute, "CFI::device") == 0) {
+		if (bp->bio_length != sizeof(dev))
+			return (EFAULT);
+		bcopy(&dev, bp->bio_data, sizeof(dev));
+	} else
+		return (-1);
+	return (0);
 }
 
 

Modified: head/sys/dev/nand/nand_geom.c
==============================================================================
--- head/sys/dev/nand/nand_geom.c	Wed Jun 12 12:38:12 2013	(r251650)
+++ head/sys/dev/nand/nand_geom.c	Wed Jun 12 12:51:43 2013	(r251651)
@@ -156,6 +156,7 @@ nand_getattr(struct bio *bp)
 	struct nand_chip *chip;
 	struct chip_geom *cg;
 	device_t dev;
+	int val;
 
 	if (bp->bio_disk == NULL || bp->bio_disk->d_drv1 == NULL)
 		return (ENXIO);
@@ -166,22 +167,25 @@ nand_getattr(struct bio *bp)
 	dev = device_get_parent(chip->dev);
 	dev = device_get_parent(dev);
 
-	do {
-		if (g_handleattr_int(bp, "NAND::oobsize", cg->oob_size))
-			break;
-		else if (g_handleattr_int(bp, "NAND::pagesize", cg->page_size))
-			break;
-		else if (g_handleattr_int(bp, "NAND::blocksize",
-		    cg->block_size))
-			break;
-		else if (g_handleattr(bp, "NAND::device", &(dev),
-		    sizeof(device_t)))
-			break;
-
-		return (ERESTART);
-	} while (0);
-
-	return (EJUSTRETURN);
+	if (strcmp(bp->bio_attribute, "NAND::device") == 0) {
+		if (bp->bio_length != sizeof(dev))
+			return (EFAULT);
+		bcopy(&dev, bp->bio_data, sizeof(dev));
+	} else {
+		if (strcmp(bp->bio_attribute, "NAND::oobsize") == 0)
+			val = cg->oob_size;
+		else if (strcmp(bp->bio_attribute, "NAND::pagesize") == 0)
+			val = cg->page_size;
+		else if (strcmp(bp->bio_attribute, "NAND::blocksize") == 0)
+			val = cg->block_size;
+		else
+			return (-1);
+		if (bp->bio_length != sizeof(val))
+			return (EFAULT);
+		bcopy(&val, bp->bio_data, sizeof(val));
+	}
+	bp->bio_completed = bp->bio_length;
+	return (0);
 }
 
 static int



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201306121251.r5CCpiFo092933>