camcontrol rescan all fails if there is no bus 0

Andriy Gapon avg at icyb.net.ua
Tue Oct 26 16:46:04 UTC 2010


on 25/10/2010 19:59 Ryan Stone said the following:
> If you issue a "camcontrol rescan all" on a system that does not have
> scsi bus 0, camcontrol gets a EINVAL from a CAMIOCOMMAND ioctl and
> exits after printing an error while trying to do a XPT_DEV_MATCH.
> This is because camcontrol passes a bzero'd ccb to the ioctl without
> ever setting the path_id, so CAM looks up path 0 and returns EINVAL if
> that bus does not exist.
> 
> This is just slightly annoying if there are no CAM devices on the
> system.  If you had a system with CAM devices, but no bus 0, then
> camcontrol rescan all would always fail.  I'm not sure if it's
> actually possible to skip path 0, though.

Oh, I remember this issue:
http://thread.gmane.org/gmane.os.freebsd.devel.scsi/4405

> The following patch resolves the issue for me:
> Index: camcontrol.c
> ===================================================================
> --- camcontrol.c	(revision 214271)
> +++ camcontrol.c	(working copy)
> @@ -1519,6 +1519,7 @@ rescan_or_reset_bus(int bus, int rescan)
>  	bzero(&(&matchccb.ccb_h)[1],
>  	      sizeof(struct ccb_dev_match) - sizeof(struct ccb_hdr));
>  	matchccb.ccb_h.func_code = XPT_DEV_MATCH;
> +	matchccb.ccb_h.path_id = CAM_BUS_WILDCARD;
>  	bufsize = sizeof(struct dev_match_result) * 20;
>  	matchccb.cdm.match_buf_len = bufsize;
>  	matchccb.cdm.matches=(struct dev_match_result *)malloc(bufsize);
> 
> 
> (by the way, should I be using CAM_BUS_WILDCARD or CAM_XPT_PATH_ID?
> By the name WILDCARD seems more appropriate but I see that camcontrol
> uses CAM_XPT_PATH_ID in getdevtree.


-- 
Andriy Gapon


More information about the freebsd-scsi mailing list