camcontrol: Simplfiy 12-byte retry logic in defects command

We always start out using the 10-byte version of READ DEFECT DATA, and
then switch to 12-byte when necessary due to errors or data length
requirements. We always need to get the length again when we do this,
and we're always going to be using 12-byte commands from that point
forward. Simplify the logic a bit based on this observation.

Sponsored by:		Netflix
Reviewed by:		mav
Differential Revision:	https://reviews.freebsd.org/D40522
This commit is contained in:
Warner Losh 2023-06-19 14:43:05 -06:00
parent fc78fd9dae
commit 97e24c3868

View file

@ -3923,18 +3923,23 @@ readdefects(struct cam_device *device, int argc, char **argv,
ccb = cam_getccb(device);
retry_12byte:
/*
* We start off asking for just the header to determine how much
* defect data is available. Some Hitachi drives return an error
* if you ask for more data than the drive has. Once we know the
* length, we retry the command with the returned length.
* We start off asking for just the header to determine how much defect
* data is available. Some Hitachi drives return an error if you ask
* for more data than the drive has. Once we know the length, we retry
* the command with the returned length. When we're retrying the with
* 12-byte command, we're always changing to the 12-byte command and
* need to get the length. Simplify the logic below by always setting
* use_12byte in this case with this slightly more complex logic here.
*/
if (!use_12byte)
if (!use_12byte) {
dlist_length = sizeof(*hdr10);
else
} else {
retry_12byte:
get_length = true;
use_12byte = true;
dlist_length = sizeof(*hdr12);
}
retry:
if (defect_list != NULL) {
@ -4058,8 +4063,6 @@ readdefects(struct cam_device *device, int argc, char **argv,
&& (returned_length > 0)) {
if (!use_12byte
&& (returned_length >= max_possible_size)) {
get_length = true;
use_12byte = true;
goto retry_12byte;
}
dlist_length = returned_length + hdr_size;
@ -4075,8 +4078,6 @@ readdefects(struct cam_device *device, int argc, char **argv,
* byte command.
*/
if (!use_12byte) {
get_length = true;
use_12byte = true;
goto retry_12byte;
}
dlist_length = returned_length + hdr_size;
@ -4091,8 +4092,6 @@ readdefects(struct cam_device *device, int argc, char **argv,
* byte command.
*/
if (!use_12byte) {
get_length = true;
use_12byte = true;
goto retry_12byte;
}
dlist_length = returned_length + hdr_size;
@ -4108,8 +4107,6 @@ readdefects(struct cam_device *device, int argc, char **argv,
if (!use_12byte
&& (returned_length >=
max_possible_size)) {
get_length = true;
use_12byte = true;
goto retry_12byte;
}
dlist_length = returned_length +
@ -4127,8 +4124,6 @@ readdefects(struct cam_device *device, int argc, char **argv,
} else {
if (!use_12byte
&& (returned_length >= max_possible_size)) {
get_length = true;
use_12byte = true;
goto retry_12byte;
}
dlist_length = returned_length + hdr_size;