diff options
author | mav <mav@FreeBSD.org> | 2017-01-26 20:51:18 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2017-01-26 20:51:18 +0000 |
commit | def810b072e5fce7bc013dbd3bffeb8892b17448 (patch) | |
tree | df8d3d9d724213c3c6d20fd1a5230e95af782f9b /sys/cam | |
parent | cdca9c66d55c395e0e553a26f288bf4e36043c55 (diff) | |
download | FreeBSD-src-def810b072e5fce7bc013dbd3bffeb8892b17448.zip FreeBSD-src-def810b072e5fce7bc013dbd3bffeb8892b17448.tar.gz |
MFC r311680: Make CTL_GETSTATS ioctl return partial data if buffer is small.
Diffstat (limited to 'sys/cam')
-rw-r--r-- | sys/cam/ctl/ctl.c | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/sys/cam/ctl/ctl.c b/sys/cam/ctl/ctl.c index d4f0ab7..1164b13 100644 --- a/sys/cam/ctl/ctl.c +++ b/sys/cam/ctl/ctl.c @@ -2779,32 +2779,29 @@ ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, break; } case CTL_GETSTATS: { - struct ctl_stats *stats; + struct ctl_stats *stats = (struct ctl_stats *)addr; int i; - stats = (struct ctl_stats *)addr; - - if ((sizeof(struct ctl_lun_io_stats) * softc->num_luns) > - stats->alloc_len) { - stats->status = CTL_SS_NEED_MORE_SPACE; - stats->num_luns = softc->num_luns; - break; - } /* * XXX KDM no locking here. If the LUN list changes, * things can blow up. */ i = 0; + stats->status = CTL_SS_OK; + stats->fill_len = 0; STAILQ_FOREACH(lun, &softc->lun_list, links) { + if (stats->fill_len + sizeof(lun->stats) > + stats->alloc_len) { + stats->status = CTL_SS_NEED_MORE_SPACE; + break; + } retval = copyout(&lun->stats, &stats->lun_stats[i++], sizeof(lun->stats)); if (retval != 0) break; + stats->fill_len += sizeof(lun->stats); } stats->num_luns = softc->num_luns; - stats->fill_len = sizeof(struct ctl_lun_io_stats) * - softc->num_luns; - stats->status = CTL_SS_OK; #ifdef CTL_TIME_IO stats->flags = CTL_STATS_FLAG_TIME_VALID; #else |