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
 
 /*

Reply via email to