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,10 +48,11 @@
#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,10 +171,11 @@
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,10 +875,11 @@
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,11 +948,11 @@
if (flag & FEXCL) {
if (bd->d_open_lyr[part]) {
rv = EBUSY;
goto done;
}
- for (int i = 0; i < OTYP_LYR; i++) {
+ for (i = 0; i < OTYP_LYR; i++) {
if (bd->d_open_reg[i] & mask) {
rv = EBUSY;
goto done;
}
}
@@ -978,10 +981,11 @@
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,16 +1008,16 @@
if (otyp == OTYP_LYR) {
bd->d_open_lyr[part]--;
} else {
bd->d_open_reg[otyp] &= ~mask;
}
- for (int i = 0; i < 64; i++) {
+ for (i = 0; i < 64; i++) {
if (bd->d_open_lyr[part]) {
last = B_FALSE;
}
}
- for (int i = 0; last && (i < OTYP_LYR); i++) {
+ for (i = 0; last && (i < OTYP_LYR); i++) {
if (bd->d_open_reg[i]) {
last = B_FALSE;
}
}
mutex_exit(&bd->d_ocmutex);
@@ -1387,10 +1391,38 @@
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,10 +1780,45 @@
/* 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);
}