|  |  | 
|  | 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. |