diff options
Diffstat (limited to 'usr/src/uts/common/fs/zfs/zvol.c')
-rw-r--r-- | usr/src/uts/common/fs/zfs/zvol.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/usr/src/uts/common/fs/zfs/zvol.c b/usr/src/uts/common/fs/zfs/zvol.c index 4628ff4aa3..1335207aa6 100644 --- a/usr/src/uts/common/fs/zfs/zvol.c +++ b/usr/src/uts/common/fs/zfs/zvol.c @@ -961,9 +961,10 @@ int zvol_ioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cr, int *rvalp) { zvol_state_t *zv; - struct dk_cinfo dkc; + struct dk_cinfo dki; struct dk_minfo dkm; dk_efi_t efi; + struct dk_callback *dkc; struct uuid uuid = EFI_RESERVED; uint32_t crc; int error = 0; @@ -980,13 +981,13 @@ zvol_ioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cr, int *rvalp) switch (cmd) { case DKIOCINFO: - bzero(&dkc, sizeof (dkc)); - (void) strcpy(dkc.dki_cname, "zvol"); - (void) strcpy(dkc.dki_dname, "zvol"); - dkc.dki_ctype = DKC_UNKNOWN; - dkc.dki_maxtransfer = 1 << (SPA_MAXBLOCKSHIFT - zv->zv_min_bs); + bzero(&dki, sizeof (dki)); + (void) strcpy(dki.dki_cname, "zvol"); + (void) strcpy(dki.dki_dname, "zvol"); + dki.dki_ctype = DKC_UNKNOWN; + dki.dki_maxtransfer = 1 << (SPA_MAXBLOCKSHIFT - zv->zv_min_bs); mutex_exit(&zvol_state_lock); - if (ddi_copyout(&dkc, (void *)arg, sizeof (dkc), flag)) + if (ddi_copyout(&dki, (void *)arg, sizeof (dki), flag)) error = EFAULT; return (error); @@ -1074,7 +1075,12 @@ zvol_ioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cr, int *rvalp) return (error); case DKIOCFLUSHWRITECACHE: + dkc = (struct dk_callback *)arg; zil_commit(zv->zv_zilog, UINT64_MAX, ZVOL_OBJ); + if ((flag & FKIOCTL) && dkc != NULL && dkc->dkc_callback) { + (*dkc->dkc_callback)(dkc->dkc_cookie, error); + error = 0; + } break; case DKIOCGGEOM: |