Add a 'show progress' command that shows a summary of all in-progress

commands for a given adapter.  Specifically, it shows the status of any
drive or volume activities currently in progress similar to the
'drive process' and 'volume progress' commands.

Reviewed by:	emaste
MFC after:	1 week
This commit is contained in:
John Baldwin 2011-04-29 14:06:37 +00:00
parent a89fa8f7e5
commit 98be0dfebd
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=221208
3 changed files with 118 additions and 2 deletions

View File

@ -572,7 +572,7 @@ show_firmware(int ac, char **av)
u_int i;
if (ac != 1) {
warnx("show drives: extra arguments");
warnx("show firmware: extra arguments");
return (EINVAL);
}
@ -617,3 +617,112 @@ show_firmware(int ac, char **av)
return (0);
}
MFI_COMMAND(show, firmware, show_firmware);
static int
show_progress(int ac, char **av)
{
struct mfi_ld_list llist;
struct mfi_pd_list *plist;
struct mfi_ld_info linfo;
struct mfi_pd_info pinfo;
int busy, error, fd;
u_int i;
uint16_t device_id;
uint8_t target_id;
if (ac != 1) {
warnx("show progress: extra arguments");
return (EINVAL);
}
fd = mfi_open(mfi_unit);
if (fd < 0) {
error = errno;
warn("mfi_open");
return (error);
}
busy = 0;
if (mfi_ld_get_list(fd, &llist, NULL) < 0) {
error = errno;
warn("Failed to get volume list");
return (error);
}
if (mfi_pd_get_list(fd, &plist, NULL) < 0) {
error = errno;
warn("Failed to get drive list");
return (error);
}
for (i = 0; i < llist.ld_count; i++) {
target_id = llist.ld_list[i].ld.v.target_id;
if (mfi_ld_get_info(fd, target_id, &linfo, NULL) < 0) {
error = errno;
warn("Failed to get info for volume %s",
mfi_volume_name(fd, target_id));
return (error);
}
if (linfo.progress.active & MFI_LD_PROGRESS_CC) {
printf("volume %s ", mfi_volume_name(fd, target_id));
mfi_display_progress("Consistency Check",
&linfo.progress.cc);
busy = 1;
}
if (linfo.progress.active & MFI_LD_PROGRESS_BGI) {
printf("volume %s ", mfi_volume_name(fd, target_id));
mfi_display_progress("Background Init",
&linfo.progress.bgi);
busy = 1;
}
if (linfo.progress.active & MFI_LD_PROGRESS_FGI) {
printf("volume %s ", mfi_volume_name(fd, target_id));
mfi_display_progress("Foreground Init",
&linfo.progress.fgi);
busy = 1;
}
if (linfo.progress.active & MFI_LD_PROGRESS_RECON) {
printf("volume %s ", mfi_volume_name(fd, target_id));
mfi_display_progress("Reconstruction",
&linfo.progress.recon);
busy = 1;
}
}
for (i = 0; i < plist->count; i++) {
if (plist->addr[i].scsi_dev_type != 0)
continue;
device_id = plist->addr[i].device_id;
if (mfi_pd_get_info(fd, device_id, &pinfo, NULL) < 0) {
error = errno;
warn("Failed to fetch info for drive %u", device_id);
return (error);
}
if (pinfo.prog_info.active & MFI_PD_PROGRESS_REBUILD) {
printf("drive %u ", device_id);
mfi_display_progress("Rebuild", &pinfo.prog_info.rbld);
busy = 1;
}
if (pinfo.prog_info.active & MFI_PD_PROGRESS_PATROL) {
printf("drive %u ", device_id);
mfi_display_progress("Patrol Read",
&pinfo.prog_info.patrol);
busy = 1;
}
if (pinfo.prog_info.active & MFI_PD_PROGRESS_CLEAR) {
printf("drive %u ", device_id);
mfi_display_progress("Clear", &pinfo.prog_info.clear);
busy = 1;
}
}
close(fd);
if (!busy)
printf("No activity in progress for adapter mfi%d\n", mfi_unit);
return (0);
}
MFI_COMMAND(show, progress, show_progress);

View File

@ -27,7 +27,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd April 5, 2011
.Dd April 29, 2011
.Dt MFIUTIL 8
.Os
.Sh NAME
@ -67,6 +67,9 @@
.Cm show patrol
.Nm
.Op Fl u Ar unit
.Cm show progress
.Nm
.Op Fl u Ar unit
.Cm show volumes
.Nm
.Op Fl u Ar unit
@ -296,6 +299,9 @@ Lists all of the firmware images present on the controller.
Display the various sequence numbers associated with the event log.
.It Cm show patrol
Display the status of the controller's patrol read operation.
.It Cm show progress
Report the current progress and estimated completion time for active
operations on all volumes and drives.
.It Cm show volumes
Lists all of the logical volumes managed by the controller.
.El

View File

@ -60,6 +60,7 @@ usage(void)
fprintf(stderr, " show firmware - list firmware images\n");
fprintf(stderr, " show volumes - list logical volumes\n");
fprintf(stderr, " show patrol - display patrol read status\n");
fprintf(stderr, " show progress - display status of active operations\n");
fprintf(stderr, " fail <drive> - fail a physical drive\n");
fprintf(stderr, " good <drive> - mark a bad physical drive as good\n");
fprintf(stderr, " rebuild <drive> - mark failed drive ready for rebuild\n");