svn commit: r203385 - head/sys/cam/ata

Alexander Motin mav at FreeBSD.org
Tue Feb 2 18:03:21 UTC 2010


Author: mav
Date: Tue Feb  2 18:03:21 2010
New Revision: 203385
URL: http://svn.freebsd.org/changeset/base/203385

Log:
  - Use separate buffer for identify data fetching. We can't use main buffer
  here if device already running, as data need to be formatted before use.
  - Remove some saved_ccb variables. They are unused now.

Modified:
  head/sys/cam/ata/ata_da.c
  head/sys/cam/ata/ata_pmp.c
  head/sys/cam/ata/ata_xpt.c

Modified: head/sys/cam/ata/ata_da.c
==============================================================================
--- head/sys/cam/ata/ata_da.c	Tue Feb  2 17:56:54 2010	(r203384)
+++ head/sys/cam/ata/ata_da.c	Tue Feb  2 18:03:21 2010	(r203385)
@@ -123,7 +123,6 @@ struct ada_softc {
 	int	 trim_running;
 	struct	 disk_params params;
 	struct	 disk *disk;
-	union	 ccb saved_ccb;
 	struct task		sysctl_task;
 	struct sysctl_ctx_list	sysctl_ctx;
 	struct sysctl_oid	*sysctl_tree;
@@ -1098,8 +1097,7 @@ adaerror(union ccb *ccb, u_int32_t cam_f
 	periph = xpt_path_periph(ccb->ccb_h.path);
 	softc = (struct ada_softc *)periph->softc;
 
-	return(cam_periph_error(ccb, cam_flags, sense_flags,
-				&softc->saved_ccb));
+	return(cam_periph_error(ccb, cam_flags, sense_flags, NULL));
 }
 
 static void

Modified: head/sys/cam/ata/ata_pmp.c
==============================================================================
--- head/sys/cam/ata/ata_pmp.c	Tue Feb  2 17:56:54 2010	(r203384)
+++ head/sys/cam/ata/ata_pmp.c	Tue Feb  2 18:03:21 2010	(r203385)
@@ -101,7 +101,6 @@ struct pmp_softc {
 	int			events;
 #define PMP_EV_RESET	1
 #define PMP_EV_RESCAN	2
-	union			ccb saved_ccb;
 	struct task		sysctl_task;
 	struct sysctl_ctx_list	sysctl_ctx;
 	struct sysctl_oid	*sysctl_tree;
@@ -552,8 +551,7 @@ pmpdone(struct cam_periph *periph, union
 	priority = done_ccb->ccb_h.pinfo.priority;
 
 	if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
-		if (cam_periph_error(done_ccb, 0, 0,
-		    &softc->saved_ccb) == ERESTART) {
+		if (cam_periph_error(done_ccb, 0, 0, NULL) == ERESTART) {
 			return;
 		} else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) {
 			cam_release_devq(done_ccb->ccb_h.path,

Modified: head/sys/cam/ata/ata_xpt.c
==============================================================================
--- head/sys/cam/ata/ata_xpt.c	Tue Feb  2 17:56:54 2010	(r203384)
+++ head/sys/cam/ata/ata_xpt.c	Tue Feb  2 18:03:21 2010	(r203385)
@@ -37,7 +37,6 @@ __FBSDID("$FreeBSD$");
 #include <sys/time.h>
 #include <sys/conf.h>
 #include <sys/fcntl.h>
-#include <sys/md5.h>
 #include <sys/interrupt.h>
 #include <sys/sbuf.h>
 
@@ -124,10 +123,9 @@ typedef enum {
 
 typedef struct {
 	TAILQ_HEAD(, ccb_hdr) request_ccbs;
+	struct ata_params	ident_data;
 	probe_action	action;
-	union ccb	saved_ccb;
 	probe_flags	flags;
-	u_int8_t	digest[16];
 	uint32_t	pm_pid;
 	uint32_t	pm_prv;
 	int		restart;
@@ -303,29 +301,13 @@ probestart(struct cam_periph *periph, un
 		ata_reset_cmd(ataio);
 		break;
 	case PROBE_IDENTIFY:
-		if ((periph->path->device->flags & CAM_DEV_UNCONFIGURED) == 0) {
-			/* Prepare check that it is the same device. */
-			MD5_CTX context;
-
-			MD5Init(&context);
-			MD5Update(&context,
-			    (unsigned char *)ident_buf->model,
-			    sizeof(ident_buf->model));
-			MD5Update(&context,
-			    (unsigned char *)ident_buf->revision,
-			    sizeof(ident_buf->revision));
-			MD5Update(&context,
-			    (unsigned char *)ident_buf->serial,
-			    sizeof(ident_buf->serial));
-			MD5Final(softc->digest, &context);
-		}
 		cam_fill_ataio(ataio,
 		      1,
 		      probedone,
 		      /*flags*/CAM_DIR_IN,
 		      0,
-		      /*data_ptr*/(u_int8_t *)ident_buf,
-		      /*dxfer_len*/sizeof(struct ata_params),
+		      /*data_ptr*/(u_int8_t *)&softc->ident_data,
+		      /*dxfer_len*/sizeof(softc->ident_data),
 		      30 * 1000);
 		if (periph->path->device->protocol == PROTO_ATA)
 			ata_28bit_cmd(ataio, ATA_ATA_IDENTIFY, 0, 0, 0);
@@ -695,8 +677,7 @@ probedone(struct cam_periph *periph, uni
 	ident_buf = &path->device->ident_data;
 
 	if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
-device_fail:	if (cam_periph_error(done_ccb, 0, 0,
-		    &softc->saved_ccb) == ERESTART) {
+device_fail:	if (cam_periph_error(done_ccb, 0, 0, NULL) == ERESTART) {
 			return;
 		} else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) {
 			/* Don't wedge the queue */
@@ -724,6 +705,8 @@ device_fail:	if (cam_periph_error(done_c
 		goto done;
 	}
 noerror:
+	if (softc->restart)
+		goto done;
 	switch (softc->action) {
 	case PROBE_RESET:
 	{
@@ -766,6 +749,7 @@ noerror:
 	{
 		int16_t *ptr;
 
+		ident_buf = &softc->ident_data;
 		for (ptr = (int16_t *)ident_buf;
 		     ptr < (int16_t *)ident_buf + sizeof(struct ata_params)/2; ptr++) {
 			*ptr = le16toh(*ptr);
@@ -784,28 +768,22 @@ noerror:
 		ata_bpack(ident_buf->revision, ident_buf->revision, sizeof(ident_buf->revision));
 		ata_btrim(ident_buf->serial, sizeof(ident_buf->serial));
 		ata_bpack(ident_buf->serial, ident_buf->serial, sizeof(ident_buf->serial));
+		ident_buf = &path->device->ident_data;
 
 		if ((periph->path->device->flags & CAM_DEV_UNCONFIGURED) == 0) {
 			/* Check that it is the same device. */
-			MD5_CTX context;
-			u_int8_t digest[16];
-
-			MD5Init(&context);
-			MD5Update(&context,
-			    (unsigned char *)ident_buf->model,
-			    sizeof(ident_buf->model));
-			MD5Update(&context,
-			    (unsigned char *)ident_buf->revision,
-			    sizeof(ident_buf->revision));
-			MD5Update(&context,
-			    (unsigned char *)ident_buf->serial,
-			    sizeof(ident_buf->serial));
-			MD5Final(digest, &context);
-			if (bcmp(digest, softc->digest, sizeof(digest))) {
+			if (bcmp(softc->ident_data.model, ident_buf->model,
+			     sizeof(ident_buf->model)) ||
+			    bcmp(softc->ident_data.revision, ident_buf->revision,
+			     sizeof(ident_buf->revision)) ||
+			    bcmp(softc->ident_data.serial, ident_buf->serial,
+			     sizeof(ident_buf->serial))) {
 				/* Device changed. */
 				xpt_async(AC_LOST_DEVICE, path, NULL);
-			}
+			} else
+				bcopy(&softc->ident_data, ident_buf, sizeof(struct ata_params));
 		} else {
+			bcopy(&softc->ident_data, ident_buf, sizeof(struct ata_params));
 			/* Clean up from previous instance of this device */
 			if (path->device->serial_num != NULL) {
 				free(path->device->serial_num, M_CAMXPT);


More information about the svn-src-all mailing list