Peer-to-peer NFS

From Linux NFS

(Difference between revisions)
Jump to: navigation, search
Line 7: Line 7:
* NFSD: Implement UNREGISTER_DS
* NFSD: Implement UNREGISTER_DS
* Frees the pnfs_p2p_client structure created by REGISTER_DS.
* Frees the pnfs_p2p_client structure created by REGISTER_DS.
-
 
+
==== Layout get ====
-
- Layout get: [NFSD: Find p2p device addresses for layoutget]
+
* NFSD: Find p2p device addresses for layoutget
-
Use most of pnfsd_lexp_layout_get(), adding a new function call
+
* Use most of pnfsd_lexp_layout_get(), adding a new function call when the device ID is set.  I also add on to filelayout_encode_layout() to add the mds identifier to the front of the returned filehandle.  pnfs_p2p_find_deviceid() will search the files delegation list and return the first client found that isn't the client placing the LAYOUTGET call. I send the DSs clientid as the device id for GETDEVINFO.
-
when the device ID is set.  I also add on to
+
==== Get device info ====
-
filelayout_encode_layout() to add the mds identifier to the
+
* NFSD: Find device address of a p2p DS
-
front of the returned filehandle.  pnfs_p2p_find_deviceid()
+
* Use most of pnfsd_lexp_get_device_info(), but have the p2p code fill out the daddr return value in the p2p case.  I can easily translate between devid and clientid since they're the same value, and this allows me to look up the netid and ip address from the client structure.
-
will search the files delegation list and return the first
+
==== Put filehandle ====
-
client found that isn't the client placing the LAYOUTGET call.
+
* NFSD: Make putfh work with p2p filehandles
-
I send the DSs clientid as the device id for GETDEVINFO.
+
* Assume that any filehandle of length 36 is a p2p filehandle and split out the mds identifier from the rest of the handle.  Don't do any of the state checking normally associated with putfh to avoid a crash since the NFS client doesn't set up an exports structure.
-
 
+
==== Read ====
-
- Get device info: [NFSD: Find device address of a p2p DS]
+
* NFSD: Make putfh work with p2p filehandles
-
Use most of pnfsd_lexp_get_device_info(), but have the p2p
+
* If the filehandle is a p2p handle, then call the NFS client's nfs_proxy_open() function to map the p2pfh into a fh recognized by the DS.
-
code fill out the daddr return value in the p2p case.  I can
+
==== Proxy open ====
-
easily translate between devid and clientid since they're the
+
* NFSD: Implement PROXY_OPEN
-
same value, and this allows me to look up the netid and ip
+
* Generate a new stateid representing the proxy open using the new struct pnfs_p2p_po_stid to store relevant information. Verify the filehandle exists using fh_verify(), since the DS skipped this check during the PUTFH call.
-
address from the client structure.
+
==== Expire clients ====
-
 
+
* NFSD: Clean up p2p clients when they expire
-
- Put filehandle: [NFSD: Make putfh work with p2p filehandles]
+
* Free up a client's p2p state when it expires.
-
Assume that any filehandle of length 36 is a p2p filehandle and
+
==== Proxy revoke ====
-
split out the mds identifier from the rest of the handle.  Don't
+
* NFSD: most of PROXY_REVOKE
-
do any of the state checking normally associated with putfh to
+
* I send PROXY_REVOKE to clients that have PROXY_OPEN-ed files when a p2pclient (not p2pds) is expired.  I haven't figured out the right way to free up the p2p stateid during nfsd4_cb_proxy_revoke_release() yet, my attempts all seem to cause an oops.
-
avoid a crash since the NFS client doesn't set up an exports
+
-
structure.
+
-
 
+
-
- Read: [NFSD: Make putfh work with p2p filehandles]
+
-
If the filehandle is a p2p handle, then call the NFS client's
+
-
nfs_proxy_open() function to map the p2pfh into a fh recognized
+
-
by the DS.
+
-
 
+
-
- Proxy open: [NFSD: Implement PROXY_OPEN]
+
-
Generate a new stateid representing the proxy open using the
+
-
new struct pnfs_p2p_po_stid to store relevant information.
+
-
Verify the filehandle exists using fh_verify(), since the DS
+
-
skipped this check during the PUTFH call.
+
-
 
+
-
- Expire clients: [NFSD: Clean up p2p clients when they expire]
+
-
Free up a client's p2p state when it expires.
+
-
 
+
-
- Proxy revoke: [most of PROXY_REVOKE]
+
-
I send PROXY_REVOKE to clients that have PROXY_OPEN-ed files
+
-
when a p2pclient (not p2pds) is expired.  I haven't figured
+
-
out the right way to free up the p2p stateid during
+
-
nfsd4_cb_proxy_revoke_release() yet, my attempts all seem
+
-
to cause an oops.
+

Revision as of 14:28, 12 November 2012

Contents

Implementation

NFSD

Register DS

  • NFSD: Implement REGISTER_DS
  • Creates a new pnfs_p2p_client structure to store arguments from REGISTER_DS (netid, ip address, mds identifier, stateid) and attaches this structure to the struct nfs4_client sending the request. Assumes REGISTER_DS_ALL.

Unregister DS

  • NFSD: Implement UNREGISTER_DS
  • Frees the pnfs_p2p_client structure created by REGISTER_DS.

Layout get

  • NFSD: Find p2p device addresses for layoutget
  • Use most of pnfsd_lexp_layout_get(), adding a new function call when the device ID is set. I also add on to filelayout_encode_layout() to add the mds identifier to the front of the returned filehandle. pnfs_p2p_find_deviceid() will search the files delegation list and return the first client found that isn't the client placing the LAYOUTGET call. I send the DSs clientid as the device id for GETDEVINFO.

Get device info

  • NFSD: Find device address of a p2p DS
  • Use most of pnfsd_lexp_get_device_info(), but have the p2p code fill out the daddr return value in the p2p case. I can easily translate between devid and clientid since they're the same value, and this allows me to look up the netid and ip address from the client structure.

Put filehandle

  • NFSD: Make putfh work with p2p filehandles
  • Assume that any filehandle of length 36 is a p2p filehandle and split out the mds identifier from the rest of the handle. Don't do any of the state checking normally associated with putfh to avoid a crash since the NFS client doesn't set up an exports structure.

Read

  • NFSD: Make putfh work with p2p filehandles
  • If the filehandle is a p2p handle, then call the NFS client's nfs_proxy_open() function to map the p2pfh into a fh recognized by the DS.

Proxy open

  • NFSD: Implement PROXY_OPEN
  • Generate a new stateid representing the proxy open using the new struct pnfs_p2p_po_stid to store relevant information. Verify the filehandle exists using fh_verify(), since the DS skipped this check during the PUTFH call.

Expire clients

  • NFSD: Clean up p2p clients when they expire
  • Free up a client's p2p state when it expires.

Proxy revoke

  • NFSD: most of PROXY_REVOKE
  • I send PROXY_REVOKE to clients that have PROXY_OPEN-ed files when a p2pclient (not p2pds) is expired. I haven't figured out the right way to free up the p2p stateid during nfsd4_cb_proxy_revoke_release() yet, my attempts all seem to cause an oops.
Personal tools