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:
parent
fc78fd9dae
commit
97e24c3868
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user