>Number: 184405
>Category: amd64
>Synopsis: [regression] [patch] 'mfiutil show drives' from 9.2-REL shows
>0.0 size for all drives
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-amd64
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Sun Dec 01 05:30:00 UTC 2013
>Closed-Date:
>Last-Modified:
>Originator: Zurvan Akarana
>Release: 9.2 RELEASE
>Organization:
N/A
>Environment:
FreeBSD [redacted] 9.2-RELEASE FreeBSD 9.2-RELEASE #0 r255898: Thu Sep 26
22:50:31 UTC 2013 [email protected]:/usr/obj/usr/src/sys/GENERIC
amd64
>Description:
Upgraded to 9.2-RELEASE on Nov. 29, 2013.
Have an LSI-2108-based raid controller supported without issues by mfi(4).
Prior to upgrade 'mfiutil show drives' showed drive sizes correctly.
After upgrade the output became like this
0 ( 0.0) ONLINE <[redacted] serial=[redacted]> SATA E1:S4
I.e., drive size was reported to be 0.0.
All other aspects of mfi(4) that I have tested so far seem to work fine, as
they did before.
>How-To-Repeat:
Any run of 'mfiutil show drives' reproduces the problem. I use 3 TB drives
connected to the controller but the problem is unaffected by drive size.
>Fix:
Traced the problem to usr.sbin/mfiutil/mfi_show.c file, function print_pd.
It makes a call to humanize_number(3) from libutil and supplies a 256-byte
buffer named 'buf' to be filled for this purpose. Then prints it with format
string '%6s' which results in this incorrect behavior.
Just using a 6-byte buffer, supplying it to humanize_number(3), and printing it
fixes the problem. As seen in the other function print_ld in the same source
file.
This bug has been introduced as the larger sized 'buf' was added to source to
allow for formatting status messages for foreign configurations present in the
array, a new mfiutil functionality.
Patch attached with submission follows:
*** mfi_show.c.orig 2013-12-01 05:21:58.000000000 +0000
--- mfi_show.c 2013-12-01 05:14:48.000000000 +0000
***************
*** 316,330 ****
void
print_pd(struct mfi_pd_info *info, int state_len)
{
const char *s;
char buf[256];
! humanize_number(buf, sizeof(buf), info->raw_size * 512, "",
HN_AUTOSCALE, HN_B | HN_NOSPACE |HN_DECIMAL);
! printf("(%6s) ", buf);
if (info->state.ddf.v.pd_type.is_foreign) {
sprintf(buf, "%s%s", mfi_pdstate(info->fw_state),
foreign_state);
s = buf;
} else
s = mfi_pdstate(info->fw_state);
--- 316,331 ----
void
print_pd(struct mfi_pd_info *info, int state_len)
{
const char *s;
+ char size[6];
char buf[256];
! humanize_number(size, sizeof(size), info->raw_size * 512, "",
HN_AUTOSCALE, HN_B | HN_NOSPACE |HN_DECIMAL);
! printf("(%6s) ", size);
if (info->state.ddf.v.pd_type.is_foreign) {
sprintf(buf, "%s%s", mfi_pdstate(info->fw_state),
foreign_state);
s = buf;
} else
s = mfi_pdstate(info->fw_state);
>Release-Note:
>Audit-Trail:
>Unformatted:
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-amd64
To unsubscribe, send any mail to "[email protected]"