Print this page
NEX-8020 illumos nvme changes
Reviewed by: Dan Fields <dan.fields@nexenta.com>
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
NEX-6131 support EUI64 in blkdev
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
NEX-5236 harmless off-by-one in blkdev
Reviewed by: Dan Fields <dan.fields@nexenta.com>
NEX-4427 blkdev should provide the device_error kstat for iostat -E
Reviewed by: Richard Elling <Richard.Elling@RichardElling.com>
Reviewed by: Garrett D'Amore <garrett@damore.org>
NEX-4424 kstat module needs cleanup
Reviewed by: Richard Elling <Richard.Elling@RichardElling.com>
Reviewed by: Garrett D'Amore <garrett@damore.org>
NEX-4420 format(1M) should be able to use device inquiry properties
Reviewed by: Dan McDonald <danmcd@omniti.com>
NEX-4419 blkdev and blkdev drivers should provide inquiry properties
Reviewed by: Garrett D'Amore <garrett@damore.org>
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
port of illumos-3878
    3878 blkdev needs to support DKIOCGMEDIAINFOEXT
    Reviewed by: Saso Kiselkov <skiselkov.ml@gmail.com>
    Reviewed by: Garrett D'Amore <garrett@damore.org>
    Approved by: Garrett D'Amore <garrett@damore.org>
port of illumos-2911
    2911 blkdev-related panic on DEBUG kernels
    Reviewed by: Richard Lowe <richlowe@richlowe.net>
    Reviewed by: Garrett D'Amore <garrett@damore.org>
    Approved by: Garrett D'Amore <garrett@damore.org>
Adding AoE support to nza-kernel

*** 48,57 **** --- 48,58 ---- #include <sys/kstat.h> #include <sys/fs/dv_node.h> #include <sys/ddi.h> #include <sys/sunddi.h> #include <sys/note.h> + #include <sys/mhd.h> #include <sys/blkdev.h> #include <sys/scsi/impl/inquiry.h> #define BD_MAXPART 64 #define BDINST(dev) (getminor(dev) / BD_MAXPART)
*** 170,179 **** --- 171,181 ---- static void bd_submit(bd_t *, bd_xfer_impl_t *); static void bd_runq_exit(bd_xfer_impl_t *, int); static void bd_update_state(bd_t *); static int bd_check_state(bd_t *, enum dkio_state *); static int bd_flush_write_cache(bd_t *, struct dk_callback *); + static int bd_reserve(bd_t *bd, int); static int bd_check_uio(dev_t, struct uio *); struct cmlb_tg_ops bd_tg_ops = { TG_DK_OPS_VERSION_1, bd_tg_rdwr,
*** 873,882 **** --- 875,885 ---- uint64_t mask; boolean_t ndelay; int rv; diskaddr_t nblks; diskaddr_t lba; + int i; _NOTE(ARGUNUSED(credp)); part = BDPART(dev); inst = BDINST(dev);
*** 945,955 **** if (flag & FEXCL) { if (bd->d_open_lyr[part]) { rv = EBUSY; goto done; } ! for (int i = 0; i < OTYP_LYR; i++) { if (bd->d_open_reg[i] & mask) { rv = EBUSY; goto done; } } --- 948,958 ---- if (flag & FEXCL) { if (bd->d_open_lyr[part]) { rv = EBUSY; goto done; } ! for (i = 0; i < OTYP_LYR; i++) { if (bd->d_open_reg[i] & mask) { rv = EBUSY; goto done; } }
*** 978,987 **** --- 981,991 ---- bd_t *bd; minor_t inst; minor_t part; uint64_t mask; boolean_t last = B_TRUE; + int i; _NOTE(ARGUNUSED(flag)); _NOTE(ARGUNUSED(credp)); part = BDPART(dev);
*** 1004,1019 **** if (otyp == OTYP_LYR) { bd->d_open_lyr[part]--; } else { bd->d_open_reg[otyp] &= ~mask; } ! for (int i = 0; i < 64; i++) { if (bd->d_open_lyr[part]) { last = B_FALSE; } } ! for (int i = 0; last && (i < OTYP_LYR); i++) { if (bd->d_open_reg[i]) { last = B_FALSE; } } mutex_exit(&bd->d_ocmutex); --- 1008,1023 ---- if (otyp == OTYP_LYR) { bd->d_open_lyr[part]--; } else { bd->d_open_reg[otyp] &= ~mask; } ! for (i = 0; i < 64; i++) { if (bd->d_open_lyr[part]) { last = B_FALSE; } } ! for (i = 0; last && (i < OTYP_LYR); i++) { if (bd->d_open_reg[i]) { last = B_FALSE; } } mutex_exit(&bd->d_ocmutex);
*** 1387,1396 **** --- 1391,1428 ---- rv = bd_flush_write_cache(bd, dkc); return (rv); } + case MHIOCTKOWN: + { + return (bd_reserve(bd, BD_XFER_MHD_TKOWN)); + } + + case MHIOCRELEASE: + { + return (bd_reserve(bd, BD_XFER_MHD_RELEASE)); + } + + case MHIOCSTATUS: + { + rv = bd_reserve(bd, BD_XFER_MHD_STATUS); + if (rvalp != NULL) + *rvalp = rv == 0 ? 0: 1; + return (0); + } + + case MHIOCQRESERVE: + { + return (bd_reserve(bd, BD_XFER_MHD_QRESERVE)); + } + + case MHIOCENFAILFAST: + { + return (bd_reserve(bd, BD_XFER_MHD_ENFAILFAST)); + } + default: break; } return (ENOTTY);
*** 1748,1757 **** --- 1780,1824 ---- /* In case there is no callback, perform a synchronous flush */ bd_submit(bd, xi); (void) biowait(bp); rv = geterror(bp); + freerbuf(bp); + + return (rv); + } + + static int + bd_reserve(bd_t *bd, int flag) + { + buf_t *bp; + bd_xfer_impl_t *xi; + int rv; + + if (bd->d_ops.o_reserve == NULL) { + return (ENOTSUP); + } + if ((bp = getrbuf(KM_SLEEP)) == NULL) { + return (ENOMEM); + } + bp->b_resid = 0; + bp->b_bcount = 0; + + xi = bd_xfer_alloc(bd, bp, bd->d_ops.o_reserve, KM_SLEEP); + if (xi == NULL) { + rv = geterror(bp); + freerbuf(bp); + return (rv); + } + + xi->i_flags = flag; + + bd_submit(bd, xi); + + /* wait synchronously */ + (void) biowait(bp); + rv = geterror(bp); freerbuf(bp); return (rv); }