From 61fe6a467e1371802337c73b1fa5cafe0eb2690d Mon Sep 17 00:00:00 2001 From: Sascha Wildner Date: Fri, 3 Aug 2012 00:14:28 +0200 Subject: [PATCH] kernel/cam: Make si_iosize_max overridable by drivers. --- sys/bus/cam/cam_ccb.h | 2 +- sys/bus/cam/scsi/scsi_da.c | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/sys/bus/cam/cam_ccb.h b/sys/bus/cam/cam_ccb.h index c19d5ca..2b172b5 100644 --- a/sys/bus/cam/cam_ccb.h +++ b/sys/bus/cam/cam_ccb.h @@ -26,7 +26,6 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/cam/cam_ccb.h,v 1.15.2.3 2003/07/29 04:00:34 njl Exp $ - * $DragonFly: src/sys/bus/cam/cam_ccb.h,v 1.17 2008/02/10 00:01:01 pavalos Exp $ */ #ifndef _CAM_CAM_CCB_H @@ -561,6 +560,7 @@ struct ccb_pathinq { struct ccb_pathinq_settings_sas sas; char ccb_pathinq_settings_opaque[PATHINQ_SETTINGS_SIZE]; } xport_specific; + u_int maxio; /* Max supported I/O size, in bytes. */ }; /* Path Statistics CCB */ diff --git a/sys/bus/cam/scsi/scsi_da.c b/sys/bus/cam/scsi/scsi_da.c index 0c83d3c..60658a3 100644 --- a/sys/bus/cam/scsi/scsi_da.c +++ b/sys/bus/cam/scsi/scsi_da.c @@ -1196,6 +1196,7 @@ daregister(struct cam_periph *periph, void *arg) TASK_INIT(&softc->sysctl_task, 0, dasysctlinit, periph); /* Check if the SIM does not want 6 byte commands */ + bzero(&cpi, sizeof(cpi)); xpt_setup_ccb(&cpi.ccb_h, periph->path, /*priority*/1); cpi.ccb_h.func_code = XPT_PATH_INQ; xpt_action((union ccb *)&cpi); @@ -1250,7 +1251,10 @@ daregister(struct cam_periph *periph, void *arg) */ CAM_SIM_UNLOCK(periph->sim); disk_create(periph->unit_number, &softc->disk, &da_ops); - softc->disk.d_rawdev->si_iosize_max = MAXPHYS; + if (cpi.maxio == 0 || cpi.maxio > MAXPHYS) + softc->disk.d_rawdev->si_iosize_max = MAXPHYS; + else + softc->disk.d_rawdev->si_iosize_max = cpi.maxio; CAM_SIM_LOCK(periph->sim); /* -- 1.7.7.2