Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 26 Oct 2010 09:55:24 -0600
From:      Scott Long <scottl@samsco.org>
To:        Ryan Stone <rysto32@gmail.com>
Cc:        freebsd-scsi@freebsd.org
Subject:   Re: camcontrol rescan all fails if there is no bus 0
Message-ID:  <E4EB1292-C4F8-4385-8ACD-58BE792988F1@samsco.org>
In-Reply-To: <AANLkTiksEn2DP7Y=x=u99qcf28bBEspOWRnsWUfhaOPg@mail.gmail.com>
References:  <AANLkTiksEn2DP7Y=x=u99qcf28bBEspOWRnsWUfhaOPg@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Oct 25, 2010, at 10:59 AM, Ryan Stone wrote:

> 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.
>=20
> 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.
>=20
> The following patch resolves the issue for me:
> Index: camcontrol.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- 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 =3D XPT_DEV_MATCH;
> +	matchccb.ccb_h.path_id =3D CAM_BUS_WILDCARD;
> 	bufsize =3D sizeof(struct dev_match_result) * 20;
> 	matchccb.cdm.match_buf_len =3D bufsize;
> 	matchccb.cdm.matches=3D(struct dev_match_result =
*)malloc(bufsize);
>=20
>=20
> (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.

It appears unfortunate that CAM_XPT_PATH_ID  and CAM_BUS_WILDCARD =
evaluate to the same value.  CAM_XPT_PATH_ID is supposed to be specific =
to the pseudo bus that is owned by the XPT module, so I don't know why =
it is this way.  I'd suggest to use CAM_BUS_WILDCARD here in case =
CAM_XPT_PATH_ID changes in the future.

That being said, there's a comment block right above the code that you =
changed that suggests that the XPT pseudo-bus handler won't behave =
correctly if it gets a rescan or reset command, hinting that that's why =
the enumeration starts specifically a '0' instead of 'CAM_BUS_WILDCARD'. =
 Did you see any evidence of this in your testing?

Scott





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?E4EB1292-C4F8-4385-8ACD-58BE792988F1>