Module Name: src
Committed By: nonaka
Date: Thu Sep 8 15:00:08 UTC 2016
Modified Files:
src/etc: MAKEDEV.tmpl
src/sys/conf: majors
src/sys/dev/ic: nvme.c
Log Message:
Fix to cannnot be opened a nvme(4) namespace device file.
To generate a diff of this commit:
cvs rdiff -u -r1.182 -r1.183 src/etc/MAKEDEV.tmpl
cvs rdiff -u -r1.74 -r1.75 src/sys/conf/majors
cvs rdiff -u -r1.4 -r1.5 src/sys/dev/ic/nvme.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/etc/MAKEDEV.tmpl
diff -u src/etc/MAKEDEV.tmpl:1.182 src/etc/MAKEDEV.tmpl:1.183
--- src/etc/MAKEDEV.tmpl:1.182 Sat Jul 23 06:48:27 2016
+++ src/etc/MAKEDEV.tmpl Thu Sep 8 15:00:08 2016
@@ -1,5 +1,5 @@
#!/bin/sh -
-# $NetBSD: MAKEDEV.tmpl,v 1.182 2016/07/23 06:48:27 kre Exp $
+# $NetBSD: MAKEDEV.tmpl,v 1.183 2016/09/08 15:00:08 nonaka Exp $
#
# Copyright (c) 2003,2007,2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -2211,12 +2211,12 @@ nvme[0-9]*ns[0-9]*)
warn "bad nsid for $i: $subunit"
break
fi
- mkdev nvme${unit}ns$subunit c %nvmens_chr% $(($unit * 65536 + $subunit))
+ mkdev nvme${unit}ns$subunit c %nvme_chr% $(($unit * 65536 + $subunit))
;;
nvme[0-9]*)
unit=${i#nvme}
- mkdev nvme$unit c %nvme_chr% $unit
+ mkdev nvme$unit c %nvme_chr% $(($unit * 65536))
;;
midevend)
Index: src/sys/conf/majors
diff -u src/sys/conf/majors:1.74 src/sys/conf/majors:1.75
--- src/sys/conf/majors:1.74 Sat Jun 4 16:11:50 2016
+++ src/sys/conf/majors Thu Sep 8 15:00:08 2016
@@ -1,4 +1,4 @@
-# $NetBSD: majors,v 1.74 2016/06/04 16:11:50 nonaka Exp $
+# $NetBSD: majors,v 1.75 2016/09/08 15:00:08 nonaka Exp $
#
# Device majors for Machine-Independent drivers.
#
@@ -73,4 +73,3 @@ device-major lua char 209
device-major hdmicec char 340 hdmicec
device-major nvme char 341 nvme
-device-major nvmens char 342 nvmens
Index: src/sys/dev/ic/nvme.c
diff -u src/sys/dev/ic/nvme.c:1.4 src/sys/dev/ic/nvme.c:1.5
--- src/sys/dev/ic/nvme.c:1.4 Thu Sep 8 04:41:16 2016
+++ src/sys/dev/ic/nvme.c Thu Sep 8 15:00:08 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: nvme.c,v 1.4 2016/09/08 04:41:16 nonaka Exp $ */
+/* $NetBSD: nvme.c,v 1.5 2016/09/08 15:00:08 nonaka Exp $ */
/* $OpenBSD: nvme.c,v 1.49 2016/04/18 05:59:50 dlg Exp $ */
/*
@@ -18,7 +18,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvme.c,v 1.4 2016/09/08 04:41:16 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvme.c,v 1.5 2016/09/08 15:00:08 nonaka Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -1436,7 +1436,6 @@ nvme_dmamem_free(struct nvme_softc *sc,
* ioctl
*/
-/* nvme */
dev_type_open(nvmeopen);
dev_type_close(nvmeclose);
dev_type_ioctl(nvmeioctl);
@@ -1465,88 +1464,6 @@ int
nvmeopen(dev_t dev, int flag, int mode, struct lwp *l)
{
struct nvme_softc *sc;
- int unit = minor(dev);
-
- if ((sc = device_lookup_private(&nvme_cd, unit)) == NULL)
- return ENXIO;
- if ((sc->sc_flags & NVME_F_ATTACHED) == 0)
- return ENXIO;
- if (ISSET(sc->sc_flags, NVME_F_OPEN))
- return EBUSY;
-
- SET(sc->sc_flags, NVME_F_OPEN);
- return 0;
-}
-
-/*
- * Accept the last close on the control device.
- */
-int
-nvmeclose(dev_t dev, int flag, int mode, struct lwp *l)
-{
- struct nvme_softc *sc;
- int unit = minor(dev);
-
- sc = device_lookup_private(&nvme_cd, unit);
- if (sc == NULL)
- return ENXIO;
-
- CLR(sc->sc_flags, NVME_F_OPEN);
- return 0;
-}
-
-/*
- * Handle control operations.
- */
-int
-nvmeioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
-{
- struct nvme_softc *sc;
- struct nvme_pt_command *pt;
- int unit = minor(dev);
-
- sc = device_lookup_private(&nvme_cd, unit);
- if (sc == NULL)
- return ENXIO;
-
- switch (cmd) {
- case NVME_PASSTHROUGH_CMD:
- pt = (struct nvme_pt_command *)data;
- return nvme_command_passthrough(sc, pt, pt->cmd.nsid, l, true);
- }
-
- return ENOTTY;
-}
-
-/* nvmens */
-dev_type_open(nvmensopen);
-dev_type_close(nvmensclose);
-dev_type_ioctl(nvmensioctl);
-
-const struct cdevsw nvmens_cdevsw = {
- .d_open = nvmensopen,
- .d_close = nvmensclose,
- .d_read = noread,
- .d_write = nowrite,
- .d_ioctl = nvmensioctl,
- .d_stop = nostop,
- .d_tty = notty,
- .d_poll = nopoll,
- .d_mmap = nommap,
- .d_kqfilter = nokqfilter,
- .d_discard = nodiscard,
- .d_flag = D_OTHER,
-};
-
-extern struct cfdriver nvmens_cd;
-
-/*
- * Accept an open operation on the control device.
- */
-int
-nvmensopen(dev_t dev, int flag, int mode, struct lwp *l)
-{
- struct nvme_softc *sc;
int unit = minor(dev) / 0x10000;
int nsid = minor(dev) & 0xffff;
int nsidx;
@@ -1555,16 +1472,21 @@ nvmensopen(dev_t dev, int flag, int mode
return ENXIO;
if ((sc->sc_flags & NVME_F_ATTACHED) == 0)
return ENXIO;
- if (nsid == 0)
- return ENXIO;
-
- nsidx = nsid - 1;
- if (nsidx >= sc->sc_nn || sc->sc_namespaces[nsidx].dev == NULL)
- return ENXIO;
- if (ISSET(sc->sc_namespaces[nsidx].flags, NVME_NS_F_OPEN))
- return EBUSY;
- SET(sc->sc_namespaces[nsidx].flags, NVME_NS_F_OPEN);
+ if (nsid == 0) {
+ /* controller */
+ if (ISSET(sc->sc_flags, NVME_F_OPEN))
+ return EBUSY;
+ SET(sc->sc_flags, NVME_F_OPEN);
+ } else {
+ /* namespace */
+ nsidx = nsid - 1;
+ if (nsidx >= sc->sc_nn || sc->sc_namespaces[nsidx].dev == NULL)
+ return ENXIO;
+ if (ISSET(sc->sc_namespaces[nsidx].flags, NVME_NS_F_OPEN))
+ return EBUSY;
+ SET(sc->sc_namespaces[nsidx].flags, NVME_NS_F_OPEN);
+ }
return 0;
}
@@ -1572,7 +1494,7 @@ nvmensopen(dev_t dev, int flag, int mode
* Accept the last close on the control device.
*/
int
-nvmensclose(dev_t dev, int flag, int mode, struct lwp *l)
+nvmeclose(dev_t dev, int flag, int mode, struct lwp *l)
{
struct nvme_softc *sc;
int unit = minor(dev) / 0x10000;
@@ -1582,14 +1504,18 @@ nvmensclose(dev_t dev, int flag, int mod
sc = device_lookup_private(&nvme_cd, unit);
if (sc == NULL)
return ENXIO;
- if (nsid == 0)
- return ENXIO;
- nsidx = nsid - 1;
- if (nsidx >= sc->sc_nn)
- return ENXIO;
+ if (nsid == 0) {
+ /* controller */
+ CLR(sc->sc_flags, NVME_F_OPEN);
+ } else {
+ /* namespace */
+ nsidx = nsid - 1;
+ if (nsidx >= sc->sc_nn)
+ return ENXIO;
+ CLR(sc->sc_namespaces[nsidx].flags, NVME_NS_F_OPEN);
+ }
- CLR(sc->sc_namespaces[nsidx].flags, NVME_NS_F_OPEN);
return 0;
}
@@ -1597,21 +1523,22 @@ nvmensclose(dev_t dev, int flag, int mod
* Handle control operations.
*/
int
-nvmensioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
+nvmeioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
{
struct nvme_softc *sc;
int unit = minor(dev) / 0x10000;
int nsid = minor(dev) & 0xffff;
+ struct nvme_pt_command *pt;
sc = device_lookup_private(&nvme_cd, unit);
if (sc == NULL)
return ENXIO;
- if (nsid == 0)
- return ENXIO;
switch (cmd) {
case NVME_PASSTHROUGH_CMD:
- return nvme_command_passthrough(sc, data, nsid, l, false);
+ pt = data;
+ return nvme_command_passthrough(sc, data,
+ nsid == 0 ? pt->cmd.nsid : nsid, l, nsid == 0);
}
return ENOTTY;