commit f5beeb9bad08970329dd47371e829e31da79e5f3 Author: Mike Sager 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 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;