walters / rpms / nfs-utils

Forked from rpms/nfs-utils 6 years ago
Clone
Blob Blame History Raw
commit f5beeb9bad08970329dd47371e829e31da79e5f3
Author: Mike Sager <sager@netapp.com>
Date:   Sun Jan 27 17:11:07 2008 -0800

    Update device ops to reflect latest draft and interface changes
    
    1. Change spnfs getdevlist handling into iterative interface to reflect
       export ops changes
    
    2. Update device ops per draft 13
    
    3. Fix code that was written when a data server was thought to be a device
    
    Signed-off-by: Mike Sager <sager@netapp.com>

diff --git a/utils/spnfsd/nfsd4_spnfs.h b/utils/spnfsd/nfsd4_spnfs.h
index 99edae3..7619c75 100644
--- a/utils/spnfsd/nfsd4_spnfs.h
+++ b/utils/spnfsd/nfsd4_spnfs.h
@@ -4,6 +4,7 @@
  * spNFS - simple pNFS implementation with userspace daemon
  *
  */
+
 /******************************************************************************
 
 (c) 2007 Network Appliance, Inc.  All Rights Reserved.
@@ -31,6 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
 #ifdef __KERNEL__
+#include "exportfs.h"
 #include "sunrpc/svc.h"
 #include "nfsd/nfsfh.h"
 #else
@@ -45,17 +47,18 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #define SPNFS_TYPE_LAYOUTGET		0x01
 #define SPNFS_TYPE_LAYOUTCOMMIT		0x02
 #define SPNFS_TYPE_LAYOUTRETURN		0x03
-#define SPNFS_TYPE_GETDEVICELIST	0x04
+#define SPNFS_TYPE_GETDEVICEITER	0x04
 #define SPNFS_TYPE_GETDEVICEINFO	0x05
 #define SPNFS_TYPE_SETATTR		0x06
 #define SPNFS_TYPE_OPEN			0x07
 #define	SPNFS_TYPE_CLOSE		0x08
 #define SPNFS_TYPE_CREATE		0x09
 #define SPNFS_TYPE_REMOVE		0x0a
-#define	SPNFS_TYPE_COMMIT		0x0b
+#define SPNFS_TYPE_COMMIT		0x0b
 
-#define SPNFS_MAX_DATA_SERVERS		2
-#define SPNFS_MAX_LAYOUT		8
+#define	SPNFS_MAX_DEVICES		1
+#define	SPNFS_MAX_DATA_SERVERS		2
+#define	SPNFS_MAX_LAYOUT		8
 
 /* layout */
 struct spnfs_msg_layoutget_args {
@@ -64,9 +67,9 @@ struct spnfs_msg_layoutget_args {
 
 struct spnfs_filelayout_list {
 	u_int32_t	dev_id;
-	u_int32_t	dev_index;
-	u_int32_t	fh_len;
-	unsigned char	fh_val[128]; /* DMXXX fix this const */
+	u_int32_t       ds_index;
+	u_int32_t       fh_len;
+	unsigned char   fh_val[128]; /* DMXXX fix this const */
 };
 
 struct spnfs_msg_layoutget_res {
@@ -97,31 +100,41 @@ struct spnfs_msg_layoutreturn_res {
 };
 */
 
-/* getdevicelist */
-struct spnfs_msg_getdevicelist_args {
+/* getdeviceiter */
+struct spnfs_msg_getdeviceiter_args {
 	unsigned long inode;
+	u_int64_t cookie;
+	u_int64_t verf;
 };
 
-struct spnfs_getdevicelist_dev {
+struct spnfs_msg_getdeviceiter_res {
+	int status;
 	u_int32_t devid;
+	u_int64_t cookie;
+	u_int64_t verf;
+	u_int32_t eof;
+};
+
+/* getdeviceinfo */
+struct spnfs_data_server {
+	u_int32_t dsid;
 	char netid[5];
 	char addr[29];
 };
 
-struct spnfs_msg_getdevicelist_res {
-	int status;
-	int count;
-	struct spnfs_getdevicelist_dev dlist[SPNFS_MAX_DATA_SERVERS];
+struct spnfs_device {
+	u_int32_t devid;
+	int dscount;
+	struct spnfs_data_server dslist[SPNFS_MAX_DATA_SERVERS];
 };
 
-/* getdeviceinfo */
 struct spnfs_msg_getdeviceinfo_args {
 	u_int32_t devid;
 };
 
 struct spnfs_msg_getdeviceinfo_res {
 	int status;
-	struct spnfs_getdevicelist_dev dinfo;
+	struct spnfs_device devinfo;
 };
 
 /* setattr */
@@ -191,29 +204,41 @@ struct spnfs_msg_commit_res {
 union spnfs_msg_args {
 	struct spnfs_msg_layoutget_args		layoutget_args;
 	struct spnfs_msg_layoutcommit_args	layoutcommit_args;
-//	struct spnfs_msg_layoutreturn_args	layoutreturn_args;
-	struct spnfs_msg_getdevicelist_args	getdevicelist_args;
-	struct spnfs_msg_getdeviceinfo_args	getdeviceinfo_args;
+/*
+	struct spnfs_msg_layoutreturn_args	layoutreturn_args;
+*/
+	struct spnfs_msg_getdeviceiter_args     getdeviceiter_args;
+	struct spnfs_msg_getdeviceinfo_args     getdeviceinfo_args;
 	struct spnfs_msg_setattr_args		setattr_args;
 	struct spnfs_msg_open_args		open_args;
 	struct spnfs_msg_close_args		close_args;
-//	struct spnfs_msg_create_args		create_args;
+/*
+	struct spnfs_msg_create_args		create_args;
+*/
 	struct spnfs_msg_remove_args		remove_args;
-//	struct spnfs_msg_commit_args		commit_args;
+/*
+	struct spnfs_msg_commit_args		commit_args;
+*/
 };
 
 union spnfs_msg_res {
 	struct spnfs_msg_layoutget_res		layoutget_res;
 	struct spnfs_msg_layoutcommit_res	layoutcommit_res;
-//	struct spnfs_msg_layoutreturn_res	layoutreturn_res;
-	struct spnfs_msg_getdevicelist_res	getdevicelist_res;
-	struct spnfs_msg_getdeviceinfo_res	getdeviceinfo_res;
+/*
+	struct spnfs_msg_layoutreturn_res	layoutreturn_res;
+*/
+	struct spnfs_msg_getdeviceiter_res      getdeviceiter_res;
+	struct spnfs_msg_getdeviceinfo_res      getdeviceinfo_res;
 	struct spnfs_msg_setattr_res		setattr_res;
 	struct spnfs_msg_open_res		open_res;
 	struct spnfs_msg_close_res		close_res;
-//	struct spnfs_msg_create_res		create_res;
+/*
+	struct spnfs_msg_create_res		create_res;
+*/
 	struct spnfs_msg_remove_res		remove_res;
-//	struct spnfs_msg_commit_res		commit_res;
+/*
+	struct spnfs_msg_commit_res		commit_res;
+*/
 };
 
 /* a spnfs message, args and response */
@@ -238,16 +263,19 @@ struct spnfs {
 
 int spnfs_layout_type(void);
 int spnfs_layoutget(struct inode *, void *);
-int spnfs_layoutcomit(void);
-int spnfs_layoutreturn(void);
-int spnfs_getdevicelist(struct super_block *, void *);
-int spnfs_getdeviceinfo(void);
+int spnfs_layoutcommit(void);
+int spnfs_layoutreturn(struct inode *, void *);
+int spnfs_getdeviceiter(struct super_block *, struct pnfs_deviter_arg *);
+int spnfs_getdeviceinfo(struct super_block *, struct pnfs_devinfo_arg *);
 int spnfs_setattr(void);
 int spnfs_open(struct inode *, void *);
+int spnfs_get_state(struct inode *, void *, void *);
+int spnfs_remove(unsigned long ino);
 
 int nfsd_spnfs_new(void);
 void nfsd_spnfs_delete(void);
 int spnfs_upcall(struct spnfs *, struct spnfs_msg *, union spnfs_msg_res *);
+int spnfs_enabled(void);
 
 #endif /* __KERNEL__ */
 
diff --git a/utils/spnfsd/spnfsd.c b/utils/spnfsd/spnfsd.c
index 276b0c3..f7bae84 100644
--- a/utils/spnfsd/spnfsd.c
+++ b/utils/spnfsd/spnfsd.c
@@ -114,6 +114,7 @@ static void dump_config();
 int verbose = 0;
 int stripesize = DEFAULT_STRIPE_SIZE;
 int densestriping = 0;
+int num_dev = 1;  /* XXX no multiple device support yet */
 int num_ds;
 struct dserver dataservers[SPNFS_MAX_DATA_SERVERS];
 char dsmountdir[PATH_MAX];
@@ -315,8 +316,8 @@ spnfs_msg_handler(struct spnfs_client *scp, struct spnfs_msg *im)
 	case SPNFS_TYPE_LAYOUTRETURN:
 		err = spnfsd_layoutreturn(im);
 		break;
-	case SPNFS_TYPE_GETDEVICELIST:
-		err = spnfsd_getdevicelist(im);
+	case SPNFS_TYPE_GETDEVICEITER:
+		err = spnfsd_getdeviceiter(im);
 		break;
 	case SPNFS_TYPE_GETDEVICEINFO:
 		err = spnfsd_getdeviceinfo(im);
@@ -459,7 +460,7 @@ read_config()
 	char *xpipefsdir = NULL;
 	char *xdsmountdir = NULL;
 	int ds;
-	char ipstr[20], portstr[20], rootstr[20], devidstr[20];
+	char ipstr[20], portstr[20], rootstr[20], dsidstr[20];
 
 	verbose = conf_get_num("General", "Verbosity", 0);
 	stripesize = conf_get_num("General", "Stripe-size",DEFAULT_STRIPE_SIZE);
@@ -478,7 +479,7 @@ read_config()
 		sprintf(ipstr, "DS%d_IP", ds);
 		sprintf(portstr, "DS%d_PORT", ds);
 		sprintf(rootstr, "DS%d_ROOT", ds);
-		sprintf(devidstr, "DS%d_DEVID", ds);
+		sprintf(dsidstr, "DS%d_ID", ds);
 		CONF_SAVE(dataservers[ds-1].ds_ip,
 			conf_get_str("DataServers", ipstr));
 		if (dataservers[ds-1].ds_ip == NULL)
@@ -489,10 +490,10 @@ read_config()
 			conf_get_str("DataServers", rootstr));
 		if (dataservers[ds-1].ds_ip == NULL)
 			spnfsd_err(1, "Missing IP for DS%d\n", ds);
-		dataservers[ds-1].ds_devid =
-			conf_get_num("DataServers", devidstr, -1);
-		if (dataservers[ds-1].ds_devid < 0)
-			spnfsd_err(1, "Missing or invalid DEVID for DS%d\n", ds);
+		dataservers[ds-1].ds_id =
+			conf_get_num("DataServers", dsidstr, -1);
+		if (dataservers[ds-1].ds_id < 0)
+			spnfsd_err(1, "Missing or invalid ID for DS%d\n", ds);
 	}
 
 	return 0;
@@ -512,7 +513,7 @@ dump_config()
 		printf("DS%d IP: %s\n", ds+1, dataservers[ds].ds_ip);
 		printf("DS%d PORT: %d\n", ds+1, dataservers[ds].ds_port);
 		printf("DS%d ROOT: %s\n", ds+1, dataservers[ds].ds_path);
-		printf("DS%d DEVID: %d\n", ds+1, dataservers[ds].ds_devid);
+		printf("DS%d DSID: %d\n", ds+1, dataservers[ds].ds_id);
 	}
 }
 
diff --git a/utils/spnfsd/spnfsd.conf b/utils/spnfsd/spnfsd.conf
index 0839c11..57621fc 100644
--- a/utils/spnfsd/spnfsd.conf
+++ b/utils/spnfsd/spnfsd.conf
@@ -13,9 +13,9 @@ NumDS = 2
 DS1_IP = 172.16.28.134
 DS1_PORT = 2049
 DS1_ROOT = /pnfs
-DS1_DEVID = 1
+DS1_ID = 1
 
 DS2_IP = 172.16.28.141
 DS2_PORT = 2049
 DS2_ROOT = /pnfs
-DS2_DEVID = 2
+DS2_ID = 2
diff --git a/utils/spnfsd/spnfsd.h b/utils/spnfsd/spnfsd.h
index 9df6cd8..05029e9 100644
--- a/utils/spnfsd/spnfsd.h
+++ b/utils/spnfsd/spnfsd.h
@@ -42,7 +42,7 @@ struct dserver {
         char    *ds_ip;
         int     ds_port;
         char    *ds_path;
-	int	ds_devid;
+	int	ds_id;
 };
 
 /* DMXXX future struct for whole config */
@@ -57,7 +57,7 @@ struct spnfsd_config {
 int spnfsd_layoutget(struct spnfs_msg *);
 int spnfsd_layoutcommit(struct spnfs_msg *);
 int spnfsd_layoutreturn(struct spnfs_msg *);
-int spnfsd_getdevicelist(struct spnfs_msg *);
+int spnfsd_getdeviceiter(struct spnfs_msg *);
 int spnfsd_getdeviceinfo(struct spnfs_msg *);
 int spnfsd_setattr(struct spnfs_msg *);
 int spnfsd_open(struct spnfs_msg *);
diff --git a/utils/spnfsd/spnfsd_ops.c b/utils/spnfsd/spnfsd_ops.c
index 56bd185..81ad102 100644
--- a/utils/spnfsd/spnfsd_ops.c
+++ b/utils/spnfsd/spnfsd_ops.c
@@ -36,6 +36,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 extern int stripesize;
 extern int densestriping;
 extern int num_ds;
+extern int num_dev;
 extern char dsmountdir[];
 extern struct dserver dataservers[SPNFS_MAX_DATA_SERVERS];
 size_t  strlcat(char *, const char *, size_t);
@@ -58,9 +59,8 @@ spnfsd_layoutget(struct spnfs_msg *im)
 	im->im_res.layoutget_res.layout_count = num_ds;
 
 	for (ds = 0 ; ds < num_ds ; ds++) {
-		im->im_res.layoutget_res.flist[ds].dev_id =
-			dataservers[ds].ds_devid;
-		im->im_res.layoutget_res.flist[ds].dev_index = ds;
+		im->im_res.layoutget_res.flist[ds].dev_id = 1; /* XXX */
+		im->im_res.layoutget_res.flist[ds].ds_index = ds;
 		memset(im->im_res.layoutget_res.flist[ds].fh_val, 0, 128); /*DMXXX*/
 		sprintf(fullpath, "%s/%s/%ld",
 			dsmountdir, dataservers[ds].ds_ip,
@@ -112,22 +112,20 @@ spnfsd_layoutreturn(struct spnfs_msg *im)
 }
 
 int
-spnfsd_getdevicelist(struct spnfs_msg *im)
+spnfsd_getdeviceiter(struct spnfs_msg *im)
 {
-	int ds;
-
 	im->im_status = SPNFS_STATUS_SUCCESS;
-	im->im_res.getdevicelist_res.status = 0;
-	im->im_res.getdevicelist_res.count = num_ds;
-	for (ds = 0 ; ds < num_ds ; ds++) {
-		im->im_res.getdevicelist_res.dlist[ds].devid =
-			dataservers[ds].ds_devid;
-		memset(im->im_res.getdevicelist_res.dlist[ds].netid, 0, 5);
-		strlcpy(im->im_res.getdevicelist_res.dlist[ds].netid, "tcp", 4);
-		sprintf(im->im_res.getdevicelist_res.dlist[ds].addr, "%s.%d.%d",
-			dataservers[ds].ds_ip,
-			dataservers[ds].ds_port >> 8,
-			dataservers[ds].ds_port & 0xff);
+	im->im_res.getdeviceiter_res.status = 0;
+
+	/* verifier ignored for now */
+	if (im->im_args.getdeviceiter_args.cookie >= num_dev)
+		im->im_res.getdeviceiter_res.eof = 1;
+	else {
+		/* XXX just hardcoded for now...fix this */
+		im->im_res.getdeviceiter_res.devid = 1;
+		im->im_res.getdeviceiter_res.cookie = im->im_args.getdeviceiter_args.cookie + 1;
+		im->im_res.getdeviceiter_res.verf = 0;
+		im->im_res.getdeviceiter_res.eof = 0;
 	}
 
 	return 0;
@@ -136,27 +134,34 @@ spnfsd_getdevicelist(struct spnfs_msg *im)
 int
 spnfsd_getdeviceinfo(struct spnfs_msg *im)
 {
+	struct spnfs_device *devp;
+	struct spnfs_data_server *dsp;
+	u_int32_t devid;
 	int ds;
 
 	im->im_status = SPNFS_STATUS_SUCCESS;
-	im->im_res.getdeviceinfo_res.status = ENODEV;
+	im->im_res.getdeviceinfo_res.status = 0;
+
+	devid = im->im_args.getdeviceinfo_args.devid;
+
+	/* XXX fix this if/when we support multiple devices */
+	if (devid != 1) {
+		im->im_res.getdeviceinfo_res.status = ENODEV;
+		return -1;
+	}
+
+	devp = &im->im_res.getdeviceinfo_res.devinfo;
+	devp->dscount = num_ds;
+
 	for (ds = 0 ; ds < num_ds ; ds++) {
-		if (dataservers[ds].ds_devid ==
-		    im->im_args.getdeviceinfo_args.devid) {
-			im->im_res.getdeviceinfo_res.dinfo.devid =
-				dataservers[ds].ds_devid;
-			memset(im->im_res.getdeviceinfo_res.dinfo.netid,
-				0, 5);
-			strlcpy(im->im_res.getdeviceinfo_res.dinfo.netid,
-				"tcp", 4);
-			sprintf(im->im_res.getdeviceinfo_res.dinfo.addr,
-				"%s.%d.%d",
-				dataservers[ds].ds_ip,
-				dataservers[ds].ds_port >> 8,
-				dataservers[ds].ds_port & 0xff);
-			im->im_res.getdeviceinfo_res.status = 0;
-			break;
-		}
+		dsp = &devp->dslist[ds];
+		dsp->dsid = dataservers[ds].ds_id;
+		memset(dsp->netid, 0, 5);
+		strlcpy(dsp->netid, "tcp", 4);
+		sprintf(dsp->addr, "%s.%d.%d",
+			dataservers[ds].ds_ip,
+			dataservers[ds].ds_port >> 8,
+			dataservers[ds].ds_port & 0xff);
 	}
 
 	return 0;