|  | 
 | Fault Injection | 
 | =============== | 
 | Fault injection is a method for forcing errors that may not normally occur, or | 
 | may be difficult to reproduce.  Forcing these errors in a controlled environment | 
 | can help the developer find and fix bugs before their code is shipped in a | 
 | production system.  Injecting an error on the Linux NFS server will allow us to | 
 | observe how the client reacts and if it manages to recover its state correctly. | 
 |  | 
 | NFSD_FAULT_INJECTION must be selected when configuring the kernel to use this | 
 | feature. | 
 |  | 
 |  | 
 | Using Fault Injection | 
 | ===================== | 
 | On the client, mount the fault injection server through NFS v4.0+ and do some | 
 | work over NFS (open files, take locks, ...). | 
 |  | 
 | On the server, mount the debugfs filesystem to <debug_dir> and ls | 
 | <debug_dir>/nfsd.  This will show a list of files that will be used for | 
 | injecting faults on the NFS server.  As root, write a number n to the file | 
 | corresponding to the action you want the server to take.  The server will then | 
 | process the first n items it finds.  So if you want to forget 5 locks, echo '5' | 
 | to <debug_dir>/nfsd/forget_locks.  A value of 0 will tell the server to forget | 
 | all corresponding items.  A log message will be created containing the number | 
 | of items forgotten (check dmesg). | 
 |  | 
 | Go back to work on the client and check if the client recovered from the error | 
 | correctly. | 
 |  | 
 |  | 
 | Available Faults | 
 | ================ | 
 | forget_clients: | 
 |      The NFS server keeps a list of clients that have placed a mount call.  If | 
 |      this list is cleared, the server will have no knowledge of who the client | 
 |      is, forcing the client to reauthenticate with the server. | 
 |  | 
 | forget_openowners: | 
 |      The NFS server keeps a list of what files are currently opened and who | 
 |      they were opened by.  Clearing this list will force the client to reopen | 
 |      its files. | 
 |  | 
 | forget_locks: | 
 |      The NFS server keeps a list of what files are currently locked in the VFS. | 
 |      Clearing this list will force the client to reclaim its locks (files are | 
 |      unlocked through the VFS as they are cleared from this list). | 
 |  | 
 | forget_delegations: | 
 |      A delegation is used to assure the client that a file, or part of a file, | 
 |      has not changed since the delegation was awarded.  Clearing this list will | 
 |      force the client to reaquire its delegation before accessing the file | 
 |      again. | 
 |  | 
 | recall_delegations: | 
 |      Delegations can be recalled by the server when another client attempts to | 
 |      access a file.  This test will notify the client that its delegation has | 
 |      been revoked, forcing the client to reaquire the delegation before using | 
 |      the file again. | 
 |  | 
 |  | 
 | tools/nfs/inject_faults.sh script | 
 | ================================= | 
 | This script has been created to ease the fault injection process.  This script | 
 | will detect the mounted debugfs directory and write to the files located there | 
 | based on the arguments passed by the user.  For example, running | 
 | `inject_faults.sh forget_locks 1` as root will instruct the server to forget | 
 | one lock.  Running `inject_faults forget_locks` will instruct the server to | 
 | forgetall locks. |