Module Name: src
Committed By: joerg
Date: Sat May 30 20:09:47 UTC 2015
Modified Files:
src/sys/dev/iscsi: iscsi_globals.h iscsi_ioctl.c iscsi_main.c
src/sys/sys: file.h
Log Message:
Create a per-device state for iscsi(4), effectively making it a cloning
device.
To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/dev/iscsi/iscsi_globals.h
cvs rdiff -u -r1.11 -r1.12 src/sys/dev/iscsi/iscsi_ioctl.c
cvs rdiff -u -r1.15 -r1.16 src/sys/dev/iscsi/iscsi_main.c
cvs rdiff -u -r1.78 -r1.79 src/sys/sys/file.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/iscsi/iscsi_globals.h
diff -u src/sys/dev/iscsi/iscsi_globals.h:1.12 src/sys/dev/iscsi/iscsi_globals.h:1.13
--- src/sys/dev/iscsi/iscsi_globals.h:1.12 Sat May 30 18:12:09 2015
+++ src/sys/dev/iscsi/iscsi_globals.h Sat May 30 20:09:47 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: iscsi_globals.h,v 1.12 2015/05/30 18:12:09 joerg Exp $ */
+/* $NetBSD: iscsi_globals.h,v 1.13 2015/05/30 20:09:47 joerg Exp $ */
/*-
* Copyright (c) 2004,2005,2006,2011 The NetBSD Foundation, Inc.
@@ -500,6 +500,10 @@ typedef struct event_handler_s {
TAILQ_HEAD(event_handler_list_s, event_handler_s);
typedef struct event_handler_list_s event_handler_list_t;
+/* /dev/iscsi0 state */
+struct iscsifd {
+ char dummy;
+};
/* ------------------------- Global Variables ----------------------------- */
@@ -648,7 +652,7 @@ void iscsi_cleanup_thread(void *);
uint32_t map_databuf(struct proc *, void **, uint32_t);
void unmap_databuf(struct proc *, void *, uint32_t);
#endif
-int iscsiioctl(dev_t, u_long, void *, int, struct lwp *);
+int iscsiioctl(struct file *, u_long, void *);
session_t *find_session(uint32_t);
connection_t *find_connection(session_t *, uint32_t);
Index: src/sys/dev/iscsi/iscsi_ioctl.c
diff -u src/sys/dev/iscsi/iscsi_ioctl.c:1.11 src/sys/dev/iscsi/iscsi_ioctl.c:1.12
--- src/sys/dev/iscsi/iscsi_ioctl.c:1.11 Sat May 30 18:09:31 2015
+++ src/sys/dev/iscsi/iscsi_ioctl.c Sat May 30 20:09:47 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: iscsi_ioctl.c,v 1.11 2015/05/30 18:09:31 joerg Exp $ */
+/* $NetBSD: iscsi_ioctl.c,v 1.12 2015/05/30 20:09:47 joerg Exp $ */
/*-
* Copyright (c) 2004,2005,2006,2011 The NetBSD Foundation, Inc.
@@ -1593,8 +1593,9 @@ iscsi_cleanup_thread(void *par)
*/
int
-iscsiioctl(dev_t dev, u_long cmd, void *addr, int flag, struct lwp *l)
+iscsiioctl(struct file *fp, u_long cmd, void *addr)
{
+ struct lwp *l = curlwp;
DEB(1, ("ISCSI Ioctl cmd = %x\n", (int) cmd));
Index: src/sys/dev/iscsi/iscsi_main.c
diff -u src/sys/dev/iscsi/iscsi_main.c:1.15 src/sys/dev/iscsi/iscsi_main.c:1.16
--- src/sys/dev/iscsi/iscsi_main.c:1.15 Sat May 30 18:00:09 2015
+++ src/sys/dev/iscsi/iscsi_main.c Sat May 30 20:09:47 2015
@@ -32,6 +32,8 @@
#include <sys/systm.h>
#include <sys/buf.h>
+#include <sys/file.h>
+#include <sys/filedesc.h>
#include <sys/kmem.h>
#include <sys/socketvar.h>
@@ -83,14 +85,19 @@ CFATTACH_DECL_NEW(iscsi, sizeof(struct i
static dev_type_open(iscsiopen);
-static dev_type_close(iscsiclose);
+static int iscsiclose(struct file *);
+
+static const struct fileops iscsi_fileops = {
+ .fo_ioctl = iscsiioctl,
+ .fo_close = iscsiclose,
+};
struct cdevsw iscsi_cdevsw = {
.d_open = iscsiopen,
- .d_close = iscsiclose,
+ .d_close = noclose,
.d_read = noread,
.d_write = nowrite,
- .d_ioctl = iscsiioctl,
+ .d_ioctl = noioctl,
.d_stop = nostop,
.d_tty = notty,
.d_poll = nopoll,
@@ -119,14 +126,27 @@ STATIC void iscsi_minphys(struct buf *);
int
iscsiopen(dev_t dev, int flag, int mode, struct lwp *l)
{
+ struct iscsifd *d;
+ struct file *fp;
+ int error, fd;
DEB(99, ("ISCSI Open\n"));
- return 0;
+
+ if ((error = fd_allocfile(&fp, &fd)) != 0)
+ return error;
+
+ d = kmem_alloc(sizeof(*d), KM_SLEEP);
+
+ return fd_clone(fp, fd, flag, &iscsi_fileops, d);
}
-int
-iscsiclose(dev_t dev, int flag, int mode, struct lwp *l)
+static int
+iscsiclose(struct file *fp)
{
+ struct iscsifd *d = fp->f_iscsi;
+
+ kmem_free(d, sizeof(*d));
+ fp->f_iscsi = NULL;
DEB(99, ("ISCSI Close\n"));
return 0;
Index: src/sys/sys/file.h
diff -u src/sys/sys/file.h:1.78 src/sys/sys/file.h:1.79
--- src/sys/sys/file.h:1.78 Sun Dec 14 23:48:58 2014
+++ src/sys/sys/file.h Sat May 30 20:09:47 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: file.h,v 1.78 2014/12/14 23:48:58 chs Exp $ */
+/* $NetBSD: file.h,v 1.79 2015/05/30 20:09:47 joerg Exp $ */
/*-
* Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -108,6 +108,7 @@ union file_data {
struct fcrypt *fd_fcrypt; // DTYPE_CRYPTO is not used
struct mqueue *fd_mq; // DTYPE_MQUEUE
struct ksem *fd_ks; // DTYPE_SEM
+ struct iscsifd *fd_iscsi; // DTYPE_MISC (iscsi)
};
/*
@@ -146,6 +147,7 @@ struct file {
#define f_devunit f_undata.fd_devunit
#define f_bpf f_undata.fd_bpf
#define f_fcrypt f_undata.fd_fcrypt
+#define f_iscsi f_undata.fd_iscsi
#endif
/*