walters / rpms / nfs-utils

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