Print this page
3580 Want zvols to return volblocksize when queried for physical block size
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Dan Kimmel <dan.kimmel@delphix.com>
Reviewed by: Adam Leventhal <ahl@delphix.com>
Reviewed by: Christopher Siden <christopher.siden@delphix.com>

@@ -1625,12 +1625,10 @@
 /*ARGSUSED*/
 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 dki;
-        struct dk_minfo dkm;
         struct dk_callback *dkc;
         int error = 0;
         rl_t *rl;
 
         mutex_enter(&zfsdev_state_lock);

@@ -1644,10 +1642,13 @@
         ASSERT(zv->zv_total_opens > 0);
 
         switch (cmd) {
 
         case DKIOCINFO:
+        {
+                struct dk_cinfo dki;
+
                 bzero(&dki, sizeof (dki));
                 (void) strcpy(dki.dki_cname, "zvol");
                 (void) strcpy(dki.dki_dname, "zvol");
                 dki.dki_ctype = DKC_UNKNOWN;
                 dki.dki_unit = getminor(dev);

@@ -1654,21 +1655,41 @@
                 dki.dki_maxtransfer = 1 << (SPA_MAXBLOCKSHIFT - zv->zv_min_bs);
                 mutex_exit(&zfsdev_state_lock);
                 if (ddi_copyout(&dki, (void *)arg, sizeof (dki), flag))
                         error = SET_ERROR(EFAULT);
                 return (error);
+        }
 
         case DKIOCGMEDIAINFO:
+        {
+                struct dk_minfo dkm;
+
                 bzero(&dkm, sizeof (dkm));
                 dkm.dki_lbsize = 1U << zv->zv_min_bs;
                 dkm.dki_capacity = zv->zv_volsize >> zv->zv_min_bs;
                 dkm.dki_media_type = DK_UNKNOWN;
                 mutex_exit(&zfsdev_state_lock);
                 if (ddi_copyout(&dkm, (void *)arg, sizeof (dkm), flag))
                         error = SET_ERROR(EFAULT);
                 return (error);
+        }
 
+        case DKIOCGMEDIAINFOEXT:
+        {
+                struct dk_minfo_ext dkmext;
+
+                bzero(&dkmext, sizeof (dkmext));
+                dkmext.dki_lbsize = 1U << zv->zv_min_bs;
+                dkmext.dki_pbsize = zv->zv_volblocksize;
+                dkmext.dki_capacity = zv->zv_volsize >> zv->zv_min_bs;
+                dkmext.dki_media_type = DK_UNKNOWN;
+                mutex_exit(&zfsdev_state_lock);
+                if (ddi_copyout(&dkmext, (void *)arg, sizeof (dkmext), flag))
+                        error = SET_ERROR(EFAULT);
+                return (error);
+        }
+
         case DKIOCGETEFI:
                 {
                         uint64_t vs = zv->zv_volsize;
                         uint8_t bs = zv->zv_min_bs;