diff options
author | scottl <scottl@FreeBSD.org> | 2007-05-10 15:33:41 +0000 |
---|---|---|
committer | scottl <scottl@FreeBSD.org> | 2007-05-10 15:33:41 +0000 |
commit | c1f92f9a266a46d212d75d17c49062fcd72a88b1 (patch) | |
tree | 0b192bdf920c7ff1fa9073529fd2c7ef9ca382e6 /sys/dev/mfi/mfi.c | |
parent | ced6c23397bb86d97c036e35c740110c6cab4599 (diff) | |
download | FreeBSD-src-c1f92f9a266a46d212d75d17c49062fcd72a88b1.zip FreeBSD-src-c1f92f9a266a46d212d75d17c49062fcd72a88b1.tar.gz |
Collapse the mfi_ld object. Add an ioctl to help management apps map
array Id's to FreeBSD device names.
Diffstat (limited to 'sys/dev/mfi/mfi.c')
-rw-r--r-- | sys/dev/mfi/mfi.c | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/sys/dev/mfi/mfi.c b/sys/dev/mfi/mfi.c index dcbfdd4..2dae176 100644 --- a/sys/dev/mfi/mfi.c +++ b/sys/dev/mfi/mfi.c @@ -1363,7 +1363,6 @@ mfi_add_ld_complete(struct mfi_command *cm) struct mfi_frame_header *hdr; struct mfi_ld_info *ld_info; struct mfi_softc *sc; - struct mfi_ld *ld; device_t child; sc = cm->cm_sc; @@ -1377,25 +1376,13 @@ mfi_add_ld_complete(struct mfi_command *cm) } mfi_release_command(cm); - ld = malloc(sizeof(struct mfi_ld), M_MFIBUF, M_NOWAIT|M_ZERO); - if (ld == NULL) { - device_printf(sc->mfi_dev, "Cannot allocate ld\n"); - free(ld_info, M_MFIBUF); - return; - } - if ((child = device_add_child(sc->mfi_dev, "mfid", -1)) == NULL) { device_printf(sc->mfi_dev, "Failed to add logical disk\n"); - free(ld, M_MFIBUF); free(ld_info, M_MFIBUF); return; } - ld->ld_id = ld_info->ld_config.properties.ld.v.target_id; - ld->ld_disk = child; - ld->ld_info = ld_info; - - device_set_ivars(child, ld); + device_set_ivars(child, ld_info); device_set_desc(child, "MFI Logical Disk"); mtx_unlock(&sc->mfi_io_lock); mtx_lock(&Giant); @@ -1802,6 +1789,30 @@ mfi_ioctl(struct cdev *dev, u_long cmd, caddr_t arg, int flag, d_thread_t *td) break; } break; + case MFIIO_QUERY_DISK: + { + struct mfi_query_disk *qd; + struct mfi_disk *ld; + + qd = (struct mfi_query_disk *)arg; + mtx_lock(&sc->mfi_io_lock); + TAILQ_FOREACH(ld, &sc->mfi_ld_tqh, ld_link) { + if (ld->ld_id == qd->array_id) + break; + } + if (ld == NULL) { + qd->present = 0; + mtx_unlock(&sc->mfi_io_lock); + return (0); + } + qd->present = 1; + if (ld->ld_flags & MFI_DISK_FLAGS_OPEN) + qd->open = 1; + bzero(qd->devname, SPECNAMELEN + 1); + snprintf(qd->devname, SPECNAMELEN, "mfid%d", ld->ld_unit); + mtx_unlock(&sc->mfi_io_lock); + break; + } case MFI_CMD: ioc = (struct mfi_ioc_packet *)arg; |