| David Howells | 2d6fff6 | 2009-04-03 16:42:36 +0100 | [diff] [blame] | 1 | ========================== | 
|  | 2 | General Filesystem Caching | 
|  | 3 | ========================== | 
|  | 4 |  | 
|  | 5 | ======== | 
|  | 6 | OVERVIEW | 
|  | 7 | ======== | 
|  | 8 |  | 
|  | 9 | This facility is a general purpose cache for network filesystems, though it | 
|  | 10 | could be used for caching other things such as ISO9660 filesystems too. | 
|  | 11 |  | 
|  | 12 | FS-Cache mediates between cache backends (such as CacheFS) and network | 
|  | 13 | filesystems: | 
|  | 14 |  | 
|  | 15 | +---------+ | 
|  | 16 | |         |                        +--------------+ | 
|  | 17 | |   NFS   |--+                     |              | | 
|  | 18 | |         |  |                 +-->|   CacheFS    | | 
|  | 19 | +---------+  |   +----------+  |   |  /dev/hda5   | | 
|  | 20 | |   |          |  |   +--------------+ | 
|  | 21 | +---------+  +-->|          |  | | 
|  | 22 | |         |      |          |--+ | 
|  | 23 | |   AFS   |----->| FS-Cache | | 
|  | 24 | |         |      |          |--+ | 
|  | 25 | +---------+  +-->|          |  | | 
|  | 26 | |   |          |  |   +--------------+ | 
|  | 27 | +---------+  |   +----------+  |   |              | | 
|  | 28 | |         |  |                 +-->|  CacheFiles  | | 
|  | 29 | |  ISOFS  |--+                     |  /var/cache  | | 
|  | 30 | |         |                        +--------------+ | 
|  | 31 | +---------+ | 
|  | 32 |  | 
|  | 33 | Or to look at it another way, FS-Cache is a module that provides a caching | 
|  | 34 | facility to a network filesystem such that the cache is transparent to the | 
|  | 35 | user: | 
|  | 36 |  | 
|  | 37 | +---------+ | 
|  | 38 | |         | | 
|  | 39 | | Server  | | 
|  | 40 | |         | | 
|  | 41 | +---------+ | 
|  | 42 | |                  NETWORK | 
|  | 43 | ~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  | 44 | | | 
|  | 45 | |           +----------+ | 
|  | 46 | V           |          | | 
|  | 47 | +---------+      |          | | 
|  | 48 | |         |      |          | | 
|  | 49 | |   NFS   |----->| FS-Cache | | 
|  | 50 | |         |      |          |--+ | 
|  | 51 | +---------+      |          |  |   +--------------+   +--------------+ | 
|  | 52 | |           |          |  |   |              |   |              | | 
|  | 53 | V           +----------+  +-->|  CacheFiles  |-->|  Ext3        | | 
|  | 54 | +---------+                        |  /var/cache  |   |  /dev/sda6   | | 
|  | 55 | |         |                        +--------------+   +--------------+ | 
|  | 56 | |   VFS   |                                ^                     ^ | 
|  | 57 | |         |                                |                     | | 
|  | 58 | +---------+                                +--------------+      | | 
|  | 59 | |                  KERNEL SPACE                      |      | | 
|  | 60 | ~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|~~~~~~|~~~~ | 
|  | 61 | |                  USER SPACE                        |      | | 
|  | 62 | V                                                    |      | | 
|  | 63 | +---------+                                           +--------------+ | 
|  | 64 | |         |                                           |              | | 
|  | 65 | | Process |                                           | cachefilesd  | | 
|  | 66 | |         |                                           |              | | 
|  | 67 | +---------+                                           +--------------+ | 
|  | 68 |  | 
|  | 69 |  | 
|  | 70 | FS-Cache does not follow the idea of completely loading every netfs file | 
|  | 71 | opened in its entirety into a cache before permitting it to be accessed and | 
|  | 72 | then serving the pages out of that cache rather than the netfs inode because: | 
|  | 73 |  | 
|  | 74 | (1) It must be practical to operate without a cache. | 
|  | 75 |  | 
|  | 76 | (2) The size of any accessible file must not be limited to the size of the | 
|  | 77 | cache. | 
|  | 78 |  | 
|  | 79 | (3) The combined size of all opened files (this includes mapped libraries) | 
|  | 80 | must not be limited to the size of the cache. | 
|  | 81 |  | 
|  | 82 | (4) The user should not be forced to download an entire file just to do a | 
|  | 83 | one-off access of a small portion of it (such as might be done with the | 
|  | 84 | "file" program). | 
|  | 85 |  | 
|  | 86 | It instead serves the cache out in PAGE_SIZE chunks as and when requested by | 
|  | 87 | the netfs('s) using it. | 
|  | 88 |  | 
|  | 89 |  | 
|  | 90 | FS-Cache provides the following facilities: | 
|  | 91 |  | 
|  | 92 | (1) More than one cache can be used at once.  Caches can be selected | 
|  | 93 | explicitly by use of tags. | 
|  | 94 |  | 
|  | 95 | (2) Caches can be added / removed at any time. | 
|  | 96 |  | 
|  | 97 | (3) The netfs is provided with an interface that allows either party to | 
|  | 98 | withdraw caching facilities from a file (required for (2)). | 
|  | 99 |  | 
|  | 100 | (4) The interface to the netfs returns as few errors as possible, preferring | 
|  | 101 | rather to let the netfs remain oblivious. | 
|  | 102 |  | 
|  | 103 | (5) Cookies are used to represent indices, files and other objects to the | 
|  | 104 | netfs.  The simplest cookie is just a NULL pointer - indicating nothing | 
|  | 105 | cached there. | 
|  | 106 |  | 
|  | 107 | (6) The netfs is allowed to propose - dynamically - any index hierarchy it | 
|  | 108 | desires, though it must be aware that the index search function is | 
|  | 109 | recursive, stack space is limited, and indices can only be children of | 
|  | 110 | indices. | 
|  | 111 |  | 
|  | 112 | (7) Data I/O is done direct to and from the netfs's pages.  The netfs | 
|  | 113 | indicates that page A is at index B of the data-file represented by cookie | 
|  | 114 | C, and that it should be read or written.  The cache backend may or may | 
|  | 115 | not start I/O on that page, but if it does, a netfs callback will be | 
|  | 116 | invoked to indicate completion.  The I/O may be either synchronous or | 
|  | 117 | asynchronous. | 
|  | 118 |  | 
|  | 119 | (8) Cookies can be "retired" upon release.  At this point FS-Cache will mark | 
|  | 120 | them as obsolete and the index hierarchy rooted at that point will get | 
|  | 121 | recycled. | 
|  | 122 |  | 
|  | 123 | (9) The netfs provides a "match" function for index searches.  In addition to | 
|  | 124 | saying whether a match was made or not, this can also specify that an | 
|  | 125 | entry should be updated or deleted. | 
|  | 126 |  | 
|  | 127 | (10) As much as possible is done asynchronously. | 
|  | 128 |  | 
|  | 129 |  | 
|  | 130 | FS-Cache maintains a virtual indexing tree in which all indices, files, objects | 
|  | 131 | and pages are kept.  Bits of this tree may actually reside in one or more | 
|  | 132 | caches. | 
|  | 133 |  | 
|  | 134 | FSDEF | 
|  | 135 | | | 
|  | 136 | +------------------------------------+ | 
|  | 137 | |                                    | | 
|  | 138 | NFS                                  AFS | 
|  | 139 | |                                    | | 
|  | 140 | +--------------------------+                +-----------+ | 
|  | 141 | |                          |                |           | | 
|  | 142 | homedir                     mirror          afs.org   redhat.com | 
|  | 143 | |                          |                            | | 
|  | 144 | +------------+           +---------------+              +----------+ | 
|  | 145 | |            |           |               |              |          | | 
|  | 146 | 00001        00002       00007           00125        vol00001   vol00002 | 
|  | 147 | |            |           |               |                         | | 
|  | 148 | +---+---+     +-----+      +---+      +------+------+            +-----+----+ | 
|  | 149 | |   |   |     |     |      |   |      |      |      |            |     |    | | 
|  | 150 | PG0 PG1 PG2   PG0  XATTR   PG0 PG1   DIRENT DIRENT DIRENT        R/W   R/O  Bak | 
|  | 151 | |                                            | | 
|  | 152 | PG0                                       +-------+ | 
|  | 153 | |       | | 
|  | 154 | 00001   00003 | 
|  | 155 | | | 
|  | 156 | +---+---+ | 
|  | 157 | |   |   | | 
|  | 158 | PG0 PG1 PG2 | 
|  | 159 |  | 
|  | 160 | In the example above, you can see two netfs's being backed: NFS and AFS.  These | 
|  | 161 | have different index hierarchies: | 
|  | 162 |  | 
|  | 163 | (*) The NFS primary index contains per-server indices.  Each server index is | 
|  | 164 | indexed by NFS file handles to get data file objects.  Each data file | 
|  | 165 | objects can have an array of pages, but may also have further child | 
|  | 166 | objects, such as extended attributes and directory entries.  Extended | 
|  | 167 | attribute objects themselves have page-array contents. | 
|  | 168 |  | 
|  | 169 | (*) The AFS primary index contains per-cell indices.  Each cell index contains | 
|  | 170 | per-logical-volume indices.  Each of volume index contains up to three | 
|  | 171 | indices for the read-write, read-only and backup mirrors of those volumes. | 
|  | 172 | Each of these contains vnode data file objects, each of which contains an | 
|  | 173 | array of pages. | 
|  | 174 |  | 
|  | 175 | The very top index is the FS-Cache master index in which individual netfs's | 
|  | 176 | have entries. | 
|  | 177 |  | 
|  | 178 | Any index object may reside in more than one cache, provided it only has index | 
|  | 179 | children.  Any index with non-index object children will be assumed to only | 
|  | 180 | reside in one cache. | 
|  | 181 |  | 
|  | 182 |  | 
|  | 183 | The netfs API to FS-Cache can be found in: | 
|  | 184 |  | 
|  | 185 | Documentation/filesystems/caching/netfs-api.txt | 
|  | 186 |  | 
|  | 187 | The cache backend API to FS-Cache can be found in: | 
|  | 188 |  | 
|  | 189 | Documentation/filesystems/caching/backend-api.txt | 
|  | 190 |  | 
| David Howells | 36c9559 | 2009-04-03 16:42:38 +0100 | [diff] [blame] | 191 | A description of the internal representations and object state machine can be | 
|  | 192 | found in: | 
|  | 193 |  | 
|  | 194 | Documentation/filesystems/caching/object.txt | 
|  | 195 |  | 
| David Howells | 2d6fff6 | 2009-04-03 16:42:36 +0100 | [diff] [blame] | 196 |  | 
|  | 197 | ======================= | 
|  | 198 | STATISTICAL INFORMATION | 
|  | 199 | ======================= | 
|  | 200 |  | 
|  | 201 | If FS-Cache is compiled with the following options enabled: | 
|  | 202 |  | 
| David Howells | 2d6fff6 | 2009-04-03 16:42:36 +0100 | [diff] [blame] | 203 | CONFIG_FSCACHE_STATS=y | 
|  | 204 | CONFIG_FSCACHE_HISTOGRAM=y | 
|  | 205 |  | 
|  | 206 | then it will gather certain statistics and display them through a number of | 
|  | 207 | proc files. | 
|  | 208 |  | 
|  | 209 | (*) /proc/fs/fscache/stats | 
|  | 210 |  | 
|  | 211 | This shows counts of a number of events that can happen in FS-Cache: | 
|  | 212 |  | 
|  | 213 | CLASS	EVENT	MEANING | 
|  | 214 | =======	=======	======================================================= | 
|  | 215 | Cookies	idx=N	Number of index cookies allocated | 
|  | 216 | dat=N	Number of data storage cookies allocated | 
|  | 217 | spc=N	Number of special cookies allocated | 
|  | 218 | Objects	alc=N	Number of objects allocated | 
|  | 219 | nal=N	Number of object allocation failures | 
|  | 220 | avl=N	Number of objects that reached the available state | 
|  | 221 | ded=N	Number of objects that reached the dead state | 
|  | 222 | ChkAux	non=N	Number of objects that didn't have a coherency check | 
|  | 223 | ok=N	Number of objects that passed a coherency check | 
|  | 224 | upd=N	Number of objects that needed a coherency data update | 
|  | 225 | obs=N	Number of objects that were declared obsolete | 
|  | 226 | Pages	mrk=N	Number of pages marked as being cached | 
|  | 227 | unc=N	Number of uncache page requests seen | 
|  | 228 | Acquire	n=N	Number of acquire cookie requests seen | 
|  | 229 | nul=N	Number of acq reqs given a NULL parent | 
|  | 230 | noc=N	Number of acq reqs rejected due to no cache available | 
|  | 231 | ok=N	Number of acq reqs succeeded | 
|  | 232 | nbf=N	Number of acq reqs rejected due to error | 
|  | 233 | oom=N	Number of acq reqs failed on ENOMEM | 
|  | 234 | Lookups	n=N	Number of lookup calls made on cache backends | 
|  | 235 | neg=N	Number of negative lookups made | 
|  | 236 | pos=N	Number of positive lookups made | 
|  | 237 | crt=N	Number of objects created by lookup | 
| David Howells | fee096d | 2009-11-19 18:12:05 +0000 | [diff] [blame] | 238 | tmo=N	Number of lookups timed out and requeued | 
| David Howells | 2d6fff6 | 2009-04-03 16:42:36 +0100 | [diff] [blame] | 239 | Updates	n=N	Number of update cookie requests seen | 
|  | 240 | nul=N	Number of upd reqs given a NULL parent | 
|  | 241 | run=N	Number of upd reqs granted CPU time | 
|  | 242 | Relinqs	n=N	Number of relinquish cookie requests seen | 
|  | 243 | nul=N	Number of rlq reqs given a NULL parent | 
|  | 244 | wcr=N	Number of rlq reqs waited on completion of creation | 
|  | 245 | AttrChg	n=N	Number of attribute changed requests seen | 
|  | 246 | ok=N	Number of attr changed requests queued | 
|  | 247 | nbf=N	Number of attr changed rejected -ENOBUFS | 
|  | 248 | oom=N	Number of attr changed failed -ENOMEM | 
|  | 249 | run=N	Number of attr changed ops given CPU time | 
|  | 250 | Allocs	n=N	Number of allocation requests seen | 
|  | 251 | ok=N	Number of successful alloc reqs | 
|  | 252 | wt=N	Number of alloc reqs that waited on lookup completion | 
|  | 253 | nbf=N	Number of alloc reqs rejected -ENOBUFS | 
| David Howells | 5753c44 | 2009-11-19 18:11:19 +0000 | [diff] [blame] | 254 | int=N	Number of alloc reqs aborted -ERESTARTSYS | 
| David Howells | 2d6fff6 | 2009-04-03 16:42:36 +0100 | [diff] [blame] | 255 | ops=N	Number of alloc reqs submitted | 
|  | 256 | owt=N	Number of alloc reqs waited for CPU time | 
| David Howells | 60d543c | 2009-11-19 18:11:45 +0000 | [diff] [blame] | 257 | abt=N	Number of alloc reqs aborted due to object death | 
| David Howells | 2d6fff6 | 2009-04-03 16:42:36 +0100 | [diff] [blame] | 258 | Retrvls	n=N	Number of retrieval (read) requests seen | 
|  | 259 | ok=N	Number of successful retr reqs | 
|  | 260 | wt=N	Number of retr reqs that waited on lookup completion | 
|  | 261 | nod=N	Number of retr reqs returned -ENODATA | 
|  | 262 | nbf=N	Number of retr reqs rejected -ENOBUFS | 
|  | 263 | int=N	Number of retr reqs aborted -ERESTARTSYS | 
|  | 264 | oom=N	Number of retr reqs failed -ENOMEM | 
|  | 265 | ops=N	Number of retr reqs submitted | 
|  | 266 | owt=N	Number of retr reqs waited for CPU time | 
| David Howells | 60d543c | 2009-11-19 18:11:45 +0000 | [diff] [blame] | 267 | abt=N	Number of retr reqs aborted due to object death | 
| David Howells | 2d6fff6 | 2009-04-03 16:42:36 +0100 | [diff] [blame] | 268 | Stores	n=N	Number of storage (write) requests seen | 
|  | 269 | ok=N	Number of successful store reqs | 
|  | 270 | agn=N	Number of store reqs on a page already pending storage | 
|  | 271 | nbf=N	Number of store reqs rejected -ENOBUFS | 
|  | 272 | oom=N	Number of store reqs failed -ENOMEM | 
|  | 273 | ops=N	Number of store reqs submitted | 
|  | 274 | run=N	Number of store reqs granted CPU time | 
| David Howells | 1bccf51 | 2009-11-19 18:11:25 +0000 | [diff] [blame] | 275 | pgs=N	Number of pages given store req processing time | 
|  | 276 | rxd=N	Number of store reqs deleted from tracking tree | 
|  | 277 | olm=N	Number of store reqs over store limit | 
| David Howells | 201a154 | 2009-11-19 18:11:35 +0000 | [diff] [blame] | 278 | VmScan	nos=N	Number of release reqs against pages with no pending store | 
|  | 279 | gon=N	Number of release reqs against pages stored by time lock granted | 
|  | 280 | bsy=N	Number of release reqs ignored due to in-progress store | 
|  | 281 | can=N	Number of page stores cancelled due to release req | 
| David Howells | 2d6fff6 | 2009-04-03 16:42:36 +0100 | [diff] [blame] | 282 | Ops	pend=N	Number of times async ops added to pending queues | 
|  | 283 | run=N	Number of times async ops given CPU time | 
|  | 284 | enq=N	Number of times async ops queued for processing | 
| David Howells | 5753c44 | 2009-11-19 18:11:19 +0000 | [diff] [blame] | 285 | can=N	Number of async ops cancelled | 
| David Howells | e3d4d28 | 2009-11-19 18:11:32 +0000 | [diff] [blame] | 286 | rej=N	Number of async ops rejected due to object lookup/create failure | 
| David Howells | 2d6fff6 | 2009-04-03 16:42:36 +0100 | [diff] [blame] | 287 | dfr=N	Number of async ops queued for deferred release | 
|  | 288 | rel=N	Number of async ops released | 
|  | 289 | gc=N	Number of deferred-release async ops garbage collected | 
| David Howells | 52bd75f | 2009-11-19 18:11:08 +0000 | [diff] [blame] | 290 | CacheOp	alo=N	Number of in-progress alloc_object() cache ops | 
|  | 291 | luo=N	Number of in-progress lookup_object() cache ops | 
|  | 292 | luc=N	Number of in-progress lookup_complete() cache ops | 
|  | 293 | gro=N	Number of in-progress grab_object() cache ops | 
|  | 294 | upo=N	Number of in-progress update_object() cache ops | 
|  | 295 | dro=N	Number of in-progress drop_object() cache ops | 
|  | 296 | pto=N	Number of in-progress put_object() cache ops | 
|  | 297 | syn=N	Number of in-progress sync_cache() cache ops | 
|  | 298 | atc=N	Number of in-progress attr_changed() cache ops | 
|  | 299 | rap=N	Number of in-progress read_or_alloc_page() cache ops | 
|  | 300 | ras=N	Number of in-progress read_or_alloc_pages() cache ops | 
|  | 301 | alp=N	Number of in-progress allocate_page() cache ops | 
|  | 302 | als=N	Number of in-progress allocate_pages() cache ops | 
|  | 303 | wrp=N	Number of in-progress write_page() cache ops | 
|  | 304 | ucp=N	Number of in-progress uncache_page() cache ops | 
|  | 305 | dsp=N	Number of in-progress dissociate_pages() cache ops | 
| David Howells | 2d6fff6 | 2009-04-03 16:42:36 +0100 | [diff] [blame] | 306 |  | 
|  | 307 |  | 
|  | 308 | (*) /proc/fs/fscache/histogram | 
|  | 309 |  | 
|  | 310 | cat /proc/fs/fscache/histogram | 
| David Howells | 7394daa | 2009-04-03 16:42:37 +0100 | [diff] [blame] | 311 | JIFS  SECS  OBJ INST  OP RUNS   OBJ RUNS  RETRV DLY RETRIEVLS | 
| David Howells | 2d6fff6 | 2009-04-03 16:42:36 +0100 | [diff] [blame] | 312 | ===== ===== ========= ========= ========= ========= ========= | 
|  | 313 |  | 
|  | 314 | This shows the breakdown of the number of times each amount of time | 
|  | 315 | between 0 jiffies and HZ-1 jiffies a variety of tasks took to run.  The | 
|  | 316 | columns are as follows: | 
|  | 317 |  | 
|  | 318 | COLUMN		TIME MEASUREMENT | 
|  | 319 | =======		======================================================= | 
|  | 320 | OBJ INST	Length of time to instantiate an object | 
|  | 321 | OP RUNS		Length of time a call to process an operation took | 
|  | 322 | OBJ RUNS	Length of time a call to process an object event took | 
|  | 323 | RETRV DLY	Time between an requesting a read and lookup completing | 
|  | 324 | RETRIEVLS	Time between beginning and end of a retrieval | 
|  | 325 |  | 
|  | 326 | Each row shows the number of events that took a particular range of times. | 
| David Howells | 7394daa | 2009-04-03 16:42:37 +0100 | [diff] [blame] | 327 | Each step is 1 jiffy in size.  The JIFS column indicates the particular | 
|  | 328 | jiffy range covered, and the SECS field the equivalent number of seconds. | 
| David Howells | 2d6fff6 | 2009-04-03 16:42:36 +0100 | [diff] [blame] | 329 |  | 
|  | 330 |  | 
| David Howells | 4fbf429 | 2009-11-19 18:11:04 +0000 | [diff] [blame] | 331 | =========== | 
|  | 332 | OBJECT LIST | 
|  | 333 | =========== | 
|  | 334 |  | 
|  | 335 | If CONFIG_FSCACHE_OBJECT_LIST is enabled, the FS-Cache facility will maintain a | 
|  | 336 | list of all the objects currently allocated and allow them to be viewed | 
|  | 337 | through: | 
|  | 338 |  | 
|  | 339 | /proc/fs/fscache/objects | 
|  | 340 |  | 
|  | 341 | This will look something like: | 
|  | 342 |  | 
|  | 343 | [root@andromeda ~]# head /proc/fs/fscache/objects | 
|  | 344 | OBJECT   PARENT   STAT CHLDN OPS OOP IPR EX READS EM EV F S | NETFS_COOKIE_DEF TY FL NETFS_DATA       OBJECT_KEY, AUX_DATA | 
|  | 345 | ======== ======== ==== ===== === === === == ===== == == = = | ================ == == ================ ================ | 
| Tejun Heo | 8b8edef | 2010-07-20 22:09:01 +0200 | [diff] [blame] | 346 | 17e4b        2 ACTV     0   0   0   0  0     0 7b  4 0 0 | NFS.fh           DT  0 ffff88001dd82820 010006017edcf8bbc93b43298fdfbe71e50b57b13a172c0117f38472, e567634700000000000000000000000063f2404a000000000000000000000000c9030000000000000000000063f2404a | 
|  | 347 | 1693a        2 ACTV     0   0   0   0  0     0 7b  4 0 0 | NFS.fh           DT  0 ffff88002db23380 010006017edcf8bbc93b43298fdfbe71e50b57b1e0162c01a2df0ea6, 420ebc4a000000000000000000000000420ebc4a0000000000000000000000000e1801000000000000000000420ebc4a | 
| David Howells | 4fbf429 | 2009-11-19 18:11:04 +0000 | [diff] [blame] | 348 |  | 
|  | 349 | where the first set of columns before the '|' describe the object: | 
|  | 350 |  | 
|  | 351 | COLUMN	DESCRIPTION | 
|  | 352 | =======	=============================================================== | 
|  | 353 | OBJECT	Object debugging ID (appears as OBJ%x in some debug messages) | 
|  | 354 | PARENT	Debugging ID of parent object | 
|  | 355 | STAT	Object state | 
|  | 356 | CHLDN	Number of child objects of this object | 
|  | 357 | OPS	Number of outstanding operations on this object | 
|  | 358 | OOP	Number of outstanding child object management operations | 
|  | 359 | IPR | 
|  | 360 | EX	Number of outstanding exclusive operations | 
|  | 361 | READS	Number of outstanding read operations | 
|  | 362 | EM	Object's event mask | 
|  | 363 | EV	Events raised on this object | 
|  | 364 | F	Object flags | 
| Tejun Heo | 8b8edef | 2010-07-20 22:09:01 +0200 | [diff] [blame] | 365 | S	Object work item busy state mask (1:pending 2:running) | 
| David Howells | 4fbf429 | 2009-11-19 18:11:04 +0000 | [diff] [blame] | 366 |  | 
|  | 367 | and the second set of columns describe the object's cookie, if present: | 
|  | 368 |  | 
|  | 369 | COLUMN		DESCRIPTION | 
|  | 370 | ===============	======================================================= | 
|  | 371 | NETFS_COOKIE_DEF Name of netfs cookie definition | 
|  | 372 | TY		Cookie type (IX - index, DT - data, hex - special) | 
|  | 373 | FL		Cookie flags | 
|  | 374 | NETFS_DATA	Netfs private data stored in the cookie | 
|  | 375 | OBJECT_KEY	Object key	} 1 column, with separating comma | 
|  | 376 | AUX_DATA	Object aux data	} presence may be configured | 
|  | 377 |  | 
|  | 378 | The data shown may be filtered by attaching the a key to an appropriate keyring | 
|  | 379 | before viewing the file.  Something like: | 
|  | 380 |  | 
|  | 381 | keyctl add user fscache:objlist <restrictions> @s | 
|  | 382 |  | 
|  | 383 | where <restrictions> are a selection of the following letters: | 
|  | 384 |  | 
|  | 385 | K	Show hexdump of object key (don't show if not given) | 
|  | 386 | A	Show hexdump of object aux data (don't show if not given) | 
|  | 387 |  | 
|  | 388 | and the following paired letters: | 
|  | 389 |  | 
|  | 390 | C	Show objects that have a cookie | 
|  | 391 | c	Show objects that don't have a cookie | 
|  | 392 | B	Show objects that are busy | 
|  | 393 | b	Show objects that aren't busy | 
|  | 394 | W	Show objects that have pending writes | 
|  | 395 | w	Show objects that don't have pending writes | 
|  | 396 | R	Show objects that have outstanding reads | 
|  | 397 | r	Show objects that don't have outstanding reads | 
| Tejun Heo | 8b8edef | 2010-07-20 22:09:01 +0200 | [diff] [blame] | 398 | S	Show objects that have work queued | 
|  | 399 | s	Show objects that don't have work queued | 
| David Howells | 4fbf429 | 2009-11-19 18:11:04 +0000 | [diff] [blame] | 400 |  | 
|  | 401 | If neither side of a letter pair is given, then both are implied.  For example: | 
|  | 402 |  | 
|  | 403 | keyctl add user fscache:objlist KB @s | 
|  | 404 |  | 
|  | 405 | shows objects that are busy, and lists their object keys, but does not dump | 
|  | 406 | their auxiliary data.  It also implies "CcWwRrSs", but as 'B' is given, 'b' is | 
|  | 407 | not implied. | 
|  | 408 |  | 
|  | 409 | By default all objects and all fields will be shown. | 
|  | 410 |  | 
|  | 411 |  | 
| David Howells | 2d6fff6 | 2009-04-03 16:42:36 +0100 | [diff] [blame] | 412 | ========= | 
|  | 413 | DEBUGGING | 
|  | 414 | ========= | 
|  | 415 |  | 
| David Howells | 7394daa | 2009-04-03 16:42:37 +0100 | [diff] [blame] | 416 | If CONFIG_FSCACHE_DEBUG is enabled, the FS-Cache facility can have runtime | 
|  | 417 | debugging enabled by adjusting the value in: | 
| David Howells | 2d6fff6 | 2009-04-03 16:42:36 +0100 | [diff] [blame] | 418 |  | 
|  | 419 | /sys/module/fscache/parameters/debug | 
|  | 420 |  | 
|  | 421 | This is a bitmask of debugging streams to enable: | 
|  | 422 |  | 
|  | 423 | BIT	VALUE	STREAM				POINT | 
|  | 424 | =======	=======	===============================	======================= | 
|  | 425 | 0	1	Cache management		Function entry trace | 
|  | 426 | 1	2					Function exit trace | 
|  | 427 | 2	4					General | 
|  | 428 | 3	8	Cookie management		Function entry trace | 
|  | 429 | 4	16					Function exit trace | 
|  | 430 | 5	32					General | 
|  | 431 | 6	64	Page handling			Function entry trace | 
|  | 432 | 7	128					Function exit trace | 
|  | 433 | 8	256					General | 
|  | 434 | 9	512	Operation management		Function entry trace | 
|  | 435 | 10	1024					Function exit trace | 
|  | 436 | 11	2048					General | 
|  | 437 |  | 
|  | 438 | The appropriate set of values should be OR'd together and the result written to | 
|  | 439 | the control file.  For example: | 
|  | 440 |  | 
|  | 441 | echo $((1|8|64)) >/sys/module/fscache/parameters/debug | 
|  | 442 |  | 
|  | 443 | will turn on all function entry debugging. |