Found wdiff, but it reported no recognisable version. Falling back to builtin diff colouring...
| draft-ietf-nfsv4-minorversion1-21.txt | draft-ietf-nfsv4-minorversion1-22.txt | |||
|---|---|---|---|---|
| NFSv4 S. Shepler | NFSv4 S. Shepler | |||
| Internet-Draft M. Eisler | Internet-Draft M. Eisler | |||
| Intended status: Standards Track D. Noveck | Intended status: Standards Track D. Noveck | |||
| Expires: August 28, 2008 Editors | Expires: September 14, 2008 Editors | |||
| February 25, 2008 | March 13, 2008 | |||
| NFS Version 4 Minor Version 1 | NFS Version 4 Minor Version 1 | |||
| draft-ietf-nfsv4-minorversion1-21.txt | draft-ietf-nfsv4-minorversion1-22.txt | |||
| Status of this Memo | Status of this Memo | |||
| By submitting this Internet-Draft, each author represents that any | By submitting this Internet-Draft, each author represents that any | |||
| applicable patent or other IPR claims of which he or she is aware | applicable patent or other IPR claims of which he or she is aware | |||
| have been or will be disclosed, and any of which he or she becomes | have been or will be disclosed, and any of which he or she becomes | |||
| aware will be disclosed, in accordance with Section 6 of BCP 79. | aware will be disclosed, in accordance with Section 6 of BCP 79. | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF), its areas, and its working groups. Note that | Task Force (IETF), its areas, and its working groups. Note that | |||
| skipping to change at page 1, line 35 | skipping to change at page 1, line 35 | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| The list of current Internet-Drafts can be accessed at | The list of current Internet-Drafts can be accessed at | |||
| http://www.ietf.org/ietf/1id-abstracts.txt. | http://www.ietf.org/ietf/1id-abstracts.txt. | |||
| The list of Internet-Draft Shadow Directories can be accessed at | The list of Internet-Draft Shadow Directories can be accessed at | |||
| http://www.ietf.org/shadow.html. | http://www.ietf.org/shadow.html. | |||
| This Internet-Draft will expire on August 28, 2008. | This Internet-Draft will expire on September 14, 2008. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (C) The IETF Trust (2008). | Copyright (C) The IETF Trust (2008). | |||
| Abstract | Abstract | |||
| This Internet-Draft describes NFS version 4 minor version one, | This Internet-Draft describes NFS version 4 minor version one, | |||
| including features retained from the base protocol and protocol | including features retained from the base protocol and protocol | |||
| extensions made subsequently. Major extensions introduced in NFS | extensions made subsequently. Major extensions introduced in NFS | |||
| skipping to change at page 6, line 15 | skipping to change at page 6, line 15 | |||
| 11.7.6. The Change Attribute and File System Transitions . . 229 | 11.7.6. The Change Attribute and File System Transitions . . 229 | |||
| 11.7.7. Lock State and File System Transitions . . . . . . . 230 | 11.7.7. Lock State and File System Transitions . . . . . . . 230 | |||
| 11.7.8. Write Verifiers and File System Transitions . . . . 234 | 11.7.8. Write Verifiers and File System Transitions . . . . 234 | |||
| 11.7.9. Readdir Cookies and Verifiers and File System | 11.7.9. Readdir Cookies and Verifiers and File System | |||
| Transitions . . . . . . . . . . . . . . . . . . . . 234 | Transitions . . . . . . . . . . . . . . . . . . . . 234 | |||
| 11.7.10. File System Data and File System Transitions . . . . 234 | 11.7.10. File System Data and File System Transitions . . . . 234 | |||
| 11.8. Effecting File System Referrals . . . . . . . . . . . . 236 | 11.8. Effecting File System Referrals . . . . . . . . . . . . 236 | |||
| 11.8.1. Referral Example (LOOKUP) . . . . . . . . . . . . . 236 | 11.8.1. Referral Example (LOOKUP) . . . . . . . . . . . . . 236 | |||
| 11.8.2. Referral Example (READDIR) . . . . . . . . . . . . . 240 | 11.8.2. Referral Example (READDIR) . . . . . . . . . . . . . 240 | |||
| 11.9. The Attribute fs_locations . . . . . . . . . . . . . . . 242 | 11.9. The Attribute fs_locations . . . . . . . . . . . . . . . 242 | |||
| 11.10. The Attribute fs_locations_info . . . . . . . . . . . . 244 | 11.10. The Attribute fs_locations_info . . . . . . . . . . . . 245 | |||
| 11.10.1. The fs_locations_server4 Structure . . . . . . . . . 248 | 11.10.1. The fs_locations_server4 Structure . . . . . . . . . 248 | |||
| 11.10.2. The fs_locations_info4 Structure . . . . . . . . . . 253 | 11.10.2. The fs_locations_info4 Structure . . . . . . . . . . 253 | |||
| 11.10.3. The fs_locations_item4 Structure . . . . . . . . . . 254 | 11.10.3. The fs_locations_item4 Structure . . . . . . . . . . 254 | |||
| 11.11. The Attribute fs_status . . . . . . . . . . . . . . . . 256 | 11.11. The Attribute fs_status . . . . . . . . . . . . . . . . 256 | |||
| 12. Parallel NFS (pNFS) . . . . . . . . . . . . . . . . . . . . . 260 | 12. Parallel NFS (pNFS) . . . . . . . . . . . . . . . . . . . . . 260 | |||
| 12.1. Introduction . . . . . . . . . . . . . . . . . . . . . . 260 | 12.1. Introduction . . . . . . . . . . . . . . . . . . . . . . 260 | |||
| 12.2. pNFS Definitions . . . . . . . . . . . . . . . . . . . . 262 | 12.2. pNFS Definitions . . . . . . . . . . . . . . . . . . . . 262 | |||
| 12.2.1. Metadata . . . . . . . . . . . . . . . . . . . . . . 262 | 12.2.1. Metadata . . . . . . . . . . . . . . . . . . . . . . 262 | |||
| 12.2.2. Metadata Server . . . . . . . . . . . . . . . . . . 262 | 12.2.2. Metadata Server . . . . . . . . . . . . . . . . . . 262 | |||
| 12.2.3. pNFS Client . . . . . . . . . . . . . . . . . . . . 263 | 12.2.3. pNFS Client . . . . . . . . . . . . . . . . . . . . 263 | |||
| skipping to change at page 6, line 46 | skipping to change at page 6, line 46 | |||
| 12.5.1. Guarantees Provided by Layouts . . . . . . . . . . . 267 | 12.5.1. Guarantees Provided by Layouts . . . . . . . . . . . 267 | |||
| 12.5.2. Getting a Layout . . . . . . . . . . . . . . . . . . 269 | 12.5.2. Getting a Layout . . . . . . . . . . . . . . . . . . 269 | |||
| 12.5.3. Layout Stateid . . . . . . . . . . . . . . . . . . . 270 | 12.5.3. Layout Stateid . . . . . . . . . . . . . . . . . . . 270 | |||
| 12.5.4. Committing a Layout . . . . . . . . . . . . . . . . 271 | 12.5.4. Committing a Layout . . . . . . . . . . . . . . . . 271 | |||
| 12.5.5. Recalling a Layout . . . . . . . . . . . . . . . . . 274 | 12.5.5. Recalling a Layout . . . . . . . . . . . . . . . . . 274 | |||
| 12.5.6. Revoking Layouts . . . . . . . . . . . . . . . . . . 281 | 12.5.6. Revoking Layouts . . . . . . . . . . . . . . . . . . 281 | |||
| 12.5.7. Metadata Server Write Propagation . . . . . . . . . 281 | 12.5.7. Metadata Server Write Propagation . . . . . . . . . 281 | |||
| 12.6. pNFS Mechanics . . . . . . . . . . . . . . . . . . . . . 281 | 12.6. pNFS Mechanics . . . . . . . . . . . . . . . . . . . . . 281 | |||
| 12.7. Recovery . . . . . . . . . . . . . . . . . . . . . . . . 283 | 12.7. Recovery . . . . . . . . . . . . . . . . . . . . . . . . 283 | |||
| 12.7.1. Recovery from Client Restart . . . . . . . . . . . . 283 | 12.7.1. Recovery from Client Restart . . . . . . . . . . . . 283 | |||
| 12.7.2. Dealing with Lease Expiration on the Client . . . . 283 | 12.7.2. Dealing with Lease Expiration on the Client . . . . 284 | |||
| 12.7.3. Dealing with Loss of Layout State on the Metadata | 12.7.3. Dealing with Loss of Layout State on the Metadata | |||
| Server . . . . . . . . . . . . . . . . . . . . . . . 284 | Server . . . . . . . . . . . . . . . . . . . . . . . 285 | |||
| 12.7.4. Recovery from Metadata Server Restart . . . . . . . 285 | 12.7.4. Recovery from Metadata Server Restart . . . . . . . 285 | |||
| 12.7.5. Operations During Metadata Server Grace Period . . . 287 | 12.7.5. Operations During Metadata Server Grace Period . . . 287 | |||
| 12.7.6. Storage Device Recovery . . . . . . . . . . . . . . 287 | 12.7.6. Storage Device Recovery . . . . . . . . . . . . . . 288 | |||
| 12.8. Metadata and Storage Device Roles . . . . . . . . . . . 288 | 12.8. Metadata and Storage Device Roles . . . . . . . . . . . 288 | |||
| 12.9. Security Considerations for pNFS . . . . . . . . . . . . 288 | 12.9. Security Considerations for pNFS . . . . . . . . . . . . 288 | |||
| 13. PNFS: NFSv4.1 File Layout Type . . . . . . . . . . . . . . . 289 | 13. PNFS: NFSv4.1 File Layout Type . . . . . . . . . . . . . . . 289 | |||
| 13.1. Client ID and Session Considerations . . . . . . . . . . 289 | 13.1. Client ID and Session Considerations . . . . . . . . . . 290 | |||
| 13.1.1. Sessions Considerations for Data Servers . . . . . . 292 | 13.1.1. Sessions Considerations for Data Servers . . . . . . 292 | |||
| 13.2. File Layout Definitions . . . . . . . . . . . . . . . . 292 | 13.2. File Layout Definitions . . . . . . . . . . . . . . . . 292 | |||
| 13.3. File Layout Data Types . . . . . . . . . . . . . . . . . 293 | 13.3. File Layout Data Types . . . . . . . . . . . . . . . . . 293 | |||
| 13.4. Interpreting the File Layout . . . . . . . . . . . . . . 297 | 13.4. Interpreting the File Layout . . . . . . . . . . . . . . 297 | |||
| 13.4.1. Determining the Stripe Unit Number . . . . . . . . . 297 | 13.4.1. Determining the Stripe Unit Number . . . . . . . . . 297 | |||
| 13.4.2. Interpreting the File Layout Using Sparse Packing . 297 | 13.4.2. Interpreting the File Layout Using Sparse Packing . 297 | |||
| 13.4.3. Interpreting the File Layout Using Dense Packing . . 300 | 13.4.3. Interpreting the File Layout Using Dense Packing . . 300 | |||
| 13.4.4. Sparse and Dense Stripe Unit Packing . . . . . . . . 302 | 13.4.4. Sparse and Dense Stripe Unit Packing . . . . . . . . 302 | |||
| 13.5. Data Server Multipathing . . . . . . . . . . . . . . . . 304 | 13.5. Data Server Multipathing . . . . . . . . . . . . . . . . 304 | |||
| 13.6. Operations Sent to NFSv4.1 Data Servers . . . . . . . . 305 | 13.6. Operations Sent to NFSv4.1 Data Servers . . . . . . . . 305 | |||
| skipping to change at page 8, line 31 | skipping to change at page 8, line 31 | |||
| 18.11. Operation 13: LOCKT - Test For Lock . . . . . . . . . . 406 | 18.11. Operation 13: LOCKT - Test For Lock . . . . . . . . . . 406 | |||
| 18.12. Operation 14: LOCKU - Unlock File . . . . . . . . . . . 408 | 18.12. Operation 14: LOCKU - Unlock File . . . . . . . . . . . 408 | |||
| 18.13. Operation 15: LOOKUP - Lookup Filename . . . . . . . . . 409 | 18.13. Operation 15: LOOKUP - Lookup Filename . . . . . . . . . 409 | |||
| 18.14. Operation 16: LOOKUPP - Lookup Parent Directory . . . . 411 | 18.14. Operation 16: LOOKUPP - Lookup Parent Directory . . . . 411 | |||
| 18.15. Operation 17: NVERIFY - Verify Difference in | 18.15. Operation 17: NVERIFY - Verify Difference in | |||
| Attributes . . . . . . . . . . . . . . . . . . . . . . . 412 | Attributes . . . . . . . . . . . . . . . . . . . . . . . 412 | |||
| 18.16. Operation 18: OPEN - Open a Regular File . . . . . . . . 413 | 18.16. Operation 18: OPEN - Open a Regular File . . . . . . . . 413 | |||
| 18.17. Operation 19: OPENATTR - Open Named Attribute | 18.17. Operation 19: OPENATTR - Open Named Attribute | |||
| Directory . . . . . . . . . . . . . . . . . . . . . . . 432 | Directory . . . . . . . . . . . . . . . . . . . . . . . 432 | |||
| 18.18. Operation 21: OPEN_DOWNGRADE - Reduce Open File Access . 433 | 18.18. Operation 21: OPEN_DOWNGRADE - Reduce Open File Access . 433 | |||
| 18.19. Operation 22: PUTFH - Set Current Filehandle . . . . . . 434 | 18.19. Operation 22: PUTFH - Set Current Filehandle . . . . . . 435 | |||
| 18.20. Operation 23: PUTPUBFH - Set Public Filehandle . . . . . 435 | 18.20. Operation 23: PUTPUBFH - Set Public Filehandle . . . . . 435 | |||
| 18.21. Operation 24: PUTROOTFH - Set Root Filehandle . . . . . 437 | 18.21. Operation 24: PUTROOTFH - Set Root Filehandle . . . . . 437 | |||
| 18.22. Operation 25: READ - Read from File . . . . . . . . . . 437 | 18.22. Operation 25: READ - Read from File . . . . . . . . . . 437 | |||
| 18.23. Operation 26: READDIR - Read Directory . . . . . . . . . 440 | 18.23. Operation 26: READDIR - Read Directory . . . . . . . . . 440 | |||
| 18.24. Operation 27: READLINK - Read Symbolic Link . . . . . . 443 | 18.24. Operation 27: READLINK - Read Symbolic Link . . . . . . 444 | |||
| 18.25. Operation 28: REMOVE - Remove File System Object . . . . 444 | 18.25. Operation 28: REMOVE - Remove File System Object . . . . 445 | |||
| 18.26. Operation 29: RENAME - Rename Directory Entry . . . . . 447 | 18.26. Operation 29: RENAME - Rename Directory Entry . . . . . 447 | |||
| 18.27. Operation 31: RESTOREFH - Restore Saved Filehandle . . . 450 | 18.27. Operation 31: RESTOREFH - Restore Saved Filehandle . . . 451 | |||
| 18.28. Operation 32: SAVEFH - Save Current Filehandle . . . . . 451 | 18.28. Operation 32: SAVEFH - Save Current Filehandle . . . . . 452 | |||
| 18.29. Operation 33: SECINFO - Obtain Available Security . . . 452 | 18.29. Operation 33: SECINFO - Obtain Available Security . . . 452 | |||
| 18.30. Operation 34: SETATTR - Set Attributes . . . . . . . . . 455 | 18.30. Operation 34: SETATTR - Set Attributes . . . . . . . . . 455 | |||
| 18.31. Operation 37: VERIFY - Verify Same Attributes . . . . . 458 | 18.31. Operation 37: VERIFY - Verify Same Attributes . . . . . 458 | |||
| 18.32. Operation 38: WRITE - Write to File . . . . . . . . . . 459 | 18.32. Operation 38: WRITE - Write to File . . . . . . . . . . 459 | |||
| 18.33. Operation 40: BACKCHANNEL_CTL - Backchannel control . . 464 | 18.33. Operation 40: BACKCHANNEL_CTL - Backchannel control . . 464 | |||
| 18.34. Operation 41: BIND_CONN_TO_SESSION . . . . . . . . . . . 465 | 18.34. Operation 41: BIND_CONN_TO_SESSION . . . . . . . . . . . 465 | |||
| 18.35. Operation 42: EXCHANGE_ID - Instantiate Client ID . . . 468 | 18.35. Operation 42: EXCHANGE_ID - Instantiate Client ID . . . 468 | |||
| 18.36. Operation 43: CREATE_SESSION - Create New Session and | 18.36. Operation 43: CREATE_SESSION - Create New Session and | |||
| Confirm Client ID . . . . . . . . . . . . . . . . . . . 484 | Confirm Client ID . . . . . . . . . . . . . . . . . . . 484 | |||
| 18.37. Operation 44: DESTROY_SESSION - Destroy existing | 18.37. Operation 44: DESTROY_SESSION - Destroy existing | |||
| skipping to change at page 113, line 37 | skipping to change at page 113, line 37 | |||
| The fs_layout_type attribute (see Section 3.3.13) applies to a file | The fs_layout_type attribute (see Section 3.3.13) applies to a file | |||
| system and indicates what layout types are supported by the file | system and indicates what layout types are supported by the file | |||
| system. When the client encounters a new fsid, the client SHOULD | system. When the client encounters a new fsid, the client SHOULD | |||
| obtain the value for the fs_layout_type attribute associated with the | obtain the value for the fs_layout_type attribute associated with the | |||
| new file system. This attribute is used by the client to determine | new file system. This attribute is used by the client to determine | |||
| if the layout types supported by the server match any of the client's | if the layout types supported by the server match any of the client's | |||
| supported layout types. | supported layout types. | |||
| 5.11.2. Attribute 66: layout_alignment | 5.11.2. Attribute 66: layout_alignment | |||
| When a client has layouts for a file system, the layout_alignment | When a client holds layouts on files of a file system, the | |||
| attribute indicates the preferred alignment for I/O to files on that | layout_alignment attribute indicates the preferred alignment for I/O | |||
| file system. Where possible, the client should send READ and WRITE | to files on that file system. Where possible, the client should send | |||
| operations with offsets that are whole multiples of the | READ and WRITE operations with offsets that are whole multiples of | |||
| layout_alignment attribute. | the layout_alignment attribute. | |||
| 5.11.3. Attribute 65: layout_blksize | 5.11.3. Attribute 65: layout_blksize | |||
| When a client has layouts for a file system, the layout_blksize | When a client holds layouts on files of a file system, the | |||
| attribute indicates the preferred block size for I/O to files on that | layout_blksize attribute indicates the preferred block size for I/O | |||
| file system. Where possible, the client should send READ operations | to files on that file system. Where possible, the client should send | |||
| with a count argument that is a whole multiple of layout_blksize, and | READ operations with a count argument that is a whole multiple of | |||
| WRITE operations with a data argument of size that is a whole | layout_blksize, and WRITE operations with a data argument of size | |||
| multiple of layout_blksize. | that is a whole multiple of layout_blksize. | |||
| 5.11.4. Attribute 63: layout_hint | 5.11.4. Attribute 63: layout_hint | |||
| The layout_hint attribute (see Section 3.3.19) may be set on newly | The layout_hint attribute (see Section 3.3.19) may be set on newly | |||
| created files to influence the metadata server's choice for the | created files to influence the metadata server's choice for the | |||
| file's layout. If possible, this attribute is one of those set in | file's layout. If possible, this attribute is one of those set in | |||
| the initial attributes within the OPEN operation. The metadata | the initial attributes within the OPEN operation. The metadata | |||
| server may choose to ignore this attribute. The layout_hint | server may choose to ignore this attribute. The layout_hint | |||
| attribute is a sub-set of the layout structure returned by LAYOUTGET. | attribute is a sub-set of the layout structure returned by LAYOUTGET. | |||
| For example, instead of specifying particular devices, this would be | For example, instead of specifying particular devices, this would be | |||
| skipping to change at page 117, line 26 | skipping to change at page 117, line 26 | |||
| of the ACE4_WRITE_RETENTION_HOLD ACL permission. The enabling of | of the ACE4_WRITE_RETENTION_HOLD ACL permission. The enabling of | |||
| administration retention holds does not prevent the enabling of | administration retention holds does not prevent the enabling of | |||
| event-based or non-event-based retention. | event-based or non-event-based retention. | |||
| 6. Access Control Attributes | 6. Access Control Attributes | |||
| Access Control Lists (ACLs) are file attributes that specify fine | Access Control Lists (ACLs) are file attributes that specify fine | |||
| grained access control. This chapter covers the "acl", "dacl", | grained access control. This chapter covers the "acl", "dacl", | |||
| "sacl", "aclsupport", "mode", "mode_set_masked" file attributes, and | "sacl", "aclsupport", "mode", "mode_set_masked" file attributes, and | |||
| their interactions. Note that file attributes may apply to any file | their interactions. Note that file attributes may apply to any file | |||
| system objects. | system object. | |||
| 6.1. Goals | 6.1. Goals | |||
| ACLs and modes represent two well established models for specifying | ACLs and modes represent two well established models for specifying | |||
| permissions. This chapter specifies requirements that attempt to | permissions. This chapter specifies requirements that attempt to | |||
| meet the following goals: | meet the following goals: | |||
| o If a server supports the mode attribute, it should provide | o If a server supports the mode attribute, it should provide | |||
| reasonable semantics to clients that only set and retrieve the | reasonable semantics to clients that only set and retrieve the | |||
| mode attribute. | mode attribute. | |||
| skipping to change at page 122, line 28 | skipping to change at page 122, line 28 | |||
| const ACE4_WRITE_RETENTION_HOLD = 0x00000400; | const ACE4_WRITE_RETENTION_HOLD = 0x00000400; | |||
| const ACE4_DELETE = 0x00010000; | const ACE4_DELETE = 0x00010000; | |||
| const ACE4_READ_ACL = 0x00020000; | const ACE4_READ_ACL = 0x00020000; | |||
| const ACE4_WRITE_ACL = 0x00040000; | const ACE4_WRITE_ACL = 0x00040000; | |||
| const ACE4_WRITE_OWNER = 0x00080000; | const ACE4_WRITE_OWNER = 0x00080000; | |||
| const ACE4_SYNCHRONIZE = 0x00100000; | const ACE4_SYNCHRONIZE = 0x00100000; | |||
| Note that some masks have coincident values, for example, | Note that some masks have coincident values, for example, | |||
| ACE4_READ_DATA and ACE4_LIST_DIRECTORY. The mask entries | ACE4_READ_DATA and ACE4_LIST_DIRECTORY. The mask entries | |||
| ACE4_LIST_DIRECTORY, ACE4_ADD_SUBDIRECTORY, and ACE4_TRAVERSE are | ACE4_LIST_DIRECTORY, ACE4_ADD_FILE, and ACE4_ADD_SUBDIRECTORY are | |||
| intended to be used with directory objects, while ACE4_READ_DATA, | intended to be used with directory objects, while ACE4_READ_DATA, | |||
| ACE4_WRITE_DATA, and ACE4_EXECUTE are intended to be used with non- | ACE4_WRITE_DATA, and ACE4_APPEND_DATA are intended to be used with | |||
| directory objects. | non-directory objects. | |||
| 6.2.1.3.1. Discussion of Mask Attributes | 6.2.1.3.1. Discussion of Mask Attributes | |||
| ACE4_READ_DATA | ACE4_READ_DATA | |||
| Operation(s) affected: | Operation(s) affected: | |||
| READ | READ | |||
| OPEN | OPEN | |||
| skipping to change at page 149, line 39 | skipping to change at page 149, line 39 | |||
| With the exception of special stateids, to be discussed later, each | With the exception of special stateids, to be discussed later, each | |||
| stateid represents locking objects of one of a set of types defined | stateid represents locking objects of one of a set of types defined | |||
| by the NFSv4.1 protocol. Note that in all these cases, where we | by the NFSv4.1 protocol. Note that in all these cases, where we | |||
| speak of guarantee, it is understood there are situations such as a | speak of guarantee, it is understood there are situations such as a | |||
| client restart, or lock revocation, that allow the guarantee to be | client restart, or lock revocation, that allow the guarantee to be | |||
| voided. | voided. | |||
| o Stateids may represent opens of files. | o Stateids may represent opens of files. | |||
| Each stateid in this case represents the open for a given | Each stateid in this case represents the open for a given | |||
| clientid/open-owner/filehandle triple. Such tateids are subject | clientid/open-owner/filehandle triple. Such stateids are subject | |||
| to change (with consequent bumping of the seqid) in response to | to change (with consequent bumping of the seqid) in response to | |||
| OPENs that result in upgrade and OPEN_DOWNGRADE operations. | OPENs that result in upgrade and OPEN_DOWNGRADE operations. | |||
| o Stateids may represent sets of byte-range locks. | o Stateids may represent sets of byte-range locks. | |||
| All locks held on a particular file by a particular owner and all | All locks held on a particular file by a particular owner and all | |||
| gotten under the aegis of a particular open file are associated | gotten under the aegis of a particular open file are associated | |||
| with a single stateid with the seqid being bumped as LOCK and | with a single stateid with the seqid being bumped as LOCK and | |||
| LOCKU operation affect that set of locks. | LOCKU operation affect that set of locks. | |||
| skipping to change at page 154, line 24 | skipping to change at page 154, line 24 | |||
| analyzed by this procedure. | analyzed by this procedure. | |||
| If server restart has resulted in an invalid client ID or a sessionid | If server restart has resulted in an invalid client ID or a sessionid | |||
| which is invalid, SEQUENCE will return an error and the operation | which is invalid, SEQUENCE will return an error and the operation | |||
| that takes a stateid as an argument will never be processed. | that takes a stateid as an argument will never be processed. | |||
| If there has been a server restart where there is a persistent | If there has been a server restart where there is a persistent | |||
| session, and all leased state has been lost, then the session in | session, and all leased state has been lost, then the session in | |||
| question will, although valid, be marked as dead, and any operation | question will, although valid, be marked as dead, and any operation | |||
| not satisfied by means of the reply cache will receive the error | not satisfied by means of the reply cache will receive the error | |||
| NFS4ERR_DEADSESSION, and thus not be processed as indicated below | NFS4ERR_DEADSESSION, and thus not be processed as indicated below. | |||
| either. | ||||
| When a stateid is being tested, and the "other" field is all zeros or | When a stateid is being tested, and the "other" field is all zeros or | |||
| all ones, a check that the "other" and "seqid" fields match a defined | all ones, a check that the "other" and "seqid" fields match a defined | |||
| combination for a special stateid is done and the results determined | combination for a special stateid is done and the results determined | |||
| as follows: | as follows: | |||
| o If the "other" and "seqid" fields do not match a defined | o If the "other" and "seqid" fields do not match a defined | |||
| combination associated with a special stateid, the error | combination associated with a special stateid, the error | |||
| NFS4ERR_BAD_STATEID is returned. | NFS4ERR_BAD_STATEID is returned. | |||
| skipping to change at page 158, line 15 | skipping to change at page 158, line 14 | |||
| SEQ4_STATUS_RECALLABLE_STATE_REVOKED notify the client of lock | SEQ4_STATUS_RECALLABLE_STATE_REVOKED notify the client of lock | |||
| revocation events. When these bits are set, the client should use | revocation events. When these bits are set, the client should use | |||
| TEST_STATEID to find what stateids have been revoked and use | TEST_STATEID to find what stateids have been revoked and use | |||
| FREE_STATEID to acknowledge loss of the associated state. | FREE_STATEID to acknowledge loss of the associated state. | |||
| o The status bit SEQ4_STATUS_LEASE_MOVE indicates that | o The status bit SEQ4_STATUS_LEASE_MOVE indicates that | |||
| responsibility for lease renewal has been transferred to one or | responsibility for lease renewal has been transferred to one or | |||
| more new servers. | more new servers. | |||
| o The status bit SEQ4_STATUS_RESTART_RECLAIM_NEEDED indicates that | o The status bit SEQ4_STATUS_RESTART_RECLAIM_NEEDED indicates that | |||
| due to server restart or restart the client must reclaim locking | due to server restart the client must reclaim locking state. | |||
| state. | ||||
| o The status bit SEQ4_STATUS_BACKCHANNEL_FAULT indicates server has | o The status bit SEQ4_STATUS_BACKCHANNEL_FAULT indicates server has | |||
| encountered an unrecoverable fault with the backchannel (e.g. it | encountered an unrecoverable fault with the backchannel (e.g. it | |||
| has lost track of a sequence id for a slot in the backchannel). | has lost track of a sequence id for a slot in the backchannel). | |||
| 8.4. Crash Recovery | 8.4. Crash Recovery | |||
| A critical requirement in crash recovery is that both the client and | A critical requirement in crash recovery is that both the client and | |||
| the server know when the other has failed. Additionally, it is | the server know when the other has failed. Additionally, it is | |||
| required that a client sees a consistent view of data across server | required that a client sees a consistent view of data across server | |||
| skipping to change at page 174, line 29 | skipping to change at page 174, line 29 | |||
| write delegation and WRITE conflicts with a read delegation. | write delegation and WRITE conflicts with a read delegation. | |||
| When a client holds a delegation, it is particularly important to | When a client holds a delegation, it is particularly important to | |||
| make sure that the stateid sent conveys the association of operation | make sure that the stateid sent conveys the association of operation | |||
| with the delegation, to avoid the delegation from being avoidably | with the delegation, to avoid the delegation from being avoidably | |||
| recalled. When the delegation stateid, or a stateid open associated | recalled. When the delegation stateid, or a stateid open associated | |||
| with that delegation, or a stateid representing byte-range locks | with that delegation, or a stateid representing byte-range locks | |||
| derived form such an open is used, the server knows that the READ, | derived form such an open is used, the server knows that the READ, | |||
| WRITE, or SETATTR does not conflict with the delegation, but is sent | WRITE, or SETATTR does not conflict with the delegation, but is sent | |||
| under the aegis of the delegation. Even though it is possible for | under the aegis of the delegation. Even though it is possible for | |||
| the server to determine from the clientid (gotten from the sessionid) | the server to determine from the clientid (via the sessionid) that | |||
| that the client does in fact have a delegation, the server is not | the client does in fact have a delegation, the server is not obliged | |||
| obliged to check this, so using a special stateid can result in | to check this, so using a special stateid can result in avoidable | |||
| avoidable recall of the delegation. | recall of the delegation. | |||
| 9.2. Lock Ranges | 9.2. Lock Ranges | |||
| The protocol allows a lock-owner to request a lock with a byte range | The protocol allows a lock-owner to request a lock with a byte range | |||
| and then either upgrade, downgrade, or unlock a sub-range of the | and then either upgrade, downgrade, or unlock a sub-range of the | |||
| initial lock, or a range that consists of a range which overlaps, | initial lock, or a range that consists of a range which overlaps, | |||
| fully or partially, that initial lock or a combination of a set of | fully or partially, that initial lock or a combination of a set of | |||
| existing locks for the same lock-owner. It is expected that this | existing locks for the same lock-owner. It is expected that this | |||
| will be an uncommon type of request. In any case, servers or server | will be an uncommon type of request. In any case, servers or server | |||
| file systems may not be able to support sub-range lock semantics. In | file systems may not be able to support sub-range lock semantics. In | |||
| skipping to change at page 186, line 33 | skipping to change at page 186, line 33 | |||
| however, the server may extend the period in which conflicting | however, the server may extend the period in which conflicting | |||
| requests are held off. Eventually the occurrence of a conflicting | requests are held off. Eventually the occurrence of a conflicting | |||
| request from another client will cause revocation of the delegation. | request from another client will cause revocation of the delegation. | |||
| A loss of the backchannel (e.g. by later network configuration | A loss of the backchannel (e.g. by later network configuration | |||
| change) will have the same effect. A recall request will fail and | change) will have the same effect. A recall request will fail and | |||
| revocation of the delegation will result. | revocation of the delegation will result. | |||
| A client normally finds out about revocation of a delegation when it | A client normally finds out about revocation of a delegation when it | |||
| uses a stateid associated with a delegation and receives one of the | uses a stateid associated with a delegation and receives one of the | |||
| errors NFS4EER_EXPIRED, NFS4ERR_ADMIN_REVOKED, or | errors NFS4EER_EXPIRED, NFS4ERR_ADMIN_REVOKED, or | |||
| MFS4ERR_DELEG_REVOKED. It also may find out about delegation | NFS4ERR_DELEG_REVOKED. It also may find out about delegation | |||
| revocation after a client restart when it attempts to reclaim a | revocation after a client restart when it attempts to reclaim a | |||
| delegation and receives that same error. Note that in the case of a | delegation and receives that same error. Note that in the case of a | |||
| revoked write open delegation, there are issues because data may have | revoked write open delegation, there are issues because data may have | |||
| been modified by the client whose delegation is revoked and | been modified by the client whose delegation is revoked and | |||
| separately by other clients. See Section 10.5.1 for a discussion of | separately by other clients. See Section 10.5.1 for a discussion of | |||
| such issues. Note also that when delegations are revoked, | such issues. Note also that when delegations are revoked, | |||
| information about the revoked delegation will be written by the | information about the revoked delegation will be written by the | |||
| server to stable storage (as described in Section 8.4.3). This is | server to stable storage (as described in Section 8.4.3). This is | |||
| done to deal with the case in which a server restarts after revoking | done to deal with the case in which a server restarts after revoking | |||
| a delegation but before the client holding the revoked delegation is | a delegation but before the client holding the revoked delegation is | |||
| skipping to change at page 230, line 4 | skipping to change at page 230, line 4 | |||
| each of the target file systems. | each of the target file systems. | |||
| 11.7.6. The Change Attribute and File System Transitions | 11.7.6. The Change Attribute and File System Transitions | |||
| Since the change attribute is defined as a server-specific one, | Since the change attribute is defined as a server-specific one, | |||
| change attributes fetched from one server are normally presumed to be | change attributes fetched from one server are normally presumed to be | |||
| invalid on another server. Such a presumption is troublesome since | invalid on another server. Such a presumption is troublesome since | |||
| it would invalidate all cached change attributes, requiring | it would invalidate all cached change attributes, requiring | |||
| refetching. Even more disruptive, the absence of any assured | refetching. Even more disruptive, the absence of any assured | |||
| continuity for the change attribute means that even if the same value | continuity for the change attribute means that even if the same value | |||
| is gotten on refetch no conclusions can drawn as to whether the | is retrieved on refetch no conclusions can drawn as to whether the | |||
| object in question has changed. The identical change attribute could | object in question has changed. The identical change attribute could | |||
| be merely an artifact of a modified file with a different change | be merely an artifact of a modified file with a different change | |||
| attribute construction algorithm, with that new algorithm just | attribute construction algorithm, with that new algorithm just | |||
| happening to result in an identical change value. | happening to result in an identical change value. | |||
| When the two file systems have consistent change attribute formats, | When the two file systems have consistent change attribute formats, | |||
| and this fact is communicated to the client by reporting as in the | and this fact is communicated to the client by reporting as in the | |||
| same _change_ class, the client may assume a continuity of change | same _change_ class, the client may assume a continuity of change | |||
| attribute construction and handle this situation just as it would be | attribute construction and handle this situation just as it would be | |||
| handled without any file system transition. | handled without any file system transition. | |||
| skipping to change at page 237, line 48 | skipping to change at page 237, line 48 | |||
| that op but was moved between the last LOOKUP and the GETFH (since | that op but was moved between the last LOOKUP and the GETFH (since | |||
| COMPOUND is not atomic). Even if we had the fsids for all of the | COMPOUND is not atomic). Even if we had the fsids for all of the | |||
| intermediate directories, we could have no way of knowing that /this/ | intermediate directories, we could have no way of knowing that /this/ | |||
| is/the/path was the root of a new file system, since we don't yet | is/the/path was the root of a new file system, since we don't yet | |||
| have its fsid. | have its fsid. | |||
| In order to get the necessary information, let us re-send the chain | In order to get the necessary information, let us re-send the chain | |||
| of LOOKUPs with GETFHs and GETATTRs to at least get the fsids so we | of LOOKUPs with GETFHs and GETATTRs to at least get the fsids so we | |||
| can be sure where the appropriate file system boundaries are. The | can be sure where the appropriate file system boundaries are. The | |||
| client could choose to get fs_locations_info at the same time but in | client could choose to get fs_locations_info at the same time but in | |||
| most cases the client will have a good guess as to where fs | most cases the client will have a good guess as to where file system | |||
| boundaries are (because of where NFS4ERR_MOVED was gotten and where | boundaries are (because of where and where not NFS4ERR_MOVED was | |||
| not) making fetching of fs_locations_info unnecessary. | received) making fetching of fs_locations_info unnecessary. | |||
| OP01: PUTROOTFH --> NFS_OK | OP01: PUTROOTFH --> NFS_OK | |||
| - Current fh is root of pseudo-fs. | - Current fh is root of pseudo-fs. | |||
| OP02: GETATTR(fsid) --> NFS_OK | OP02: GETATTR(fsid) --> NFS_OK | |||
| - Just for completeness. Normally, clients will know the fsid of | - Just for completeness. Normally, clients will know the fsid of | |||
| the pseudo-fs as soon as they establish communication with a | the pseudo-fs as soon as they establish communication with a | |||
| server. | server. | |||
| skipping to change at page 239, line 31 | skipping to change at page 239, line 31 | |||
| in fact the fsid we have for this file system might be a valid | in fact the fsid we have for this file system might be a valid | |||
| fsid of a different file system on that new server. | fsid of a different file system on that new server. | |||
| - In this particular case, we are pretty sure anyway that what has | - In this particular case, we are pretty sure anyway that what has | |||
| moved is /this/is/the/path rather than /this/is/the since we have | moved is /this/is/the/path rather than /this/is/the since we have | |||
| the fsid of the latter and it is that of the pseudo-fs, which | the fsid of the latter and it is that of the pseudo-fs, which | |||
| presumably cannot move. However, in other examples, we might not | presumably cannot move. However, in other examples, we might not | |||
| have this kind of information to rely on (e.g. /this/is/the might | have this kind of information to rely on (e.g. /this/is/the might | |||
| be a non-pseudo file system separate from /this/is/the/path), so | be a non-pseudo file system separate from /this/is/the/path), so | |||
| we need to have another reliable source information on the | we need to have another reliable source information on the | |||
| boundary of the fs which is moved. If, for example, the file | boundary of the file system which is moved. If, for example, the | |||
| system "/this/is" had moved we would have a case of migration | file system "/this/is" had moved we would have a case of migration | |||
| rather than referral and once the boundaries of the migrated file | rather than referral and once the boundaries of the migrated file | |||
| system was clear we could fetch fs_locations_info. | system was clear we could fetch fs_locations_info. | |||
| - We are fetching fs_locations_info because the fact that we got an | - We are fetching fs_locations_info because the fact that we got an | |||
| NFS4ERR_MOVED at this point means that it most likely that this is | NFS4ERR_MOVED at this point means that it most likely that this is | |||
| a referral and we need the destination. Even if it is the case | a referral and we need the destination. Even if it is the case | |||
| that "/this/is/the" is a file system which has migrated, we will | that "/this/is/the" is a file system which has migrated, we will | |||
| still need the location information for that file system. | still need the location information for that file system. | |||
| OP14: GETFH --> NFS4ERR_MOVED | OP14: GETFH --> NFS4ERR_MOVED | |||
| skipping to change at page 242, line 27 | skipping to change at page 242, line 27 | |||
| o READDIR (rdattr_error, fs_locations_info, mounted_on_fileid, fsid, | o READDIR (rdattr_error, fs_locations_info, mounted_on_fileid, fsid, | |||
| size, time_modify) --> NFS_OK. The attributes will be as shown | size, time_modify) --> NFS_OK. The attributes will be as shown | |||
| below. | below. | |||
| The attributes for "path" will only contain | The attributes for "path" will only contain | |||
| o rdattr_error (value: NFS_OK) | o rdattr_error (value: NFS_OK) | |||
| o fs_locations_info | o fs_locations_info | |||
| o mounted_on_fileid (value: unique fileid within referring fs) | o mounted_on_fileid (value: unique fileid within referring file | |||
| system) | ||||
| o fsid (value: unique value within referring server) | o fsid (value: unique value within referring server) | |||
| The attribute entry for "path" will not contain size or time_modify | The attribute entry for "path" will not contain size or time_modify | |||
| because these attributes are not available within an absent file | because these attributes are not available within an absent file | |||
| system. | system. | |||
| 11.9. The Attribute fs_locations | 11.9. The Attribute fs_locations | |||
| The fs_locations attribute is structured in the following way: | The fs_locations attribute is structured in the following way: | |||
| skipping to change at page 266, line 19 | skipping to change at page 266, line 19 | |||
| the same layout type and client ID again. This requirement is | the same layout type and client ID again. This requirement is | |||
| feasible because the device ID is 16 bytes long, leaving sufficient | feasible because the device ID is 16 bytes long, leaving sufficient | |||
| room to store a generation number if server's implementation requires | room to store a generation number if server's implementation requires | |||
| most of the rest of the device ID's content to be reused. This | most of the rest of the device ID's content to be reused. This | |||
| requirement is necessary because otherwise the race conditions | requirement is necessary because otherwise the race conditions | |||
| between asynchronous notification of device ID addition and deletion | between asynchronous notification of device ID addition and deletion | |||
| would be too difficult to sort out. | would be too difficult to sort out. | |||
| Device ID to device address mappings are not leased, and can be | Device ID to device address mappings are not leased, and can be | |||
| changed at any time. (Note that while device ID to device address | changed at any time. (Note that while device ID to device address | |||
| mappings are likely to change after the metadata server restarts the | mappings are likely to change after the metadata server restarts, the | |||
| server is not required to change the mappings.) A server has two | server is not required to change the mappings.) A server has two | |||
| choices for changing mappings. It can recall all layouts referring | choices for changing mappings. It can recall all layouts referring | |||
| to the device ID or it can use a notification mechanism. | to the device ID or it can use a notification mechanism. | |||
| The NFSv4.1 protocol has no optimal way to recall all layouts that | The NFSv4.1 protocol has no optimal way to recall all layouts that | |||
| referred to a particular device ID (unless the server associates a | referred to a particular device ID (unless the server associates a | |||
| single device ID with a single fsid or a single client ID; in which | single device ID with a single fsid or a single client ID; in which | |||
| case, CB_LAYOUTRECALL has options for recalling all layouts | case, CB_LAYOUTRECALL has options for recalling all layouts | |||
| associated with the fsid, client ID pair or just the client ID). | associated with the fsid, client ID pair or just the client ID). | |||
| skipping to change at page 270, line 29 | skipping to change at page 270, line 29 | |||
| CB_LAYOUTRECALL request. When the client fully processes the | CB_LAYOUTRECALL request. When the client fully processes the | |||
| response to a LAYOUTGET or LAYOUTRETURN, or fully processes the | response to a LAYOUTGET or LAYOUTRETURN, or fully processes the | |||
| arguments of a CB_LAYOUTRECALL, it MUST use the seqid of the stateid | arguments of a CB_LAYOUTRECALL, it MUST use the seqid of the stateid | |||
| of the reply from LAYOUTGET and LAYOUTRETURN, or the seqid of the | of the reply from LAYOUTGET and LAYOUTRETURN, or the seqid of the | |||
| stateid in the arguments of CB_LAYOUTRECALL, on subsequent calls to | stateid in the arguments of CB_LAYOUTRECALL, on subsequent calls to | |||
| LAYOUTGET or LAYOUTRETURN. The client and server use the "seqid" of | LAYOUTGET or LAYOUTRETURN. The client and server use the "seqid" of | |||
| the layout stateid for the following purposes: | the layout stateid for the following purposes: | |||
| o Permit the client to send parallel LAYOUTGET operations on the | o Permit the client to send parallel LAYOUTGET operations on the | |||
| same file. As with parallel opens (see Section 9.10) the use of | same file. As with parallel opens (see Section 9.10) the use of | |||
| the sequence ID allows a client to avoid serializing LAYOUTGET | the stateid's seqid allows a client to avoid serializing LAYOUTGET | |||
| operations. If LAYOUTGETs were serialized, especially non- | operations. If LAYOUTGETs were serialized, especially non- | |||
| overlapping LAYOUTGETs, then non-overlapping I/Os to storage | overlapping LAYOUTGETs, then non-overlapping I/Os to storage | |||
| devices would in turn be effectively serialized with each other. | devices would in turn be effectively serialized with each other. | |||
| In the event parallel LAYOUTGET operations are sent with a non- | In the event parallel LAYOUTGET operations are sent with a non- | |||
| layout stateid (because the client does not yet have a layout | layout stateid (because the client does not yet have a layout | |||
| stateid), the successful responses MUST have the same "other" | stateid), the successful responses MUST have the same "other" | |||
| field in the LAYOUTSTATEID, and each response with a unique | field in the LAYOUTSTATEID, and each response with a unique | |||
| "seqid", where the lowest "seqid" is one, and the highest "seqid" | "seqid", where the lowest "seqid" is one, and the highest "seqid" | |||
| is equal to the count of parallel LAYOUTGET operations invoked on | is equal to the count of parallel LAYOUTGET operations invoked on | |||
| the non-layout stateid. | the non-layout stateid. | |||
| skipping to change at page 272, line 48 | skipping to change at page 272, line 48 | |||
| update time_modify at LAYOUTCOMMIT. At LAYOUTCOMMIT completion, the | update time_modify at LAYOUTCOMMIT. At LAYOUTCOMMIT completion, the | |||
| updated attributes should be visible if that file was modified since | updated attributes should be visible if that file was modified since | |||
| the latest previous LAYOUTCOMMIT or LAYOUTGET. | the latest previous LAYOUTCOMMIT or LAYOUTGET. | |||
| 12.5.4.2. LAYOUTCOMMIT and size | 12.5.4.2. LAYOUTCOMMIT and size | |||
| The size of a file may be updated when the LAYOUTCOMMIT operation is | The size of a file may be updated when the LAYOUTCOMMIT operation is | |||
| used by the client. One of the fields in the argument to | used by the client. One of the fields in the argument to | |||
| LAYOUTCOMMIT is loca_last_write_offset; this field indicates the | LAYOUTCOMMIT is loca_last_write_offset; this field indicates the | |||
| highest byte offset written but not yet committed with the | highest byte offset written but not yet committed with the | |||
| LAYOUTCOMMIT operation. The data type of lora_last_write_offset is | LAYOUTCOMMIT operation. The data type of loca_last_write_offset is | |||
| newoffset4 and is switched on a boolean value, no_newoffset, that | newoffset4 and is switched on a boolean value, no_newoffset, that | |||
| indicates if a previous write occurred or not. If no_newoffset is | indicates if a previous write occurred or not. If no_newoffset is | |||
| FALSE, an offset is not given. If the client has a layout with | FALSE, an offset is not given. If the client has a layout with | |||
| LAYOUTIOMODE4_RW iomode on the file, with an lo_offset and lo_length | LAYOUTIOMODE4_RW iomode on the file, with an lo_offset and lo_length | |||
| that overlaps loca_last_write_offset, then the client MAY set | that overlaps loca_last_write_offset, then the client MAY set | |||
| no_newoffset to TRUE and provide an offset that will update the file | no_newoffset to TRUE and provide an offset that will update the file | |||
| size. Keep in mind that offset is not the same as length, though | size. Keep in mind that offset is not the same as length, though | |||
| they are related. For example, a loca_last_write_offset value of | they are related. For example, a loca_last_write_offset value of | |||
| zero means that one byte was written at offset zero, and so the | zero means that one byte was written at offset zero, and so the | |||
| length of the file is at least one byte. | length of the file is at least one byte. | |||
| skipping to change at page 273, line 41 | skipping to change at page 273, line 41 | |||
| The results of LAYOUTCOMMIT contain a new size value in the form of a | The results of LAYOUTCOMMIT contain a new size value in the form of a | |||
| newsize4 union data type. If the file's size is set as a result of | newsize4 union data type. If the file's size is set as a result of | |||
| LAYOUTCOMMIT, the metadata server must reply with the new size; | LAYOUTCOMMIT, the metadata server must reply with the new size; | |||
| otherwise the new size is not provided. If the file size is updated, | otherwise the new size is not provided. If the file size is updated, | |||
| the metadata server SHOULD update the storage devices such that the | the metadata server SHOULD update the storage devices such that the | |||
| new file size is reflected when LAYOUTCOMMIT processing is complete. | new file size is reflected when LAYOUTCOMMIT processing is complete. | |||
| For example, the client should be able to READ up to the new file | For example, the client should be able to READ up to the new file | |||
| size. | size. | |||
| If the client wants to explicitly zero-extend or truncate a file, the | The client can extend the length of a file or truncate a file by | |||
| SETATTR operation MUST be used; SETATTR use is not required when | sending a SETATTR operation to the metadata server with the size | |||
| simply writing past EOF via WRITE. | attribute specified. If the size specified is larger than the | |||
| current size of the file, the file is "zero extended", i.e., zeroes | ||||
| are implicitly added between the file's previous EOF and the new EOF. | ||||
| (In many implementations the zero extended region of the file | ||||
| consists of unallocated holes in the file.) When the client writes | ||||
| past EOF via WRITE, the SETATTR operation does not need to be used. | ||||
| 12.5.4.3. LAYOUTCOMMIT and layoutupdate | 12.5.4.3. LAYOUTCOMMIT and layoutupdate | |||
| The LAYOUTCOMMIT argument contains a loca_layoutupdate field | The LAYOUTCOMMIT argument contains a loca_layoutupdate field | |||
| (Section 18.42.1) of data type layoutupdate4 (Section 3.3.18). This | (Section 18.42.1) of data type layoutupdate4 (Section 3.3.18). This | |||
| argument is a layout type-specific structure. The structure can be | argument is a layout type-specific structure. The structure can be | |||
| used to pass arbitrary layout type-specific information from the | used to pass arbitrary layout type-specific information from the | |||
| client to the metadata server at LAYOUTCOMMIT time. For example, if | client to the metadata server at LAYOUTCOMMIT time. For example, if | |||
| using a block/volume layout, the client can indicate to the metadata | using a block/volume layout, the client can indicate to the metadata | |||
| server which reserved or allocated blocks the client used or did not | server which reserved or allocated blocks the client used or did not | |||
| skipping to change at page 277, line 26 | skipping to change at page 277, line 35 | |||
| 12.5.5.2. Sequencing of Layout Operations | 12.5.5.2. Sequencing of Layout Operations | |||
| As with other stateful operations, pNFS requires the correct | As with other stateful operations, pNFS requires the correct | |||
| sequencing of layout operations. PNFS uses the "seqid" in the layout | sequencing of layout operations. PNFS uses the "seqid" in the layout | |||
| stateid to provide the correct sequencing between regular operations | stateid to provide the correct sequencing between regular operations | |||
| and callbacks. It is the server's responsibility to avoid | and callbacks. It is the server's responsibility to avoid | |||
| inconsistencies regarding the layouts provided and the client's | inconsistencies regarding the layouts provided and the client's | |||
| responsibility to properly serialize its layout requests and layout | responsibility to properly serialize its layout requests and layout | |||
| returns. | returns. | |||
| 12.5.5.2.1. Recall/Return Sequencing | 12.5.5.2.1. Layout Recall and Return Sequencing | |||
| Section 2.10.5.3 describes the sessions mechanism for allowing the | One critical issue with regard to layout operations sequencing | |||
| client to detect such situations in order to delay processing such a | concerns callbacks. The protocol must defend against races between | |||
| CB_LAYOUTRECALL. The server MUST reference all conflicting LAYOUTGET | the reply to a LAYOUTGET or LAYOUTRETURN operation and a subsequent | |||
| operations in the CB_SEQUENCE that precedes the CB_LAYOUTRECALL. A | CB_LAYOUTRECALL. A client MUST NOT process a CB_LAYOUTRECALL that | |||
| zero length array of referenced operations is used by the server to | implies one or more outstanding LAYOUTGET or LAYOUTRETURN operations | |||
| tell the client that the server does not know of any LAYOUTGET | to which the client has not yet received a reply. The client detects | |||
| operations that conflict with the recall. | such a CB_LAYOUTRECALL by examining the "seqid" field of the recall's | |||
| layout stateid. If the "seqid" is not one higher than what the | ||||
| client currently has recorded, and the client has at least one | ||||
| LAYOUTGET and/or LAYOUTRETURN operation outstanding, the client knows | ||||
| the server sent the CB_LAYOUTRECALL after sending a response to an | ||||
| outstanding LAYOUTGET or LAYOUTRETURN. The client MUST wait before | ||||
| processing such a CB_LAYOUTRECALL until it processes all replies for | ||||
| outstanding LAYOUTGET and LAYOUTRETURN operations for the | ||||
| corresponding file with seqid less than the seqid given by | ||||
| CB_LAYOUTRECALL (lor_stateid, see Section 20.3.) | ||||
| While referencing conflicting operations in CB_SEQUENCE conveys to | In addition to the seqid-based mechanism, Section 2.10.5.3 describes | |||
| the client that the server is aware of races, one critical issue with | the sessions mechanism for allowing the client to detect callback | |||
| regard to operation sequencing concerns callbacks. The protocol must | race conditions and delay processing such a CB_LAYOUTRECALL. The | |||
| defend against races between the reply to a LAYOUTGET or LAYOUTRETURN | server MAY reference conflicting operations in the CB_SEQUENCE that | |||
| operation and a subsequent CB_LAYOUTRECALL. A client MUST NOT | precedes the CB_LAYOUTRECALL. Because the server has already sent | |||
| process a CB_LAYOUTRECALL that implies one or more outstanding | replies for these operations before issuing the callback, the replies | |||
| LAYOUTGET or LAYOUTRETURN operations to which the client has not yet | may race with the CB_LAYOUTRECALL. The client MUST wait for all the | |||
| received a reply. The client detects such a CB_LAYOUTRECALL by | referenced calls to complete and update its view of the layout state | |||
| examining the "seqid" field of the recall's layout stateid. If the | before processing the CB_LAYOUTRECALL. | |||
| "seqid" is not one higher than what the client currently has | ||||
| recorded, and the client has at least one LAYOUTGET and/or | ||||
| LAYOUTRETURN operation outstanding, the client knows the server sent | ||||
| the CB_LAYOUTRECALL after the server sent a response to an | ||||
| outstanding LAYOUTGET or LAYOUTRETURN. | ||||
| 12.5.5.2.1.1. Get/Return Sequencing | 12.5.5.2.1.1. Get/Return Sequencing | |||
| The protocol allows the client to send concurrent LAYOUTGET and | The protocol allows the client to send concurrent LAYOUTGET and | |||
| LAYOUTRETURN operations to the server. The protocol does not provide | LAYOUTRETURN operations to the server. The protocol does not provide | |||
| any means for the server to process the requests in the same order in | any means for the server to process the requests in the same order in | |||
| which they were created. However, through the use of the "seqid" | which they were created. However, through the use of the "seqid" | |||
| field in the layout stateid, the client can determine the order in | field in the layout stateid, the client can determine the order in | |||
| which parallel outstanding operations were processed by the server. | which parallel outstanding operations were processed by the server. | |||
| Thus, when a layout retrieved by an outstanding LAYOUTGET operation | Thus, when a layout retrieved by an outstanding LAYOUTGET operation | |||
| skipping to change at page 284, line 46 | skipping to change at page 285, line 12 | |||
| the lease expires, but arrive after the lease expires. See | the lease expires, but arrive after the lease expires. See | |||
| Section 12.7.3. | Section 12.7.3. | |||
| 12.7.3. Dealing with Loss of Layout State on the Metadata Server | 12.7.3. Dealing with Loss of Layout State on the Metadata Server | |||
| This is a description of the case where all of the following are | This is a description of the case where all of the following are | |||
| true: | true: | |||
| o the metadata server has not restarted | o the metadata server has not restarted | |||
| o a pNFS client's device ID to layouts have been discarded (usually | o a pNFS client's layouts have been discarded (usually because the | |||
| because the client's lease expired) and are invalid | client's lease expired) and are invalid | |||
| o an I/O from the pNFS client arrives at the storage device | o an I/O from the pNFS client arrives at the storage device | |||
| The metadata server and its storage devices MUST solve this by | The metadata server and its storage devices MUST solve this by | |||
| fencing the client. In other words, prevent the execution of I/O | fencing the client. In other words, prevent the execution of I/O | |||
| operations from the client to the storage devices after layout state | operations from the client to the storage devices after layout state | |||
| loss. The details of how fencing is done are specific to the layout | loss. The details of how fencing is done are specific to the layout | |||
| type. The solution for NFSv4.1 file-based layouts is described in | type. The solution for NFSv4.1 file-based layouts is described in | |||
| (Section 13.11), and for other layout types in their respective | (Section 13.11), and for other layout types in their respective | |||
| external specification documents. | external specification documents. | |||
| 12.7.4. Recovery from Metadata Server Restart | 12.7.4. Recovery from Metadata Server Restart | |||
| The pNFS client will discover that the metadata server has restarted | The pNFS client will discover that the metadata server has restarted | |||
| (e.g. restarted) via the methods described in Section 8.4.2 and | via the methods described in Section 8.4.2 and discussed in a pNFS- | |||
| discussed in a pNFS-specific context in Paragraph 2, of | specific context in Paragraph 2, of Section 12.7.2. The client MUST | |||
| Section 12.7.2. The client MUST stop using layouts and delete the | stop using layouts and delete the device ID to device address | |||
| device ID to device address mappings it previously received from the | mappings it previously received from the metadata server. Having | |||
| metadata server. Having done that, if the client wrote data to the | done that, if the client wrote data to the storage device without | |||
| storage device without committing the layouts via LAYOUTCOMMIT, then | committing the layouts via LAYOUTCOMMIT, then the client has | |||
| the client has additional work to do in order to have the client, | additional work to do in order to have the client, metadata server | |||
| metadata server and storage device(s) all synchronized on the state | and storage device(s) all synchronized on the state of the data. | |||
| of the data. | ||||
| o If the client has data still modified and unwritten in the | o If the client has data still modified and unwritten in the | |||
| client's memory, the client has only two choices. | client's memory, the client has only two choices. | |||
| 1. The client can obtain a layout via LAYOUTGET after the | 1. The client can obtain a layout via LAYOUTGET after the | |||
| server's grace period and write the data to the storage | server's grace period and write the data to the storage | |||
| devices. | devices. | |||
| 2. The client can write that data through the metadata server | 2. The client can write that data through the metadata server | |||
| using the WRITE (Section 18.32) operation, and then obtain | using the WRITE (Section 18.32) operation, and then obtain | |||
| skipping to change at page 424, line 15 | skipping to change at page 424, line 15 | |||
| | CLAIM_DELEG_PREV_FH | granted to a previous client instance; | | | CLAIM_DELEG_PREV_FH | granted to a previous client instance; | | |||
| | | used after the client restarts. The server | | | | used after the client restarts. The server | | |||
| | | MAY support CLAIM_DELEGATE_PREV or | | | | MAY support CLAIM_DELEGATE_PREV or | | |||
| | | CLAIM_DELEG_PREV_FH (new to NFSv4.1). If | | | | CLAIM_DELEG_PREV_FH (new to NFSv4.1). If | | |||
| | | it does support either open type, | | | | it does support either open type, | | |||
| | | CREATE_SESSION MUST NOT remove the | | | | CREATE_SESSION MUST NOT remove the | | |||
| | | client's delegation state, and the server | | | | client's delegation state, and the server | | |||
| | | MUST support the DELEGPURGE operation. | | | | MUST support the DELEGPURGE operation. | | |||
| +----------------------+--------------------------------------------+ | +----------------------+--------------------------------------------+ | |||
| For OPEN requests whose claim type is other than CLAIM_PREVIOUS (i.e. | For OPEN requests that reach the server during the grace period, the | |||
| requests other than those devoted to reclaiming opens after a server | server returns an error of NFS4ERR_GRACE. The following claim types | |||
| restart) that reach the server during its grace or lease expiration | are exceptions: | |||
| period, the server returns an error of NFS4ERR_GRACE. | ||||
| o OPEN requests specifying the claim type CLAIM_PREVIOUS are devoted | ||||
| to reclaiming opens after a server reboot and are typically only | ||||
| valid during the grace period. | ||||
| o OPEN requests specifying the claim types CLAIM_DELEGATE_CUR and | ||||
| CLAIM_DELEG_CUR_FH are valid both during and after the grace | ||||
| period. Since the granting of the delegation that they are | ||||
| subordinate to assures that there is no conflict with locks to be | ||||
| reclaimed by other clients, the server need not return | ||||
| NFS4ERR_GRACE when these are received during the grace period. | ||||
| For any OPEN request, the server may return an open delegation, which | For any OPEN request, the server may return an open delegation, which | |||
| allows further opens and closes to be handled locally on the client | allows further opens and closes to be handled locally on the client | |||
| as described in Section 10.4. Note that delegation is up to the | as described in Section 10.4. Note that delegation is up to the | |||
| server to decide. The client should never assume that delegation | server to decide. The client should never assume that delegation | |||
| will or will not be granted in a particular instance. It should | will or will not be granted in a particular instance. It should | |||
| always be prepared for either case. A partial exception is the | always be prepared for either case. A partial exception is the | |||
| reclaim (CLAIM_PREVIOUS) case, in which a delegation type is claimed. | reclaim (CLAIM_PREVIOUS) case, in which a delegation type is claimed. | |||
| In this case, delegation will always be granted, although the server | In this case, delegation will always be granted, although the server | |||
| may specify an immediate recall in the delegation structure. | may specify an immediate recall in the delegation structure. | |||
| skipping to change at page 429, line 23 | skipping to change at page 429, line 31 | |||
| use time_modify_set or time_access_set to store the verifier. The | use time_modify_set or time_access_set to store the verifier. The | |||
| server SHOULD NOT store the verifier in the following attributes: acl | server SHOULD NOT store the verifier in the following attributes: acl | |||
| (it is desirable for access control to be established at creation), | (it is desirable for access control to be established at creation), | |||
| dacl (ditto), mode (ditto), owner (ditto), owner_group (ditto), | dacl (ditto), mode (ditto), owner (ditto), owner_group (ditto), | |||
| retentevt_set (it may be desired to establish retention at creation) | retentevt_set (it may be desired to establish retention at creation) | |||
| retention_hold (ditto), retention_set (ditto), sacl (it is desirable | retention_hold (ditto), retention_set (ditto), sacl (it is desirable | |||
| for auditing control to be established at creation), size (on some | for auditing control to be established at creation), size (on some | |||
| servers, size may have a limited range of values), mode_set_masked | servers, size may have a limited range of values), mode_set_masked | |||
| (as with mode), and time_creation (a meaningful file creation should | (as with mode), and time_creation (a meaningful file creation should | |||
| be set when the file is created). Another alternative for the server | be set when the file is created). Another alternative for the server | |||
| is to use named attribute to store the verifier. | is to use a named attribute to store the verifier. | |||
| Because the EXCLUSIVE4 create method does not specify initial | Because the EXCLUSIVE4 create method does not specify initial | |||
| attributes, when processing an EXCLUSIVE4 create, the server | attributes, when processing an EXCLUSIVE4 create, the server | |||
| o SHOULD set the owner of the file to that corresponding to the | o SHOULD set the owner of the file to that corresponding to the | |||
| credential of request's RPC header. | credential of request's RPC header. | |||
| o SHOULD NOT leave the file's access control to anyone but the owner | o SHOULD NOT leave the file's access control to anyone but the owner | |||
| of the file. | of the file. | |||
| skipping to change at page 462, line 45 | skipping to change at page 462, line 45 | |||
| The definition of stable storage has been historically a point of | The definition of stable storage has been historically a point of | |||
| contention. The following expected properties of stable storage may | contention. The following expected properties of stable storage may | |||
| help in resolving design sends in the implementation. Stable storage | help in resolving design sends in the implementation. Stable storage | |||
| is persistent storage that survives: | is persistent storage that survives: | |||
| 1. Repeated power failures. | 1. Repeated power failures. | |||
| 2. Hardware failures (of any board, power supply, etc.). | 2. Hardware failures (of any board, power supply, etc.). | |||
| 3. Repeated software crashes, including restart cycle. | 3. Repeated software crashes and restarts. | |||
| This definition does not address failure of the stable storage module | This definition does not address failure of the stable storage module | |||
| itself. | itself. | |||
| The verifier is defined to allow a client to detect different | The verifier is defined to allow a client to detect different | |||
| instances of an NFSv4.1 protocol server over which cached, | instances of an NFSv4.1 protocol server over which cached, | |||
| uncommitted data may be lost. In the most likely case, the verifier | uncommitted data may be lost. In the most likely case, the verifier | |||
| allows the client to detect server restarts. This information is | allows the client to detect server restarts. This information is | |||
| required so that the client can safely determine whether the server | required so that the client can safely determine whether the server | |||
| could have lost cached data. If the server fails unexpectedly and | could have lost cached data. If the server fails unexpectedly and | |||
| the client has uncommitted data from previous WRITE requests (done | the client has uncommitted data from previous WRITE requests (done | |||
| with the stable argument set to UNSTABLE4 and in which the result | with the stable argument set to UNSTABLE4 and in which the result | |||
| committed was returned as UNSTABLE4 as well) it may not have flushed | committed was returned as UNSTABLE4 as well) it may not have flushed | |||
| cached data to stable storage. The burden of recovery is on the | cached data to stable storage. The burden of recovery is on the | |||
| client and the client will need to retransmit the data to the server. | client and the client will need to retransmit the data to the server. | |||
| A suggested verifier would be to use the time that the server was | A suggested verifier would be to use the time that the server was | |||
| booted or the time the server was last started (if restarting the | last started (if restarting the server results in lost buffers). | |||
| server without a restart results in lost buffers). | ||||
| The committed field in the results allows the client to do more | The committed field in the results allows the client to do more | |||
| effective caching. If the server is committing all WRITE requests to | effective caching. If the server is committing all WRITE requests to | |||
| stable storage, then it should return with committed set to | stable storage, then it should return with committed set to | |||
| FILE_SYNC4, regardless of the value of the stable field in the | FILE_SYNC4, regardless of the value of the stable field in the | |||
| arguments. A server that uses an NVRAM accelerator may choose to | arguments. A server that uses an NVRAM accelerator may choose to | |||
| implement this policy. The client can use this to increase the | implement this policy. The client can use this to increase the | |||
| effectiveness of the cache by discarding cached data that has already | effectiveness of the cache by discarding cached data that has already | |||
| been committed on the server. | been committed on the server. | |||
| skipping to change at page 522, line 50 | skipping to change at page 522, line 50 | |||
| SEQ4_STATUS_LEASE_MOVED | SEQ4_STATUS_LEASE_MOVED | |||
| When set indicates that responsibility for lease renewal has been | When set indicates that responsibility for lease renewal has been | |||
| transferred to one or more new servers. This condition will | transferred to one or more new servers. This condition will | |||
| continue until the client receives an NFS4ERR_MOVED error and the | continue until the client receives an NFS4ERR_MOVED error and the | |||
| server receives the subsequent GETATTR for the fs_locations or | server receives the subsequent GETATTR for the fs_locations or | |||
| fs_locations_info attribute for an access to each file system for | fs_locations_info attribute for an access to each file system for | |||
| which a lease has been moved to a new server. See | which a lease has been moved to a new server. See | |||
| Section 11.7.7.1. | Section 11.7.7.1. | |||
| SEQ4_STATUS_RESTART_RECLAIM_NEEDED | SEQ4_STATUS_RESTART_RECLAIM_NEEDED | |||
| When set indicates that due to server restart or restart the | When set indicates that due to server restart the client must | |||
| client must reclaim locking state. Until the client sends a | reclaim locking state. Until the client sends a global | |||
| global RECLAIM_COMPLETE (Section 18.51), every SEQUENCE operation | RECLAIM_COMPLETE (Section 18.51), every SEQUENCE operation will | |||
| will return SEQ4_STATUS_RESTART_RECLAIM_NEEDED. | return SEQ4_STATUS_RESTART_RECLAIM_NEEDED. | |||
| SEQ4_STATUS_BACKCHANNEL_FAULT | SEQ4_STATUS_BACKCHANNEL_FAULT | |||
| The server has encountered an unrecoverable fault with the | The server has encountered an unrecoverable fault with the | |||
| backchannel (e.g. it has lost track of the sequence id for a slot | backchannel (e.g. it has lost track of the sequence id for a slot | |||
| in the backchannel). The client MUST stop sending more requests | in the backchannel). The client MUST stop sending more requests | |||
| on the session's fore channel, wait for all outstanding requests | on the session's fore channel, wait for all outstanding requests | |||
| to complete on the fore and back channel, and then destroy the | to complete on the fore and back channel, and then destroy the | |||
| session. | session. | |||
| SEQ4_STATUS_DEVID_CHANGED | SEQ4_STATUS_DEVID_CHANGED | |||
| skipping to change at page 524, line 25 | skipping to change at page 524, line 25 | |||
| The server MUST maintain a mapping of sessionid to client ID in order | The server MUST maintain a mapping of sessionid to client ID in order | |||
| to validate any operations that follow SEQUENCE that take a stateid | to validate any operations that follow SEQUENCE that take a stateid | |||
| as an argument and/or result. | as an argument and/or result. | |||
| If the client establishes a persistent session, then a SEQUENCE done | If the client establishes a persistent session, then a SEQUENCE done | |||
| after a server restart may encounter requests performed and recorded | after a server restart may encounter requests performed and recorded | |||
| in a persistent reply cache before the server restart. In this case, | in a persistent reply cache before the server restart. In this case, | |||
| SEQUENCE will be processed successfully, while requests which were | SEQUENCE will be processed successfully, while requests which were | |||
| not processed previously are rejected with NFS4ERR_DEADSESSION. | not processed previously are rejected with NFS4ERR_DEADSESSION. | |||
| Depending on the operations within the COMPOUND successfully | Depending on which of the operations within the COMPOUND were | |||
| performed before the server restart, these operations will also have | successfully performed before the server restart, these operations | |||
| replies sent from the server reply cache. Note that when these | will also have replies sent from the server reply cache. Note that | |||
| operations establish locking state it is locking state that applies | when these operations establish locking state it is locking state | |||
| to the previous server instance and to the previous client ID, even | that applies to the previous server instance and to the previous | |||
| though the server restart, which logically happened after these | client ID, even though the server restart, which logically happened | |||
| operations eliminated that state. In the case of a partially | after these operations, eliminated that state. In the case of a | |||
| executed COMPOUND, processing may reach an operation not processed | partially executed COMPOUND, processing may reach an operation not | |||
| during the earlier server instance, making this operation a new one | processed during the earlier server instance, making this operation a | |||
| and not performable on the existing session. In this case | new one and not performable on the existing session. In this case, | |||
| NFS4ERR_DEADSESSION will be returned from that operation. | NFS4ERR_DEADSESSION will be returned from that operation. | |||
| 18.47. Operation 54: SET_SSV - Update SSV for a Client ID | 18.47. Operation 54: SET_SSV - Update SSV for a Client ID | |||
| 18.47.1. ARGUMENT | 18.47.1. ARGUMENT | |||
| struct ssa_digest_input4 { | struct ssa_digest_input4 { | |||
| SEQUENCE4args sdi_seqargs; | SEQUENCE4args sdi_seqargs; | |||
| }; | }; | |||
| skipping to change at page 529, line 14 | skipping to change at page 529, line 14 | |||
| 18.49.1. ARGUMENT | 18.49.1. ARGUMENT | |||
| union deleg_claim4 switch (open_claim_type4 dc_claim) { | union deleg_claim4 switch (open_claim_type4 dc_claim) { | |||
| /* | /* | |||
| * No special rights to object. Ordinary delegation | * No special rights to object. Ordinary delegation | |||
| * request of the specified object. Object identified | * request of the specified object. Object identified | |||
| * by filehandle. | * by filehandle. | |||
| */ | */ | |||
| case CLAIM_FH: /* new to v4.1 */ | case CLAIM_FH: /* new to v4.1 */ | |||
| /* CURRENT_FH: object being delegated */ | ||||
| void; | void; | |||
| /* | /* | |||
| * Right to file based on a delegation granted | * Right to file based on a delegation granted | |||
| * to a previous boot instance of the client. | * to a previous boot instance of the client. | |||
| * File is specified by filehandle. | * File is specified by filehandle. | |||
| */ | */ | |||
| case CLAIM_DELEG_PREV_FH: /* new to v4.1 */ | case CLAIM_DELEG_PREV_FH: /* new to v4.1 */ | |||
| /* CURRENT_FH: object being delegated */ | /* CURRENT_FH: object being delegated */ | |||
| void; | void; | |||
| skipping to change at page 530, line 21 | skipping to change at page 530, line 21 | |||
| This operation allows a client to | This operation allows a client to | |||
| o get a delegation on all types of files except directories. The | o get a delegation on all types of files except directories. The | |||
| server MAY support this operation. If the server does not support | server MAY support this operation. If the server does not support | |||
| this operation, it MUST return NFS4ERR_NOTSUPP. | this operation, it MUST return NFS4ERR_NOTSUPP. | |||
| o register a "want" for a delegation for the specified file object, | o register a "want" for a delegation for the specified file object, | |||
| and be notified via a callback when the delegation is available. | and be notified via a callback when the delegation is available. | |||
| The server MAY support notifications of availability via | The server MAY support notifications of availability via | |||
| callbacks. If the server does not support registration of wants | callbacks. If the server does not support registration of wants | |||
| it MUST NOT return an error to indicate that. When the server | it MUST NOT return an error to indicate that, and instead MUST | |||
| indicates that it will notify the server by means of a callback, | return ond_why set to WND4_CONTENTION or WND4_RESOURCE and | |||
| it will either provide the delegation using a CB_PUSH_DELEG | ond_server_will_push_deleg or ond_server_will_signal_avail set to | |||
| operation, or cancel its promise by sending a CB_WANTS_CANCELLED | FALSE. When the server indicates that it will notify the client | |||
| operation. | by means of a callback, it will either provide the delegation | |||
| using a CB_PUSH_DELEG operation, or cancel its promise by sending | ||||
| a CB_WANTS_CANCELLED operation. | ||||
| o cancel a want for a delegation. | o cancel a want for a delegation. | |||
| The client SHOULD NOT set OPEN4_SHARE_ACCESS_READ and SHOULD NOT set | The client SHOULD NOT set OPEN4_SHARE_ACCESS_READ and SHOULD NOT set | |||
| OPEN4_SHARE_ACCESS_WRITE in wda_want. If it does, the server MUST | OPEN4_SHARE_ACCESS_WRITE in wda_want. If it does, the server MUST | |||
| ignore them. | ignore them. | |||
| The meanings of the following flags in wda_want are the same as they | The meanings of the following flags in wda_want are the same as they | |||
| are in OPEN: | are in OPEN: | |||
| skipping to change at page 556, line 41 | skipping to change at page 556, line 41 | |||
| protocol error must result. See Section 18.46.3 for a description of | protocol error must result. See Section 18.46.3 for a description of | |||
| how slots are processed. | how slots are processed. | |||
| If csa_cachethis is TRUE, then the server is requesting that the | If csa_cachethis is TRUE, then the server is requesting that the | |||
| client cache the reply in the callback reply cache. The client MUST | client cache the reply in the callback reply cache. The client MUST | |||
| cache the reply (see Section 2.10.5.1.3). | cache the reply (see Section 2.10.5.1.3). | |||
| The csa_referring_call_lists array is the list of COMPOUND requests, | The csa_referring_call_lists array is the list of COMPOUND requests, | |||
| identified by sessionid, slot id and sequencid. These are requests | identified by sessionid, slot id and sequencid. These are requests | |||
| that the client previously sent to the server. These previous | that the client previously sent to the server. These previous | |||
| requests created state that some operation(s) in the in the same | requests created state that some operation(s) in the same CB_COMPOUND | |||
| CB_COMPOUND as the csa_referring_call_lists is identifying. A | as the csa_referring_call_lists is identifying. A sessionid is | |||
| sessionid is included because leased state is tied to a client ID, | included because leased state is tied to a client ID, and a client ID | |||
| and a client ID can have multiple sessions. See Section 2.10.5.3. | can have multiple sessions. See Section 2.10.5.3. | |||
| The value of csa_sequenceid argument relative to the cached sequence | The value of csa_sequenceid argument relative to the cached sequence | |||
| id on the slot falls into one of three cases. | id on the slot falls into one of three cases. | |||
| o If the difference between csa_sequenceid and the client's cached | o If the difference between csa_sequenceid and the client's cached | |||
| sequence id at the slot id is two (2) or more, or if | sequence id at the slot id is two (2) or more, or if | |||
| csa_sequenceid is less than the cached sequence id (accounting for | csa_sequenceid is less than the cached sequence id (accounting for | |||
| wraparound of the unsigned sequence id value), then the client | wraparound of the unsigned sequence id value), then the client | |||
| MUST return NFS4ERR_SEQ_MISORDERED. | MUST return NFS4ERR_SEQ_MISORDERED. | |||
| End of changes. 43 change blocks. | ||||
| 116 lines changed or deleted | 135 lines changed or added | |||
This html diff was produced by rfcdiff 1.33. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||