€•Œsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ3/translations/zh_CN/filesystems/caching/backend-api”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/zh_TW/filesystems/caching/backend-api”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/it_IT/filesystems/caching/backend-api”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/ja_JP/filesystems/caching/backend-api”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/ko_KR/filesystems/caching/backend-api”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/pt_BR/filesystems/caching/backend-api”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/sp_SP/filesystems/caching/backend-api”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)�”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…”�”}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒM/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api.rst”h´KubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒCache Backend API”h]”hŒCache Backend API”…”�”}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhŒ paragraph”“”)�”}”(hŒ»The FS-Cache system provides an API by which actual caches can be supplied to FS-Cache for it to then serve out to network filesystems and other interested parties. This API is used by::”h]”hŒºThe FS-Cache system provides an API by which actual caches can be supplied to FS-Cache for it to then serve out to network filesystems and other interested parties. This API is used by:”…”�”}”(hhßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhhÊh²hubhŒ literal_block”“”)�”}”(hŒ!#include .”h]”hŒ!#include .”…”�”}”hhïsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´K hhÊh²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒOverview”h]”hŒOverview”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhýh²hh³hÇh´KubhÞ)�”}”(hŒ†Interaction with the API is handled on three levels: cache, volume and data storage, and each level has its own type of cookie object:”h]”hŒ†Interaction with the API is handled on three levels: cache, volume and data storage, and each level has its own type of cookie object:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khhýh²hubhŒ block_quote”“”)�”}”(hX8======================= ======================= COOKIE C TYPE ======================= ======================= Cache cookie struct fscache_cache Volume cookie struct fscache_volume Data storage cookie struct fscache_cookie ======================= ======================= ”h]”hŒtable”“”)�”}”(hhh]”hŒtgroup”“”)�”}”(hhh]”(hŒcolspec”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j,hj)ubj-)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j,hj)ubhŒthead”“”)�”}”(hhh]”hŒrow”“”)�”}”(hhh]”(hŒentry”“”)�”}”(hhh]”hÞ)�”}”(hŒCOOKIE”h]”hŒCOOKIE”…”�”}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhjNubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhjIubjM)�”}”(hhh]”hÞ)�”}”(hŒC TYPE”h]”hŒC TYPE”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khjeubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhjIubeh}”(h]”h ]”h"]”h$]”h&]”uh1jGhjDubah}”(h]”h ]”h"]”h$]”h&]”uh1jBhj)ubhŒtbody”“”)�”}”(hhh]”(jH)�”}”(hhh]”(jM)�”}”(hhh]”hÞ)�”}”(hŒ Cache cookie”h]”hŒ Cache cookie”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhj�ubjM)�”}”(hhh]”hÞ)�”}”(hŒstruct fscache_cache”h]”hŒstruct fscache_cache”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khj§ubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhj�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jGhjŠubjH)�”}”(hhh]”(jM)�”}”(hhh]”hÞ)�”}”(hŒ Volume cookie”h]”hŒ Volume cookie”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhjÇubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhjÄubjM)�”}”(hhh]”hÞ)�”}”(hŒstruct fscache_volume”h]”hŒstruct fscache_volume”…”�”}”(hjáh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhjÞubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhjÄubeh}”(h]”h ]”h"]”h$]”h&]”uh1jGhjŠubjH)�”}”(hhh]”(jM)�”}”(hhh]”hÞ)�”}”(hŒData storage cookie”h]”hŒData storage cookie”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khjþubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhjûubjM)�”}”(hhh]”hÞ)�”}”(hŒstruct fscache_cookie”h]”hŒstruct fscache_cookie”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhjûubeh}”(h]”h ]”h"]”h$]”h&]”uh1jGhjŠubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆhj)ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j'hj$ubah}”(h]”h ]”h"]”h$]”h&]”uh1j"hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´Khhýh²hubhÞ)�”}”(hX€Cookies are used to provide some filesystem data to the cache, manage state and pin the cache during access in addition to acting as reference points for the API functions. Each cookie has a debugging ID that is included in trace points to make it easier to correlate traces. Note, though, that debugging IDs are simply allocated from incrementing counters and will eventually wrap.”h]”hX€Cookies are used to provide some filesystem data to the cache, manage state and pin the cache during access in addition to acting as reference points for the API functions. Each cookie has a debugging ID that is included in trace points to make it easier to correlate traces. Note, though, that debugging IDs are simply allocated from incrementing counters and will eventually wrap.”…”�”}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khhýh²hubhÞ)�”}”(hŒéThe cache backend and the network filesystem can both ask for cache cookies - and if they ask for one of the same name, they'll get the same cookie. Volume and data cookies, however, are created at the behest of the filesystem only.”h]”hŒëThe cache backend and the network filesystem can both ask for cache cookies - and if they ask for one of the same name, they’ll get the same cookie. Volume and data cookies, however, are created at the behest of the filesystem only.”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K"hhýh²hubeh}”(h]”Œoverview”ah ]”h"]”Œoverview”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Cache Cookies”h]”hŒ Cache Cookies”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjoh²hh³hÇh´K(ubhÞ)�”}”(hŒPCaches are represented in the API by cache cookies. These are objects of type::”h]”hŒOCaches are represented in the API by cache cookies. These are objects of type:”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K*hjoh²hubhî)�”}”(hŒ‹struct fscache_cache { void *cache_priv; unsigned int debug_id; char *name; ... };”h]”hŒ‹struct fscache_cache { void *cache_priv; unsigned int debug_id; char *name; ... };”…”�”}”hjŽsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´K-hjoh²hubhÞ)�”}”(hXUThere are a few fields that the cache backend might be interested in. The ``debug_id`` can be used in tracing to match lines referring to the same cache and ``name`` is the name the cache was registered with. The ``cache_priv`` member is private data provided by the cache when it is brought online. The other fields are for internal use.”h]”(hŒKThere are a few fields that the cache backend might be interested in. The ”…”�”}”(hjœh²hh³Nh´NubhŒliteral”“”)�”}”(hŒ ``debug_id``”h]”hŒdebug_id”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjœubhŒG can be used in tracing to match lines referring to the same cache and ”…”�”}”(hjœh²hh³Nh´Nubj¥)�”}”(hŒ``name``”h]”hŒname”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjœubhŒ1 is the name the cache was registered with. The ”…”�”}”(hjœh²hh³Nh´Nubj¥)�”}”(hŒ``cache_priv``”h]”hŒ cache_priv”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjœubhŒp member is private data provided by the cache when it is brought online. The other fields are for internal use.”…”�”}”(hjœh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K4hjoh²hubeh}”(h]”Œ cache-cookies”ah ]”h"]”Œ cache cookies”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K(ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒRegistering a Cache”h]”hŒRegistering a Cache”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjêh²hh³hÇh´Khjêh²hubhî)�”}”(hŒ>struct fscache_cache *fscache_acquire_cache(const char *name);”h]”hŒ>struct fscache_cache *fscache_acquire_cache(const char *name);”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´KAhjêh²hubhÞ)�”}”(hX=This will look up and potentially create a cache cookie. The cache cookie may have already been created by a network filesystem looking for it, in which case that cache cookie will be used. If the cache cookie is not in use by another cache, it will be moved into the preparing state, otherwise it will return busy.”h]”hX=This will look up and potentially create a cache cookie. The cache cookie may have already been created by a network filesystem looking for it, in which case that cache cookie will be used. If the cache cookie is not in use by another cache, it will be moved into the preparing state, otherwise it will return busy.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KChjêh²hubhÞ)�”}”(hŒ’If successful, the cache backend can then start setting up the cache. In the event that the initialisation fails, the cache backend should call::”h]”hŒ‘If successful, the cache backend can then start setting up the cache. In the event that the initialisation fails, the cache backend should call:”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KIhjêh²hubhî)�”}”(hŒ;void fscache_relinquish_cache(struct fscache_cache *cache);”h]”hŒ;void fscache_relinquish_cache(struct fscache_cache *cache);”…”�”}”hj3sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´KLhjêh²hubhÞ)�”}”(hŒ to reset and discard the cookie.”h]”hŒ to reset and discard the cookie.”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KNhjêh²hubeh}”(h]”Œregistering-a-cache”ah ]”h"]”Œregistering a cache”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KOnce the cache is set up, it can be brought online by calling:”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KThjWh²hubhî)�”}”(hŒ–int fscache_add_cache(struct fscache_cache *cache, const struct fscache_cache_ops *ops, void *cache_priv);”h]”hŒ–int fscache_add_cache(struct fscache_cache *cache, const struct fscache_cache_ops *ops, void *cache_priv);”…”�”}”hjvsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´KVhjWh²hubhÞ)�”}”(hŒ­This stores the cache operations table pointer and cache private data into the cache cookie and moves the cache to the active state, thereby allowing accesses to take place.”h]”hŒ­This stores the cache operations table pointer and cache private data into the cache cookie and moves the cache to the active state, thereby allowing accesses to take place.”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KZhjWh²hubeh}”(h]”Œbringing-a-cache-online”ah ]”h"]”Œbringing a cache online”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KRubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Withdrawing a Cache From Service”h]”hŒ Withdrawing a Cache From Service”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjšh²hh³hÇh´K`ubhÞ)�”}”(hŒNThe cache backend can withdraw a cache from service by calling this function::”h]”hŒMThe cache backend can withdraw a cache from service by calling this function:”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kbhjšh²hubhî)�”}”(hŒ9void fscache_withdraw_cache(struct fscache_cache *cache);”h]”hŒ9void fscache_withdraw_cache(struct fscache_cache *cache);”…”�”}”hj¹sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´Kdhjšh²hubhÞ)�”}”(hŒªThis moves the cache to the withdrawn state to prevent new cache- and volume-level accesses from starting and then waits for outstanding cache-level accesses to complete.”h]”hŒªThis moves the cache to the withdrawn state to prevent new cache- and volume-level accesses from starting and then waits for outstanding cache-level accesses to complete.”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kfhjšh²hubhÞ)�”}”(hŒkThe cache must then go through the data storage objects it has and tell fscache to withdraw them, calling::”h]”hŒjThe cache must then go through the data storage objects it has and tell fscache to withdraw them, calling:”…”�”}”(hjÕh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kjhjšh²hubhî)�”}”(hŒ``cache_priv`` - A place for the cache to stash private data. ”h]”hÞ)�”}”(hŒ=``cache_priv`` - A place for the cache to stash private data.”h]”(j¥)�”}”(hŒ``cache_priv``”h]”hŒ cache_priv”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjÙubhŒ/ - A place for the cache to stash private data.”…”�”}”(hjÙh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KšhjÕubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hjªubj®)�”}”(hŒ:``debug_id`` - A debugging ID for logging in tracepoints. ”h]”hÞ)�”}”(hŒ9``debug_id`` - A debugging ID for logging in tracepoints.”h]”(j¥)�”}”(hŒ ``debug_id``”h]”hŒdebug_id”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjÿubhŒ- - A debugging ID for logging in tracepoints.”…”�”}”(hjÿh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kœhjûubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hjªubj®)�”}”(hŒ¬``key`` - A printable string with no '/' characters in it that represents the index key for the volume. The key is NUL-terminated and padded out to a multiple of 4 bytes. ”h]”hÞ)�”}”(hŒ«``key`` - A printable string with no '/' characters in it that represents the index key for the volume. The key is NUL-terminated and padded out to a multiple of 4 bytes.”h]”(j¥)�”}”(hŒ``key``”h]”hŒkey”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hj%ubhŒ¨ - A printable string with no ‘/’ characters in it that represents the index key for the volume. The key is NUL-terminated and padded out to a multiple of 4 bytes.”…”�”}”(hj%h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kžhj!ubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hjªubj®)�”}”(hŒo``key_hash`` - A hash of the index key. This should work out the same, no matter the cpu arch and endianness. ”h]”hÞ)�”}”(hŒn``key_hash`` - A hash of the index key. This should work out the same, no matter the cpu arch and endianness.”h]”(j¥)�”}”(hŒ ``key_hash``”h]”hŒkey_hash”…”�”}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjKubhŒb - A hash of the index key. This should work out the same, no matter the cpu arch and endianness.”…”�”}”(hjKh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¢hjGubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hjªubj®)�”}”(hŒk``coherency`` - A piece of coherency data that should be checked when the volume is bound to in the cache. ”h]”hÞ)�”}”(hŒj``coherency`` - A piece of coherency data that should be checked when the volume is bound to in the cache.”h]”(j¥)�”}”(hŒ ``coherency``”h]”hŒ coherency”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjqubhŒ] - A piece of coherency data that should be checked when the volume is bound to in the cache.”…”�”}”(hjqh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¥hjmubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hjªubj®)�”}”(hŒA``coherency_len`` - The amount of data in the coherency buffer. ”h]”hÞ)�”}”(hŒ?``coherency_len`` - The amount of data in the coherency buffer.”h]”(j¥)�”}”(hŒ``coherency_len``”h]”hŒ coherency_len”…”�”}”(hj›h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hj—ubhŒ. - The amount of data in the coherency buffer.”…”�”}”(hj—h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¨hj“ubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hjªubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ*”uh1j¨h³hÇh´K˜hj¤ubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´K˜hjih²hubeh}”(h]”Œvolume-cookies”ah ]”h"]”Œvolume cookies”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K†ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒData Storage Cookies”h]”hŒData Storage Cookies”…”�”}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjÏh²hh³hÇh´K¬ubhÞ)�”}”(hŒ±A volume is a logical group of data storage objects, each of which is represented to the network filesystem by a cookie. Cookies are represented in the API as objects of type::”h]”hŒ°A volume is a logical group of data storage objects, each of which is represented to the network filesystem by a cookie. Cookies are represented in the API as objects of type:”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K®hjÏh²hubhî)�”}”(hXstruct fscache_cookie { struct fscache_volume *volume; void *cache_priv; unsigned long flags; unsigned int debug_id; unsigned int inval_counter; loff_t object_size; u8 advice; u32 key_hash; u8 key_len; u8 aux_len; ... };”h]”hXstruct fscache_cookie { struct fscache_volume *volume; void *cache_priv; unsigned long flags; unsigned int debug_id; unsigned int inval_counter; loff_t object_size; u8 advice; u32 key_hash; u8 key_len; u8 aux_len; ... };”…”�”}”hjîsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´K²hjÏh²hubhÞ)�”}”(hŒGThe fields in the cookie that are of interest to the cache backend are:”h]”hŒGThe fields in the cookie that are of interest to the cache backend are:”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÀhjÏh²hubj)�”}”(hXÜ* ``volume`` - The parent volume cookie. * ``cache_priv`` - A place for the cache to stash private data. * ``flags`` - A collection of bit flags, including: * FSCACHE_COOKIE_NO_DATA_TO_READ - There is no data available in the cache to be read as the cookie has been created or invalidated. * FSCACHE_COOKIE_NEEDS_UPDATE - The coherency data and/or object size has been changed and needs committing. * FSCACHE_COOKIE_LOCAL_WRITE - The netfs's data has been modified locally, so the cache object may be in an incoherent state with respect to the server. * FSCACHE_COOKIE_HAVE_DATA - The backend should set this if it successfully stores data into the cache. * FSCACHE_COOKIE_RETIRED - The cookie was invalidated when it was relinquished and the cached data should be discarded. * ``debug_id`` - A debugging ID for logging in tracepoints. * ``inval_counter`` - The number of invalidations done on the cookie. * ``advice`` - Information about how the cookie is to be used. * ``key_hash`` - A hash of the index key. This should work out the same, no matter the cpu arch and endianness. * ``key_len`` - The length of the index key. * ``aux_len`` - The length of the coherency data buffer. ”h]”j©)�”}”(hhh]”(j®)�”}”(hŒ'``volume`` - The parent volume cookie. ”h]”hÞ)�”}”(hŒ&``volume`` - The parent volume cookie.”h]”(j¥)�”}”(hŒ ``volume``”h]”hŒvolume”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjubhŒ - The parent volume cookie.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÂhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hjubj®)�”}”(hŒ>``cache_priv`` - A place for the cache to stash private data. ”h]”hÞ)�”}”(hŒ=``cache_priv`` - A place for the cache to stash private data.”h]”(j¥)�”}”(hŒ``cache_priv``”h]”hŒ cache_priv”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hj;ubhŒ/ - A place for the cache to stash private data.”…”�”}”(hj;h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÄhj7ubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hjubj®)�”}”(hX¹``flags`` - A collection of bit flags, including: * FSCACHE_COOKIE_NO_DATA_TO_READ - There is no data available in the cache to be read as the cookie has been created or invalidated. * FSCACHE_COOKIE_NEEDS_UPDATE - The coherency data and/or object size has been changed and needs committing. * FSCACHE_COOKIE_LOCAL_WRITE - The netfs's data has been modified locally, so the cache object may be in an incoherent state with respect to the server. * FSCACHE_COOKIE_HAVE_DATA - The backend should set this if it successfully stores data into the cache. * FSCACHE_COOKIE_RETIRED - The cookie was invalidated when it was relinquished and the cached data should be discarded. ”h]”(hÞ)�”}”(hŒ1``flags`` - A collection of bit flags, including:”h]”(j¥)�”}”(hŒ ``flags``”h]”hŒflags”…”�”}”(hjeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjaubhŒ( - A collection of bit flags, including:”…”�”}”(hjah²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÆhj]ubj)�”}”(hX{* FSCACHE_COOKIE_NO_DATA_TO_READ - There is no data available in the cache to be read as the cookie has been created or invalidated. * FSCACHE_COOKIE_NEEDS_UPDATE - The coherency data and/or object size has been changed and needs committing. * FSCACHE_COOKIE_LOCAL_WRITE - The netfs's data has been modified locally, so the cache object may be in an incoherent state with respect to the server. * FSCACHE_COOKIE_HAVE_DATA - The backend should set this if it successfully stores data into the cache. * FSCACHE_COOKIE_RETIRED - The cookie was invalidated when it was relinquished and the cached data should be discarded. ”h]”j©)�”}”(hhh]”(j®)�”}”(hŒƒFSCACHE_COOKIE_NO_DATA_TO_READ - There is no data available in the cache to be read as the cookie has been created or invalidated. ”h]”hÞ)�”}”(hŒ‚FSCACHE_COOKIE_NO_DATA_TO_READ - There is no data available in the cache to be read as the cookie has been created or invalidated.”h]”hŒ‚FSCACHE_COOKIE_NO_DATA_TO_READ - There is no data available in the cache to be read as the cookie has been created or invalidated.”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÈhj„ubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hj�ubj®)�”}”(hŒkFSCACHE_COOKIE_NEEDS_UPDATE - The coherency data and/or object size has been changed and needs committing. ”h]”hÞ)�”}”(hŒjFSCACHE_COOKIE_NEEDS_UPDATE - The coherency data and/or object size has been changed and needs committing.”h]”hŒjFSCACHE_COOKIE_NEEDS_UPDATE - The coherency data and/or object size has been changed and needs committing.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KËhjœubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hj�ubj®)�”}”(hŒ—FSCACHE_COOKIE_LOCAL_WRITE - The netfs's data has been modified locally, so the cache object may be in an incoherent state with respect to the server. ”h]”hÞ)�”}”(hŒ–FSCACHE_COOKIE_LOCAL_WRITE - The netfs's data has been modified locally, so the cache object may be in an incoherent state with respect to the server.”h]”hŒ˜FSCACHE_COOKIE_LOCAL_WRITE - The netfs’s data has been modified locally, so the cache object may be in an incoherent state with respect to the server.”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÎhj´ubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hj�ubj®)�”}”(hŒfFSCACHE_COOKIE_HAVE_DATA - The backend should set this if it successfully stores data into the cache. ”h]”hÞ)�”}”(hŒeFSCACHE_COOKIE_HAVE_DATA - The backend should set this if it successfully stores data into the cache.”h]”hŒeFSCACHE_COOKIE_HAVE_DATA - The backend should set this if it successfully stores data into the cache.”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÒhjÌubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hj�ubj®)�”}”(hŒvFSCACHE_COOKIE_RETIRED - The cookie was invalidated when it was relinquished and the cached data should be discarded. ”h]”hÞ)�”}”(hŒuFSCACHE_COOKIE_RETIRED - The cookie was invalidated when it was relinquished and the cached data should be discarded.”h]”hŒuFSCACHE_COOKIE_RETIRED - The cookie was invalidated when it was relinquished and the cached data should be discarded.”…”�”}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÕhjäubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hj�ubeh}”(h]”h ]”h"]”h$]”h&]”j¿jÀuh1j¨h³hÇh´KÈhj}ubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´KÈhj]ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j­hjubj®)�”}”(hŒ:``debug_id`` - A debugging ID for logging in tracepoints. ”h]”hÞ)�”}”(hŒ9``debug_id`` - A debugging ID for logging in tracepoints.”h]”(j¥)�”}”(hŒ ``debug_id``”h]”hŒdebug_id”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjubhŒ- - A debugging ID for logging in tracepoints.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KØhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hjubj®)�”}”(hŒD``inval_counter`` - The number of invalidations done on the cookie. ”h]”hÞ)�”}”(hŒC``inval_counter`` - The number of invalidations done on the cookie.”h]”(j¥)�”}”(hŒ``inval_counter``”h]”hŒ inval_counter”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hj8ubhŒ2 - The number of invalidations done on the cookie.”…”�”}”(hj8h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÚhj4ubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hjubj®)�”}”(hŒ=``advice`` - Information about how the cookie is to be used. ”h]”hÞ)�”}”(hŒ<``advice`` - Information about how the cookie is to be used.”h]”(j¥)�”}”(hŒ ``advice``”h]”hŒadvice”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hj^ubhŒ2 - Information about how the cookie is to be used.”…”�”}”(hj^h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÜhjZubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hjubj®)�”}”(hŒo``key_hash`` - A hash of the index key. This should work out the same, no matter the cpu arch and endianness. ”h]”hÞ)�”}”(hŒn``key_hash`` - A hash of the index key. This should work out the same, no matter the cpu arch and endianness.”h]”(j¥)�”}”(hŒ ``key_hash``”h]”hŒkey_hash”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hj„ubhŒb - A hash of the index key. This should work out the same, no matter the cpu arch and endianness.”…”�”}”(hj„h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÞhj€ubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hjubj®)�”}”(hŒ+``key_len`` - The length of the index key. ”h]”hÞ)�”}”(hŒ*``key_len`` - The length of the index key.”h]”(j¥)�”}”(hŒ ``key_len``”h]”hŒkey_len”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjªubhŒ - The length of the index key.”…”�”}”(hjªh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Káhj¦ubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hjubj®)�”}”(hŒ7``aux_len`` - The length of the coherency data buffer. ”h]”hÞ)�”}”(hŒ6``aux_len`` - The length of the coherency data buffer.”h]”(j¥)�”}”(hŒ ``aux_len``”h]”hŒaux_len”…”�”}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjÐubhŒ+ - The length of the coherency data buffer.”…”�”}”(hjÐh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KãhjÌubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hjubeh}”(h]”h ]”h"]”h$]”h&]”j¿jÀuh1j¨h³hÇh´KÂhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´KÂhjÏh²hubhÞ)�”}”(hŒ„Each cookie has an index key, which may be stored inline to the cookie or elsewhere. A pointer to this can be obtained by calling::”h]”hŒƒEach cookie has an index key, which may be stored inline to the cookie or elsewhere. A pointer to this can be obtained by calling:”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KåhjÏh²hubhî)�”}”(hŒ5void *fscache_get_key(struct fscache_cookie *cookie);”h]”hŒ5void *fscache_get_key(struct fscache_cookie *cookie);”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´KèhjÏh²hubhÞ)�”}”(hŒ]The index key is a binary blob, the storage for which is padded out to a multiple of 4 bytes.”h]”hŒ]The index key is a binary blob, the storage for which is padded out to a multiple of 4 bytes.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KêhjÏh²hubhÞ)�”}”(hŒ�Each cookie also has a buffer for coherency data. This may also be inline or detached from the cookie and a pointer is obtained by calling::”h]”hŒŒEach cookie also has a buffer for coherency data. This may also be inline or detached from the cookie and a pointer is obtained by calling:”…”�”}”(hj(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KíhjÏh²hubhî)�”}”(hŒ5void *fscache_get_aux(struct fscache_cookie *cookie);”h]”hŒ5void *fscache_get_aux(struct fscache_cookie *cookie);”…”�”}”hj6sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´KðhjÏh²hubeh}”(h]”Œdata-storage-cookies”ah ]”h"]”Œdata storage cookies”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K¬ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒCookie Accounting”h]”hŒCookie Accounting”…”�”}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjLh²hh³hÇh´KõubhÞ)�”}”(hŒÄData storage cookies are counted and this is used to block cache withdrawal completion until all objects have been destroyed. The following functions are provided to the cache to deal with that::”h]”hŒÃData storage cookies are counted and this is used to block cache withdrawal completion until all objects have been destroyed. The following functions are provided to the cache to deal with that:”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K÷hjLh²hubhî)�”}”(hŒ­void fscache_count_object(struct fscache_cache *cache); void fscache_uncount_object(struct fscache_cache *cache); void fscache_wait_for_objects(struct fscache_cache *cache);”h]”hŒ­void fscache_count_object(struct fscache_cache *cache); void fscache_uncount_object(struct fscache_cache *cache); void fscache_wait_for_objects(struct fscache_cache *cache);”…”�”}”hjksbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´KûhjLh²hubhÞ)�”}”(hŒÊThe count function records the allocation of an object in a cache and the uncount function records its destruction. Warning: by the time the uncount function returns, the cache may have been destroyed.”h]”hŒÊThe count function records the allocation of an object in a cache and the uncount function records its destruction. Warning: by the time the uncount function returns, the cache may have been destroyed.”…”�”}”(hjyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÿhjLh²hubhÞ)�”}”(hŒñThe wait function can be used during the withdrawal procedure to wait for fscache to finish withdrawing all the objects in the cache. When it completes, there will be no remaining objects referring to the cache object or any volume objects.”h]”hŒñThe wait function can be used during the withdrawal procedure to wait for fscache to finish withdrawing all the objects in the cache. When it completes, there will be no remaining objects referring to the cache object or any volume objects.”…”�”}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MhjLh²hubeh}”(h]”Œcookie-accounting”ah ]”h"]”Œcookie accounting”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KõubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒCache Management API”h]”hŒCache Management API”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj�h²hh³hÇh´M ubhÞ)�”}”(hŒ¾The cache backend implements the cache management API by providing a table of operations that fscache can use to manage various aspects of the cache. These are held in a structure of type::”h]”hŒ½The cache backend implements the cache management API by providing a table of operations that fscache can use to manage various aspects of the cache. These are held in a structure of type:”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M hj�h²hubhî)�”}”(hŒCstruct fscache_cache_ops { const char *name; ... };”h]”hŒCstruct fscache_cache_ops { const char *name; ... };”…”�”}”hj¼sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´Mhj�h²hubhÞ)�”}”(hŒ•This contains a printable name for the cache backend driver plus a number of pointers to methods to allow fscache to request management of the cache:”h]”hŒ•This contains a printable name for the cache backend driver plus a number of pointers to methods to allow fscache to request management of the cache:”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mhj�h²hubj)�”}”(hX&* Set up a volume cookie [optional]:: void (*acquire_volume)(struct fscache_volume *volume); This method is called when a volume cookie is being created. The caller holds a cache-level access pin to prevent the cache from going away for the duration. This method should set up the resources to access a volume in the cache and should not return until it has done so. If successful, it can set ``cache_priv`` to its own data. * Clean up volume cookie [optional]:: void (*free_volume)(struct fscache_volume *volume); This method is called when a volume cookie is being released if ``cache_priv`` is set. * Look up a cookie in the cache [mandatory]:: bool (*lookup_cookie)(struct fscache_cookie *cookie); This method is called to look up/create the resources needed to access the data storage for a cookie. It is called from a worker thread with a volume-level access pin in the cache to prevent it from being withdrawn. True should be returned if successful and false otherwise. If false is returned, the withdraw_cookie op (see below) will be called. If lookup fails, but the object could still be created (e.g. it hasn't been cached before), then:: void fscache_cookie_lookup_negative( struct fscache_cookie *cookie); can be called to let the network filesystem proceed and start downloading stuff whilst the cache backend gets on with the job of creating things. If successful, ``cookie->cache_priv`` can be set. * Withdraw an object without any cookie access counts held [mandatory]:: void (*withdraw_cookie)(struct fscache_cookie *cookie); This method is called to withdraw a cookie from service. It will be called when the cookie is relinquished by the netfs, withdrawn or culled by the cache backend or closed after a period of non-use by fscache. The caller doesn't hold any access pins, but it is called from a non-reentrant work item to manage races between the various ways withdrawal can occur. The cookie will have the ``FSCACHE_COOKIE_RETIRED`` flag set on it if the associated data is to be removed from the cache. * Change the size of a data storage object [mandatory]:: void (*resize_cookie)(struct netfs_cache_resources *cres, loff_t new_size); This method is called to inform the cache backend of a change in size of the netfs file due to local truncation. The cache backend should make all of the changes it needs to make before returning as this is done under the netfs inode mutex. The caller holds a cookie-level access pin to prevent a race with withdrawal and the netfs must have the cookie marked in-use to prevent garbage collection or culling from removing any resources. * Invalidate a data storage object [mandatory]:: bool (*invalidate_cookie)(struct fscache_cookie *cookie); This is called when the network filesystem detects a third-party modification or when an O_DIRECT write is made locally. This requests that the cache backend should throw away all the data in the cache for this object and start afresh. It should return true if successful and false otherwise. On entry, new I O/operations are blocked. Once the cache is in a position to accept I/O again, the backend should release the block by calling:: void fscache_resume_after_invalidation(struct fscache_cookie *cookie); If the method returns false, caching will be withdrawn for this cookie. * Prepare to make local modifications to the cache [mandatory]:: void (*prepare_to_write)(struct fscache_cookie *cookie); This method is called when the network filesystem finds that it is going to need to modify the contents of the cache due to local writes or truncations. This gives the cache a chance to note that a cache object may be incoherent with respect to the server and may need writing back later. This may also cause the cached data to be scrapped on later rebinding if not properly committed. * Begin an operation for the netfs lib [mandatory]:: bool (*begin_operation)(struct netfs_cache_resources *cres, enum fscache_want_state want_state); This method is called when an I/O operation is being set up (read, write or resize). The caller holds an access pin on the cookie and must have marked the cookie as in-use. If it can, the backend should attach any resources it needs to keep around to the netfs_cache_resources object and return true. If it can't complete the setup, it should return false. The want_state parameter indicates the state the caller needs the cache object to be in and what it wants to do during the operation: * ``FSCACHE_WANT_PARAMS`` - The caller just wants to access cache object parameters; it doesn't need to do data I/O yet. * ``FSCACHE_WANT_READ`` - The caller wants to read data. * ``FSCACHE_WANT_WRITE`` - The caller wants to write to or resize the cache object. Note that there won't necessarily be anything attached to the cookie's cache_priv yet if the cookie is still being created. ”h]”j©)�”}”(hhh]”(j®)�”}”(hX°Set up a volume cookie [optional]:: void (*acquire_volume)(struct fscache_volume *volume); This method is called when a volume cookie is being created. The caller holds a cache-level access pin to prevent the cache from going away for the duration. This method should set up the resources to access a volume in the cache and should not return until it has done so. If successful, it can set ``cache_priv`` to its own data. ”h]”(hÞ)�”}”(hŒ#Set up a volume cookie [optional]::”h]”hŒ"Set up a volume cookie [optional]:”…”�”}”(hjãh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mhjßubhî)�”}”(hŒ6void (*acquire_volume)(struct fscache_volume *volume);”h]”hŒ6void (*acquire_volume)(struct fscache_volume *volume);”…”�”}”hjñsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´MhjßubhÞ)�”}”(hXThis method is called when a volume cookie is being created. The caller holds a cache-level access pin to prevent the cache from going away for the duration. This method should set up the resources to access a volume in the cache and should not return until it has done so.”h]”hXThis method is called when a volume cookie is being created. The caller holds a cache-level access pin to prevent the cache from going away for the duration. This method should set up the resources to access a volume in the cache and should not return until it has done so.”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MhjßubhÞ)�”}”(hŒ9If successful, it can set ``cache_priv`` to its own data.”h]”(hŒIf successful, it can set ”…”�”}”(hj h²hh³Nh´Nubj¥)�”}”(hŒ``cache_priv``”h]”hŒ cache_priv”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hj ubhŒ to its own data.”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M!hjßubeh}”(h]”h ]”h"]”h$]”h&]”uh1j­hjÜubj®)�”}”(hŒ´Clean up volume cookie [optional]:: void (*free_volume)(struct fscache_volume *volume); This method is called when a volume cookie is being released if ``cache_priv`` is set. ”h]”(hÞ)�”}”(hŒ#Clean up volume cookie [optional]::”h]”hŒ"Clean up volume cookie [optional]:”…”�”}”(hj7 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M$hj3 ubhî)�”}”(hŒ3void (*free_volume)(struct fscache_volume *volume);”h]”hŒ3void (*free_volume)(struct fscache_volume *volume);”…”�”}”hjE sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´M&hj3 ubhÞ)�”}”(hŒVThis method is called when a volume cookie is being released if ``cache_priv`` is set.”h]”(hŒ@This method is called when a volume cookie is being released if ”…”�”}”(hjS h²hh³Nh´Nubj¥)�”}”(hŒ``cache_priv``”h]”hŒ cache_priv”…”�”}”(hj[ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjS ubhŒ is set.”…”�”}”(hjS h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M(hj3 ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j­hjÜubj®)�”}”(hXULook up a cookie in the cache [mandatory]:: bool (*lookup_cookie)(struct fscache_cookie *cookie); This method is called to look up/create the resources needed to access the data storage for a cookie. It is called from a worker thread with a volume-level access pin in the cache to prevent it from being withdrawn. True should be returned if successful and false otherwise. If false is returned, the withdraw_cookie op (see below) will be called. If lookup fails, but the object could still be created (e.g. it hasn't been cached before), then:: void fscache_cookie_lookup_negative( struct fscache_cookie *cookie); can be called to let the network filesystem proceed and start downloading stuff whilst the cache backend gets on with the job of creating things. If successful, ``cookie->cache_priv`` can be set. ”h]”(hÞ)�”}”(hŒ+Look up a cookie in the cache [mandatory]::”h]”hŒ*Look up a cookie in the cache [mandatory]:”…”�”}”(hj} h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M,hjy ubhî)�”}”(hŒ5bool (*lookup_cookie)(struct fscache_cookie *cookie);”h]”hŒ5bool (*lookup_cookie)(struct fscache_cookie *cookie);”…”�”}”hj‹ sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´M.hjy ubhÞ)�”}”(hŒØThis method is called to look up/create the resources needed to access the data storage for a cookie. It is called from a worker thread with a volume-level access pin in the cache to prevent it from being withdrawn.”h]”hŒØThis method is called to look up/create the resources needed to access the data storage for a cookie. It is called from a worker thread with a volume-level access pin in the cache to prevent it from being withdrawn.”…”�”}”(hj™ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M0hjy ubhÞ)�”}”(hŒ„True should be returned if successful and false otherwise. If false is returned, the withdraw_cookie op (see below) will be called.”h]”hŒ„True should be returned if successful and false otherwise. If false is returned, the withdraw_cookie op (see below) will be called.”…”�”}”(hj§ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M4hjy ubhÞ)�”}”(hŒbIf lookup fails, but the object could still be created (e.g. it hasn't been cached before), then::”h]”hŒcIf lookup fails, but the object could still be created (e.g. it hasn’t been cached before), then:”…”�”}”(hjµ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M7hjy ubhî)�”}”(hŒLvoid fscache_cookie_lookup_negative( struct fscache_cookie *cookie);”h]”hŒLvoid fscache_cookie_lookup_negative( struct fscache_cookie *cookie);”…”�”}”hjà sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´M:hjy ubhÞ)�”}”(hŒ‘can be called to let the network filesystem proceed and start downloading stuff whilst the cache backend gets on with the job of creating things.”h]”hŒ‘can be called to let the network filesystem proceed and start downloading stuff whilst the cache backend gets on with the job of creating things.”…”�”}”(hjÑ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M=hjy ubhÞ)�”}”(hŒ1If successful, ``cookie->cache_priv`` can be set.”h]”(hŒIf successful, ”…”�”}”(hjß h²hh³Nh´Nubj¥)�”}”(hŒ``cookie->cache_priv``”h]”hŒcookie->cache_priv”…”�”}”(hjç h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjß ubhŒ can be set.”…”�”}”(hjß h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M@hjy ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j­hjÜubj®)�”}”(hXmWithdraw an object without any cookie access counts held [mandatory]:: void (*withdraw_cookie)(struct fscache_cookie *cookie); This method is called to withdraw a cookie from service. It will be called when the cookie is relinquished by the netfs, withdrawn or culled by the cache backend or closed after a period of non-use by fscache. The caller doesn't hold any access pins, but it is called from a non-reentrant work item to manage races between the various ways withdrawal can occur. The cookie will have the ``FSCACHE_COOKIE_RETIRED`` flag set on it if the associated data is to be removed from the cache. ”h]”(hÞ)�”}”(hŒFWithdraw an object without any cookie access counts held [mandatory]::”h]”hŒEWithdraw an object without any cookie access counts held [mandatory]:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MChj ubhî)�”}”(hŒ7void (*withdraw_cookie)(struct fscache_cookie *cookie);”h]”hŒ7void (*withdraw_cookie)(struct fscache_cookie *cookie);”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´MEhj ubhÞ)�”}”(hŒÒThis method is called to withdraw a cookie from service. It will be called when the cookie is relinquished by the netfs, withdrawn or culled by the cache backend or closed after a period of non-use by fscache.”h]”hŒÒThis method is called to withdraw a cookie from service. It will be called when the cookie is relinquished by the netfs, withdrawn or culled by the cache backend or closed after a period of non-use by fscache.”…”�”}”(hj% h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MGhj ubhÞ)�”}”(hŒ—The caller doesn't hold any access pins, but it is called from a non-reentrant work item to manage races between the various ways withdrawal can occur.”h]”hŒ™The caller doesn’t hold any access pins, but it is called from a non-reentrant work item to manage races between the various ways withdrawal can occur.”…”�”}”(hj3 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MKhj ubhÞ)�”}”(hŒzThe cookie will have the ``FSCACHE_COOKIE_RETIRED`` flag set on it if the associated data is to be removed from the cache.”h]”(hŒThe cookie will have the ”…”�”}”(hjA h²hh³Nh´Nubj¥)�”}”(hŒ``FSCACHE_COOKIE_RETIRED``”h]”hŒFSCACHE_COOKIE_RETIRED”…”�”}”(hjI h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjA ubhŒG flag set on it if the associated data is to be removed from the cache.”…”�”}”(hjA h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MOhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j­hjÜubj®)�”}”(hXYChange the size of a data storage object [mandatory]:: void (*resize_cookie)(struct netfs_cache_resources *cres, loff_t new_size); This method is called to inform the cache backend of a change in size of the netfs file due to local truncation. The cache backend should make all of the changes it needs to make before returning as this is done under the netfs inode mutex. The caller holds a cookie-level access pin to prevent a race with withdrawal and the netfs must have the cookie marked in-use to prevent garbage collection or culling from removing any resources. ”h]”(hÞ)�”}”(hŒ6Change the size of a data storage object [mandatory]::”h]”hŒ5Change the size of a data storage object [mandatory]:”…”�”}”(hjk h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MShjg ubhî)�”}”(hŒavoid (*resize_cookie)(struct netfs_cache_resources *cres, loff_t new_size);”h]”hŒavoid (*resize_cookie)(struct netfs_cache_resources *cres, loff_t new_size);”…”�”}”hjy sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´MUhjg ubhÞ)�”}”(hŒñThis method is called to inform the cache backend of a change in size of the netfs file due to local truncation. The cache backend should make all of the changes it needs to make before returning as this is done under the netfs inode mutex.”h]”hŒñThis method is called to inform the cache backend of a change in size of the netfs file due to local truncation. The cache backend should make all of the changes it needs to make before returning as this is done under the netfs inode mutex.”…”�”}”(hj‡ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MXhjg ubhÞ)�”}”(hŒÃThe caller holds a cookie-level access pin to prevent a race with withdrawal and the netfs must have the cookie marked in-use to prevent garbage collection or culling from removing any resources.”h]”hŒÃThe caller holds a cookie-level access pin to prevent a race with withdrawal and the netfs must have the cookie marked in-use to prevent garbage collection or culling from removing any resources.”…”�”}”(hj• h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M]hjg ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j­hjÜubj®)�”}”(hX½Invalidate a data storage object [mandatory]:: bool (*invalidate_cookie)(struct fscache_cookie *cookie); This is called when the network filesystem detects a third-party modification or when an O_DIRECT write is made locally. This requests that the cache backend should throw away all the data in the cache for this object and start afresh. It should return true if successful and false otherwise. On entry, new I O/operations are blocked. Once the cache is in a position to accept I/O again, the backend should release the block by calling:: void fscache_resume_after_invalidation(struct fscache_cookie *cookie); If the method returns false, caching will be withdrawn for this cookie. ”h]”(hÞ)�”}”(hŒ.Invalidate a data storage object [mandatory]::”h]”hŒ-Invalidate a data storage object [mandatory]:”…”�”}”(hj­ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mbhj© ubhî)�”}”(hŒ9bool (*invalidate_cookie)(struct fscache_cookie *cookie);”h]”hŒ9bool (*invalidate_cookie)(struct fscache_cookie *cookie);”…”�”}”hj» sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´Mdhj© ubhÞ)�”}”(hX&This is called when the network filesystem detects a third-party modification or when an O_DIRECT write is made locally. This requests that the cache backend should throw away all the data in the cache for this object and start afresh. It should return true if successful and false otherwise.”h]”hX&This is called when the network filesystem detects a third-party modification or when an O_DIRECT write is made locally. This requests that the cache backend should throw away all the data in the cache for this object and start afresh. It should return true if successful and false otherwise.”…”�”}”(hjÉ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mfhj© ubhÞ)�”}”(hŒ‘On entry, new I O/operations are blocked. Once the cache is in a position to accept I/O again, the backend should release the block by calling::”h]”hŒ�On entry, new I O/operations are blocked. Once the cache is in a position to accept I/O again, the backend should release the block by calling:”…”�”}”(hj× h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mlhj© ubhî)�”}”(hŒFvoid fscache_resume_after_invalidation(struct fscache_cookie *cookie);”h]”hŒFvoid fscache_resume_after_invalidation(struct fscache_cookie *cookie);”…”�”}”hjå sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´Mohj© ubhÞ)�”}”(hŒGIf the method returns false, caching will be withdrawn for this cookie.”h]”hŒGIf the method returns false, caching will be withdrawn for this cookie.”…”�”}”(hjó h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mqhj© ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j­hjÜubj®)�”}”(hXPrepare to make local modifications to the cache [mandatory]:: void (*prepare_to_write)(struct fscache_cookie *cookie); This method is called when the network filesystem finds that it is going to need to modify the contents of the cache due to local writes or truncations. This gives the cache a chance to note that a cache object may be incoherent with respect to the server and may need writing back later. This may also cause the cached data to be scrapped on later rebinding if not properly committed. ”h]”(hÞ)�”}”(hŒ>Prepare to make local modifications to the cache [mandatory]::”h]”hŒ=Prepare to make local modifications to the cache [mandatory]:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mthj ubhî)�”}”(hŒ8void (*prepare_to_write)(struct fscache_cookie *cookie);”h]”hŒ8void (*prepare_to_write)(struct fscache_cookie *cookie);”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´Mvhj ubhÞ)�”}”(hXƒThis method is called when the network filesystem finds that it is going to need to modify the contents of the cache due to local writes or truncations. This gives the cache a chance to note that a cache object may be incoherent with respect to the server and may need writing back later. This may also cause the cached data to be scrapped on later rebinding if not properly committed.”h]”hXƒThis method is called when the network filesystem finds that it is going to need to modify the contents of the cache due to local writes or truncations. This gives the cache a chance to note that a cache object may be incoherent with respect to the server and may need writing back later. This may also cause the cached data to be scrapped on later rebinding if not properly committed.”…”�”}”(hj' h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mxhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j­hjÜubj®)�”}”(hX=Begin an operation for the netfs lib [mandatory]:: bool (*begin_operation)(struct netfs_cache_resources *cres, enum fscache_want_state want_state); This method is called when an I/O operation is being set up (read, write or resize). The caller holds an access pin on the cookie and must have marked the cookie as in-use. If it can, the backend should attach any resources it needs to keep around to the netfs_cache_resources object and return true. If it can't complete the setup, it should return false. The want_state parameter indicates the state the caller needs the cache object to be in and what it wants to do during the operation: * ``FSCACHE_WANT_PARAMS`` - The caller just wants to access cache object parameters; it doesn't need to do data I/O yet. * ``FSCACHE_WANT_READ`` - The caller wants to read data. * ``FSCACHE_WANT_WRITE`` - The caller wants to write to or resize the cache object. Note that there won't necessarily be anything attached to the cookie's cache_priv yet if the cookie is still being created. ”h]”(hÞ)�”}”(hŒ2Begin an operation for the netfs lib [mandatory]::”h]”hŒ1Begin an operation for the netfs lib [mandatory]:”…”�”}”(hj? h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M€hj; ubhî)�”}”(hŒxbool (*begin_operation)(struct netfs_cache_resources *cres, enum fscache_want_state want_state);”h]”hŒxbool (*begin_operation)(struct netfs_cache_resources *cres, enum fscache_want_state want_state);”…”�”}”hjM sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´M‚hj; ubhÞ)�”}”(hŒ­This method is called when an I/O operation is being set up (read, write or resize). The caller holds an access pin on the cookie and must have marked the cookie as in-use.”h]”hŒ­This method is called when an I/O operation is being set up (read, write or resize). The caller holds an access pin on the cookie and must have marked the cookie as in-use.”…”�”}”(hj[ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M…hj; ubhÞ)�”}”(hŒIf it can, the backend should attach any resources it needs to keep around to the netfs_cache_resources object and return true.”h]”hŒIf it can, the backend should attach any resources it needs to keep around to the netfs_cache_resources object and return true.”…”�”}”(hji h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M‰hj; ubhÞ)�”}”(hŒ7If it can't complete the setup, it should return false.”h]”hŒ9If it can’t complete the setup, it should return false.”…”�”}”(hjw h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MŒhj; ubhÞ)�”}”(hŒ…The want_state parameter indicates the state the caller needs the cache object to be in and what it wants to do during the operation:”h]”hŒ…The want_state parameter indicates the state the caller needs the cache object to be in and what it wants to do during the operation:”…”�”}”(hj… h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MŽhj; ubj)�”}”(hX * ``FSCACHE_WANT_PARAMS`` - The caller just wants to access cache object parameters; it doesn't need to do data I/O yet. * ``FSCACHE_WANT_READ`` - The caller wants to read data. * ``FSCACHE_WANT_WRITE`` - The caller wants to write to or resize the cache object. ”h]”j©)�”}”(hhh]”(j®)�”}”(hŒw``FSCACHE_WANT_PARAMS`` - The caller just wants to access cache object parameters; it doesn't need to do data I/O yet. ”h]”hÞ)�”}”(hŒv``FSCACHE_WANT_PARAMS`` - The caller just wants to access cache object parameters; it doesn't need to do data I/O yet.”h]”(j¥)�”}”(hŒ``FSCACHE_WANT_PARAMS``”h]”hŒFSCACHE_WANT_PARAMS”…”�”}”(hj¢ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjž ubhŒa - The caller just wants to access cache object parameters; it doesn’t need to do data I/O yet.”…”�”}”(hjž h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M‘hjš ubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hj— ubj®)�”}”(hŒ7``FSCACHE_WANT_READ`` - The caller wants to read data. ”h]”hÞ)�”}”(hŒ6``FSCACHE_WANT_READ`` - The caller wants to read data.”h]”(j¥)�”}”(hŒ``FSCACHE_WANT_READ``”h]”hŒFSCACHE_WANT_READ”…”�”}”(hjÈ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjÄ ubhŒ! - The caller wants to read data.”…”�”}”(hjÄ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M”hjÀ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hj— ubj®)�”}”(hŒR``FSCACHE_WANT_WRITE`` - The caller wants to write to or resize the cache object. ”h]”hÞ)�”}”(hŒQ``FSCACHE_WANT_WRITE`` - The caller wants to write to or resize the cache object.”h]”(j¥)�”}”(hŒ``FSCACHE_WANT_WRITE``”h]”hŒFSCACHE_WANT_WRITE”…”�”}”(hjî h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤•W•hjê ubhŒ; - The caller wants to write to or resize the cache object.”…”�”}”(hjê h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M–hjæ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j­hj— ubeh}”(h]”h ]”h"]”h$]”h&]”j¿jÀuh1j¨h³hÇh´M‘hj“ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´M‘hj; ubhÞ)�”}”(hŒ{Note that there won't necessarily be anything attached to the cookie's cache_priv yet if the cookie is still being created.”h]”hŒNote that there won’t necessarily be anything attached to the cookie’s cache_priv yet if the cookie is still being created.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M™hj; ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j­hjÜubeh}”(h]”h ]”h"]”h$]”h&]”j¿jÀuh1j¨h³hÇh´MhjØubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´Mhj�h²hubeh}”(h]”Œcache-management-api”ah ]”h"]”Œcache management api”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´M ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Data I/O API”h]”hŒ Data I/O API”…”�”}”(hjC h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj@ h²hh³hÇh´MžubhÞ)�”}”(hŒÃA cache backend provides a data I/O API by through the netfs library's ``struct netfs_cache_ops`` attached to a ``struct netfs_cache_resources`` by the ``begin_operation`` method described above.”h]”(hŒIA cache backend provides a data I/O API by through the netfs library’s ”…”�”}”(hjQ h²hh³Nh´Nubj¥)�”}”(hŒ``struct netfs_cache_ops``”h]”hŒstruct netfs_cache_ops”…”�”}”(hjY h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjQ ubhŒ attached to a ”…”�”}”(hjQ h²hh³Nh´Nubj¥)�”}”(hŒ ``struct netfs_cache_resources``”h]”hŒstruct netfs_cache_resources”…”�”}”(hjk h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjQ ubhŒ by the ”…”�”}”(hjQ h²hh³Nh´Nubj¥)�”}”(hŒ``begin_operation``”h]”hŒbegin_operation”…”�”}”(hj} h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjQ ubhŒ method described above.”…”�”}”(hjQ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M hj@ h²hubhÞ)�”}”(hŒFSee the Documentation/filesystems/netfs_library.rst for a description.”h]”hŒFSee the Documentation/filesystems/netfs_library.rst for a description.”…”�”}”(hj• h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M¤hj@ h²hubeh}”(h]”Œ data-i-o-api”ah ]”h"]”Œ data i/o api”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´MžubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒMiscellaneous Functions”h]”hŒMiscellaneous Functions”…”�”}”(hj® h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj« h²hh³hÇh´M¨ubhÞ)�”}”(hŒFFS-Cache provides some utilities that a cache backend may make use of:”h]”hŒFFS-Cache provides some utilities that a cache backend may make use of:”…”�”}”(hj¼ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mªhj« h²hubj)�”}”(hXé* Note occurrence of an I/O error in a cache:: void fscache_io_error(struct fscache_cache *cache); This tells FS-Cache that an I/O error occurred in the cache. This prevents any new I/O from being started on the cache. This does not actually withdraw the cache. That must be done separately. * Note cessation of caching on a cookie due to failure:: void fscache_caching_failed(struct fscache_cookie *cookie); This notes that a the caching that was being done on a cookie failed in some way, for instance the backing storage failed to be created or invalidation failed and that no further I/O operations should take place on it until the cache is reset. * Count I/O requests:: void fscache_count_read(void); void fscache_count_write(void); These record reads and writes from/to the cache. The numbers are displayed in /proc/fs/fscache/stats. * Count out-of-space errors:: void fscache_count_no_write_space(void); void fscache_count_no_create_space(void); These record ENOSPC errors in the cache, divided into failures of data writes and failures of filesystem object creations (e.g. mkdir). * Count objects culled:: void fscache_count_culled(void); This records the culling of an object. * Get the cookie from a set of cache resources:: struct fscache_cookie *fscache_cres_cookie(struct netfs_cache_resources *cres) Pull a pointer to the cookie from the cache resources. This may return a NULL cookie if no cookie was set. ”h]”j©)�”}”(hhh]”(j®)�”}”(hX*Note occurrence of an I/O error in a cache:: void fscache_io_error(struct fscache_cache *cache); This tells FS-Cache that an I/O error occurred in the cache. This prevents any new I/O from being started on the cache. This does not actually withdraw the cache. That must be done separately. ”h]”(hÞ)�”}”(hŒ,Note occurrence of an I/O error in a cache::”h]”hŒ+Note occurrence of an I/O error in a cache:”…”�”}”(hjÕ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M¬hjÑ ubhî)�”}”(hŒ3void fscache_io_error(struct fscache_cache *cache);”h]”hŒ3void fscache_io_error(struct fscache_cache *cache);”…”�”}”hjã sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´M®hjÑ ubhÞ)�”}”(hŒxThis tells FS-Cache that an I/O error occurred in the cache. This prevents any new I/O from being started on the cache.”h]”hŒxThis tells FS-Cache that an I/O error occurred in the cache. This prevents any new I/O from being started on the cache.”…”�”}”(hjñ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M°hjÑ ubhÞ)�”}”(hŒIThis does not actually withdraw the cache. That must be done separately.”h]”hŒIThis does not actually withdraw the cache. That must be done separately.”…”�”}”(hjÿ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M³hjÑ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j­hjÎ ubj®)�”}”(hXlNote cessation of caching on a cookie due to failure:: void fscache_caching_failed(struct fscache_cookie *cookie); This notes that a the caching that was being done on a cookie failed in some way, for instance the backing storage failed to be created or invalidation failed and that no further I/O operations should take place on it until the cache is reset. ”h]”(hÞ)�”}”(hŒ6Note cessation of caching on a cookie due to failure::”h]”hŒ5Note cessation of caching on a cookie due to failure:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mµhj ubhî)�”}”(hŒ;void fscache_caching_failed(struct fscache_cookie *cookie);”h]”hŒ;void fscache_caching_failed(struct fscache_cookie *cookie);”…”�”}”hj% sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´M·hj ubhÞ)�”}”(hŒóThis notes that a the caching that was being done on a cookie failed in some way, for instance the backing storage failed to be created or invalidation failed and that no further I/O operations should take place on it until the cache is reset.”h]”hŒóThis notes that a the caching that was being done on a cookie failed in some way, for instance the backing storage failed to be created or invalidation failed and that no further I/O operations should take place on it until the cache is reset.”…”�”}”(hj3 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M¹hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j­hjÎ ubj®)�”}”(hŒÃCount I/O requests:: void fscache_count_read(void); void fscache_count_write(void); These record reads and writes from/to the cache. The numbers are displayed in /proc/fs/fscache/stats. ”h]”(hÞ)�”}”(hŒCount I/O requests::”h]”hŒCount I/O requests:”…”�”}”(hjK h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M¾hjG ubhî)�”}”(hŒ>void fscache_count_read(void); void fscache_count_write(void);”h]”hŒ>void fscache_count_read(void); void fscache_count_write(void);”…”�”}”hjY sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´MÀhjG ubhÞ)�”}”(hŒfThese record reads and writes from/to the cache. The numbers are displayed in /proc/fs/fscache/stats.”h]”hŒfThese record reads and writes from/to the cache. The numbers are displayed in /proc/fs/fscache/stats.”…”�”}”(hjg h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MÃhjG ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j­hjÎ ubj®)�”}”(hŒÿCount out-of-space errors:: void fscache_count_no_write_space(void); void fscache_count_no_create_space(void); These record ENOSPC errors in the cache, divided into failures of data writes and failures of filesystem object creations (e.g. mkdir). ”h]”(hÞ)�”}”(hŒCount out-of-space errors::”h]”hŒCount out-of-space errors:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MÆhj{ ubhî)�”}”(hŒRvoid fscache_count_no_write_space(void); void fscache_count_no_create_space(void);”h]”hŒRvoid fscache_count_no_write_space(void); void fscache_count_no_create_space(void);”…”�”}”hj� sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´MÈhj{ ubhÞ)�”}”(hŒ‡These record ENOSPC errors in the cache, divided into failures of data writes and failures of filesystem object creations (e.g. mkdir).”h]”hŒ‡These record ENOSPC errors in the cache, divided into failures of data writes and failures of filesystem object creations (e.g. mkdir).”…”�”}”(hj› h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MËhj{ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j­hjÎ ubj®)�”}”(hŒdCount objects culled:: void fscache_count_culled(void); This records the culling of an object. ”h]”(hÞ)�”}”(hŒCount objects culled::”h]”hŒCount objects culled:”…”�”}”(hj³ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MÎhj¯ ubhî)�”}”(hŒ void fscache_count_culled(void);”h]”hŒ void fscache_count_culled(void);”…”�”}”hjÁ sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´MÐhj¯ ubhÞ)�”}”(hŒ&This records the culling of an object.”h]”hŒ&This records the culling of an object.”…”�”}”(hjÏ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MÒhj¯ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j­hjÎ ubj®)�”}”(hŒðGet the cookie from a set of cache resources:: struct fscache_cookie *fscache_cres_cookie(struct netfs_cache_resources *cres) Pull a pointer to the cookie from the cache resources. This may return a NULL cookie if no cookie was set. ”h]”(hÞ)�”}”(hŒ.Get the cookie from a set of cache resources::”h]”hŒ-Get the cookie from a set of cache resources:”…”�”}”(hjç h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MÔhjã ubhî)�”}”(hŒNstruct fscache_cookie *fscache_cres_cookie(struct netfs_cache_resources *cres)”h]”hŒNstruct fscache_cookie *fscache_cres_cookie(struct netfs_cache_resources *cres)”…”�”}”hjõ sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1híh³hÇh´MÖhjã ubhÞ)�”}”(hŒkPull a pointer to the cookie from the cache resources. This may return a NULL cookie if no cookie was set.”h]”hŒkPull a pointer to the cookie from the cache resources. This may return a NULL cookie if no cookie was set.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MØhjã ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j­hjÎ ubeh}”(h]”h ]”h"]”h$]”h&]”j¿jÀuh1j¨h³hÇh´M¬hjÊ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´M¬hj« h²hubeh}”(h]”Œmiscellaneous-functions”ah ]”h"]”Œmiscellaneous functions”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´M¨ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒAPI Function Reference”h]”hŒAPI Function Reference”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj+h²hh³hÇh´MÝubhŒindex”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(Œsingle”Œ!fscache_cookie_state (C function)”Œc.fscache_cookie_state”hNt”auh1j<hj+h²hh³Nh´NubhŒdesc”“”)�”}”(hhh]”(hŒdesc_signature”“”)�”}”(hŒNenum fscache_cookie_state fscache_cookie_state (struct fscache_cookie *cookie)”h]”hŒdesc_signature_line”“”)�”}”(hŒMenum fscache_cookie_state fscache_cookie_state(struct fscache_cookie *cookie)”h]”(hŒdesc_sig_keyword”“”)�”}”(hŒenum”h]”hŒenum”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”Œk”ah"]”h$]”h&]”uh1j^hjZh²hh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´K{ubhŒdesc_sig_space”“”)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”Œw”ah"]”h$]”h&]”uh1jphjZh²hh³joh´K{ubh)�”}”(hhh]”hŒ desc_sig_name”“”)�”}”(hŒfscache_cookie_state”h]”hŒfscache_cookie_state”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”Œn”ah"]”h$]”h&]”uh1j„hj�ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”Œc”Œreftype”Œ identifier”Œ reftarget”jˆŒmodname”NŒ classname”NŒ c:parent_key”Œsphinx.domains.c”Œ LookupKey”“”)�”}”Œdata”]”j£Œ ASTIdentifier”“”)�”}”jžŒfscache_cookie_state”sbŒc.fscache_cookie_state”†”asbuh1hhjZh²hh³joh´K{ubjq)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”j}ah"]”h$]”h&]”uh1jphjZh²hh³joh´K{ubhŒ desc_name”“”)�”}”(hŒfscache_cookie_state”h]”j…)�”}”(hj®h]”hŒfscache_cookie_state”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”j‘ah"]”h$]”h&]”uh1j„hjÁubah}”(h]”h ]”(Œsig-name”Œdescname”eh"]”h$]”h&]”hÅhÆuh1j¿hjZh²hh³joh´K{ubhŒdesc_parameterlist”“”)�”}”(hŒ(struct fscache_cookie *cookie)”h]”hŒdesc_parameter”“”)�”}”(hŒstruct fscache_cookie *cookie”h]”(j_)�”}”(hŒstruct”h]”hŒstruct”…”�”}”(hjæh²hh³Nh´Nubah}”(h]”h ]”jkah"]”h$]”h&]”uh1j^hjâubjq)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjôh²hh³Nh´Nubah}”(h]”h ]”j}ah"]”h$]”h&]”uh1jphjâubh)�”}”(hhh]”j…)�”}”(hŒfscache_cookie”h]”hŒfscache_cookie”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j‘ah"]”h$]”h&]”uh1j„hjubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jœŒreftype”jžŒ reftarget”jŒmodname”NŒ classname”Nj¢j¥)�”}”j¨]”j¬Œc.fscache_cookie_state”†”asbuh1hhjâubjq)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”j}ah"]”h$]”h&]”uh1jphjâubhŒdesc_sig_punctuation”“”)�”}”(hjÀh]”hŒ*”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”Œp”ah"]”h$]”h&]”uh1j1hjâubj…)�”}”(hŒcookie”h]”hŒcookie”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”j‘ah"]”h$]”h&]”uh1j„hjâubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jàhjÜubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jÚhjZh²hh³joh´K{ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒ add_permalink”ˆuh1jXŒsphinx_line_type”Œ declarator”hjTh²hh³joh´K{ubah}”(h]”jKah ]”(Œsig”Œ sig-object”eh"]”h$]”h&]”Œ is_multiline”ˆŒ _toc_parts”)Œ _toc_name”huh1jRh³joh´K{hjOh²hubhŒ desc_content”“”)�”}”(hhh]”hÞ)�”}”(hŒRead the state of a cookie”h]”hŒRead the state of a cookie”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´K{hjrh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jphjOh²hh³joh´K{ubeh}”(h]”h ]”(jœŒfunction”eh"]”h$]”h&]”Œdomain”jœŒobjtype”j�Œdesctype”j�Œnoindex”‰Œ noindexentry”‰Œnocontentsentry”‰uh1jMh²hhj+h³Nh´NubhŒ container”“”)�”}”(hŒã**Parameters** ``struct fscache_cookie *cookie`` The cookie to query **Description** Get the state of a cookie, imposing an ordering between the cookie contents and the state value. Paired with fscache_set_cookie_state().”h]”(hÞ)�”}”(hŒ**Parameters**”h]”hŒstrong”“”)�”}”(hjŸh]”hŒ Parameters”…”�”}”(hj£h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¡hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´Khj™ubhŒdefinition_list”“”)�”}”(hhh]”hŒdefinition_list_item”“”)�”}”(hŒ6``struct fscache_cookie *cookie`` The cookie to query ”h]”(hŒterm”“”)�”}”(hŒ!``struct fscache_cookie *cookie``”h]”j¥)�”}”(hjÆh]”hŒstruct fscache_cookie *cookie”…”�”}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjÄubah}”(h]”h ]”h"]”h$]”h&]”uh1jÂh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´K|hj¾ubhŒ definition”“”)�”}”(hhh]”hÞ)�”}”(hŒThe cookie to query”h]”hŒThe cookie to query”…”�”}”(hjáh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³jÛh´K|hjÞubah}”(h]”h ]”h"]”h$]”h&]”uh1jÜhj¾ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¼h³jÛh´K|hj¹ubah}”(h]”h ]”h"]”h$]”h&]”uh1j·hj™ubhÞ)�”}”(hŒ**Description**”h]”j¢)�”}”(hjh]”hŒ Description”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¡hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´K~hj™ubhÞ)�”}”(hŒ‰Get the state of a cookie, imposing an ordering between the cookie contents and the state value. Paired with fscache_set_cookie_state().”h]”hŒ‰Get the state of a cookie, imposing an ordering between the cookie contents and the state value. Paired with fscache_set_cookie_state().”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´K}hj™ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j—hj+h²hh³Nh´Nubj=)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jIŒfscache_get_key (C function)”Œc.fscache_get_key”hNt”auh1j<hj+h²hh³Nh´NubjN)�”}”(hhh]”(jS)�”}”(hŒ6void * fscache_get_key (struct fscache_cookie *cookie)”h]”jY)�”}”(hŒ4void *fscache_get_key(struct fscache_cookie *cookie)”h]”(hŒdesc_sig_keyword_type”“”)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”Œkt”ah"]”h$]”h&]”uh1jHhjDh²hh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´Kˆubjq)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”h ]”j}ah"]”h$]”h&]”uh1jphjDh²hh³jYh´Kˆubj2)�”}”(hjÀh]”hŒ*”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”j=ah"]”h$]”h&]”uh1j1hjDh²hh³jYh´KˆubjÀ)�”}”(hŒfscache_get_key”h]”j…)�”}”(hŒfscache_get_key”h]”hŒfscache_get_key”…”�”}”(hjyh²hh³Nh´Nubah}”(h]”h ]”j‘ah"]”h$]”h&]”uh1j„hjuubah}”(h]”h ]”(jÕjÖeh"]”h$]”h&]”hÅhÆuh1j¿hjDh²hh³jYh´KˆubjÛ)�”}”(hŒ(struct fscache_cookie *cookie)”h]”já)�”}”(hŒstruct fscache_cookie *cookie”h]”(j_)�”}”(hjèh]”hŒstruct”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”jkah"]”h$]”h&]”uh1j^hj‘ubjq)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¢h²hh³Nh´Nubah}”(h]”h ]”j}ah"]”h$]”h&]”uh1jphj‘ubh)�”}”(hhh]”j…)�”}”(hŒfscache_cookie”h]”hŒfscache_cookie”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”j‘ah"]”h$]”h&]”uh1j„hj°ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jœŒreftype”jžŒ reftarget”jµŒmodname”NŒ classname”Nj¢j¥)�”}”j¨]”j«)�”}”jžj{sbŒc.fscache_get_key”†”asbuh1hhj‘ubjq)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”j}ah"]”h$]”h&]”uh1jphj‘ubj2)�”}”(hjÀh]”hŒ*”…”�”}”(hjáh²hh³Nh´Nubah}”(h]”h ]”j=ah"]”h$]”h&]”uh1j1hj‘ubj…)�”}”(hŒcookie”h]”hŒcookie”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”h ]”j‘ah"]”h$]”h&]”uh1j„hj‘ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jàhj�ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jÚhjDh²hh³jYh´Kˆubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjbˆuh1jXjcjdhj@h²hh³jYh´Kˆubah}”(h]”j;ah ]”(jhjieh"]”h$]”h&]”jmˆjn)johuh1jRh³jYh´Kˆhj=h²hubjq)�”}”(hhh]”hÞ)�”}”(hŒGet a pointer to the cookie key”h]”hŒGet a pointer to the cookie key”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´Kˆhjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jphj=h²hh³jYh´Kˆubeh}”(h]”h ]”(jœŒfunction”eh"]”h$]”h&]”j‘jœj’j0j“j0j”‰j•‰j–‰uh1jMh²hhj+h³Nh´Nubj˜)�”}”(hŒ‘**Parameters** ``struct fscache_cookie *cookie`` The cookie to query **Description** Return a pointer to the where a cookie's key is stored.”h]”(hÞ)�”}”(hŒ**Parameters**”h]”j¢)�”}”(hj:h]”hŒ Parameters”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¡hj8ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´KŒhj4ubj¸)�”}”(hhh]”j½)�”}”(hŒ6``struct fscache_cookie *cookie`` The cookie to query ”h]”(jÃ)�”}”(hŒ!``struct fscache_cookie *cookie``”h]”j¥)�”}”(hjYh]”hŒstruct fscache_cookie *cookie”…”�”}”(hj[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjWubah}”(h]”h ]”h"]”h$]”h&]”uh1jÂh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´K‰hjSubjÝ)�”}”(hhh]”hÞ)�”}”(hŒThe cookie to query”h]”hŒThe cookie to query”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³jnh´K‰hjoubah}”(h]”h ]”h"]”h$]”h&]”uh1jÜhjSubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¼h³jnh´K‰hjPubah}”(h]”h ]”h"]”h$]”h&]”uh1j·hj4ubhÞ)�”}”(hŒ**Description**”h]”j¢)�”}”(hj”h]”hŒ Description”…”�”}”(hj–h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¡hj’ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´K‹hj4ubhÞ)�”}”(hŒ7Return a pointer to the where a cookie's key is stored.”h]”hŒ9Return a pointer to the where a cookie’s key is stored.”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´KŠhj4ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j—hj+h²hh³Nh´Nubj=)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jIŒ!fscache_count_object (C function)”Œc.fscache_count_object”hNt”auh1j<hj+h²hh³Nh´NubjN)�”}”(hhh]”(jS)�”}”(hŒ7void fscache_count_object (struct fscache_cache *cache)”h]”jY)�”}”(hŒ6void fscache_count_object(struct fscache_cache *cache)”h]”(jI)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”jUah"]”h$]”h&]”uh1jHhjÕh²hh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´K›ubjq)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjèh²hh³Nh´Nubah}”(h]”h ]”j}ah"]”h$]”h&]”uh1jphjÕh²hh³jçh´K›ubjÀ)�”}”(hŒfscache_count_object”h]”j…)�”}”(hŒfscache_count_object”h]”hŒfscache_count_object”…”�”}”(hjúh²hh³Nh´Nubah}”(h]”h ]”j‘ah"]”h$]”h&]”uh1j„hjöubah}”(h]”h ]”(jÕjÖeh"]”h$]”h&]”hÅhÆuh1j¿hjÕh²hh³jçh´K›ubjÛ)�”}”(hŒ(struct fscache_cache *cache)”h]”já)�”}”(hŒstruct fscache_cache *cache”h]”(j_)�”}”(hjèh]”hŒstruct”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jkah"]”h$]”h&]”uh1j^hjubjq)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”j}ah"]”h$]”h&]”uh1jphjubh)�”}”(hhh]”j…)�”}”(hŒ fscache_cache”h]”hŒ fscache_cache”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”j‘ah"]”h$]”h&]”uh1j„hj1ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jœŒreftype”jžŒ reftarget”j6Œmodname”NŒ classname”Nj¢j¥)�”}”j¨]”j«)�”}”jžjüsbŒc.fscache_count_object”†”asbuh1hhjubjq)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjTh²hh³Nh´Nubah}”(h]”h ]”j}ah"]”h$]”h&]”uh1jphjubj2)�”}”(hjÀh]”hŒ*”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”j=ah"]”h$]”h&]”uh1j1hjubj…)�”}”(hŒcache”h]”hŒcache”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”j‘ah"]”h$]”h&]”uh1j„hjubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jàhjubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jÚhjÕh²hh³jçh´K›ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjbˆuh1jXjcjdhjÑh²hh³jçh´K›ubah}”(h]”jÌah ]”(jhjieh"]”h$]”h&]”jmˆjn)johuh1jRh³jçh´K›hjÎh²hubjq)�”}”(hhh]”hÞ)�”}”(hŒ*Tell fscache that an object has been added”h]”hŒ*Tell fscache that an object has been added”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´K›hj–h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jphjÎh²hh³jçh´K›ubeh}”(h]”h ]”(jœŒfunction”eh"]”h$]”h&]”j‘jœj’j±j“j±j”‰j•‰j–‰uh1jMh²hhj+h³Nh´Nubj˜)�”}”(hŒò**Parameters** ``struct fscache_cache *cache`` The cache to account to **Description** Tell fscache that an object has been added to the cache. This prevents the cache from tearing down the cache structure until the object is uncounted.”h]”(hÞ)�”}”(hŒ**Parameters**”h]”j¢)�”}”(hj»h]”hŒ Parameters”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¡hj¹ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´KŸhjµubj¸)�”}”(hhh]”j½)�”}”(hŒ8``struct fscache_cache *cache`` The cache to account to ”h]”(jÃ)�”}”(hŒ``struct fscache_cache *cache``”h]”j¥)�”}”(hjÚh]”hŒstruct fscache_cache *cache”…”�”}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjØubah}”(h]”h ]”h"]”h$]”h&]”uh1jÂh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´KœhjÔubjÝ)�”}”(hhh]”hÞ)�”}”(hŒThe cache to account to”h]”hŒThe cache to account to”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³jïh´Kœhjðubah}”(h]”h ]”h"]”h$]”h&]”uh1jÜhjÔubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¼h³jïh´KœhjÑubah}”(h]”h ]”h"]”h$]”h&]”uh1j·hjµubhÞ)�”}”(hŒ**Description**”h]”j¢)�”}”(hjh]”hŒ Description”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¡hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´KžhjµubhÞ)�”}”(hŒ–Tell fscache that an object has been added to the cache. This prevents the cache from tearing down the cache structure until the object is uncounted.”h]”hŒ–Tell fscache that an object has been added to the cache. This prevents the cache from tearing down the cache structure until the object is uncounted.”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´K�hjµubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j—hj+h²hh³Nh´Nubj=)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jIŒ#fscache_uncount_object (C function)”Œc.fscache_uncount_object”hNt”auh1j<hj+h²hh³Nh´NubjN)�”}”(hhh]”(jS)�”}”(hŒ9void fscache_uncount_object (struct fscache_cache *cache)”h]”jY)�”}”(hŒ8void fscache_uncount_object(struct fscache_cache *cache)”h]”(jI)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”h ]”jUah"]”h$]”h&]”uh1jHhjVh²hh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´K§ubjq)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”j}ah"]”h$]”h&]”uh1jphjVh²hh³jhh´K§ubjÀ)�”}”(hŒfscache_uncount_object”h]”j…)�”}”(hŒfscache_uncount_object”h]”hŒfscache_uncount_object”…”�”}”(hj{h²hh³Nh´Nubah}”(h]”h ]”j‘ah"]”h$]”h&]”uh1j„hjwubah}”(h]”h ]”(jÕjÖeh"]”h$]”h&]”hÅhÆuh1j¿hjVh²hh³jhh´K§ubjÛ)�”}”(hŒ(struct fscache_cache *cache)”h]”já)�”}”(hŒstruct fscache_cache *cache”h]”(j_)�”}”(hjèh]”hŒstruct”…”�”}”(hj—h²hh³Nh´Nubah}”(h]”h ]”jkah"]”h$]”h&]”uh1j^hj“ubjq)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”j}ah"]”h$]”h&]”uh1jphj“ubh)�”}”(hhh]”j…)�”}”(hŒ fscache_cache”h]”hŒ fscache_cache”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”j‘ah"]”h$]”h&]”uh1j„hj²ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jœŒreftype”jžŒ reftarget”j·Œmodname”NŒ classname”Nj¢j¥)�”}”j¨]”j«)�”}”jžj}sbŒc.fscache_uncount_object”†”asbuh1hhj“ubjq)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÕh²hh³Nh´Nubah}”(h]”h ]”j}ah"]”h$]”h&]”uh1jphj“ubj2)�”}”(hjÀh]”hŒ*”…”�”}”(hjãh²hh³Nh´Nubah}”(h]”h ]”j=ah"]”h$]”h&]”uh1j1hj“ubj…)�”}”(hŒcache”h]”hŒcache”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”j‘ah"]”h$]”h&]”uh1j„hj“ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jàhj�ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jÚhjVh²hh³jhh´K§ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjbˆuh1jXjcjdhjRh²hh³jhh´K§ubah}”(h]”jMah ]”(jhjieh"]”h$]”h&]”jmˆjn)johuh1jRh³jhh´K§hjOh²hubjq)�”}”(hhh]”hÞ)�”}”(hŒ,Tell fscache that an object has been removed”h]”hŒ,Tell fscache that an object has been removed”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´K§hjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jphjOh²hh³jhh´K§ubeh}”(h]”h ]”(jœŒfunction”eh"]”h$]”h&]”j‘jœj’j2j“j2j”‰j•‰j–‰uh1jMh²hhj+h³Nh´Nubj˜)�”}”(hŒí**Parameters** ``struct fscache_cache *cache`` The cache to account to **Description** Tell fscache that an object has been removed from the cache and will no longer be accessed. After this point, the cache cookie may be destroyed.”h]”(hÞ)�”}”(hŒ**Parameters**”h]”j¢)�”}”(hj<h]”hŒ Parameters”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¡hj:ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´K«hj6ubj¸)�”}”(hhh]”j½)�”}”(hŒ8``struct fscache_cache *cache`` The cache to account to ”h]”(jÃ)�”}”(hŒ``struct fscache_cache *cache``”h]”j¥)�”}”(hj[h]”hŒstruct fscache_cache *cache”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjYubah}”(h]”h ]”h"]”h$]”h&]”uh1jÂh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´K¨hjUubjÝ)�”}”(hhh]”hÞ)�”}”(hŒThe cache to account to”h]”hŒThe cache to account to”…”�”}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³jph´K¨hjqubah}”(h]”h ]”h"]”h$]”h&]”uh1jÜhjUubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¼h³jph´K¨hjRubah}”(h]”h ]”h"]”h$]”h&]”uh1j·hj6ubhÞ)�”}”(hŒ**Description**”h]”j¢)�”}”(hj–h]”hŒ Description”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¡hj”ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´Kªhj6ubhÞ)�”}”(hŒ‘Tell fscache that an object has been removed from the cache and will no longer be accessed. After this point, the cache cookie may be destroyed.”h]”hŒ‘Tell fscache that an object has been removed from the cache and will no longer be accessed. After this point, the cache cookie may be destroyed.”…”�”}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´K©hj6ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j—hj+h²hh³Nh´Nubj=)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jIŒ%fscache_wait_for_objects (C function)”Œc.fscache_wait_for_objects”hNt”auh1j<hj+h²hh³Nh´NubjN)�”}”(hhh]”(jS)�”}”(hŒ;void fscache_wait_for_objects (struct fscache_cache *cache)”h]”jY)�”}”(hŒ:void fscache_wait_for_objects(struct fscache_cache *cache)”h]”(jI)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”jUah"]”h$]”h&]”uh1jHhj×h²hh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´K´ubjq)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjêh²hh³Nh´Nubah}”(h]”h ]”j}ah"]”h$]”h&]”uh1jphj×h²hh³jéh´K´ubjÀ)�”}”(hŒfscache_wait_for_objects”h]”j…)�”}”(hŒfscache_wait_for_objects”h]”hŒfscache_wait_for_objects”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”j‘ah"]”h$]”h&]”uh1j„hjøubah}”(h]”h ]”(jÕjÖeh"]”h$]”h&]”hÅhÆuh1j¿hj×h²hh³jéh´K´ubjÛ)�”}”(hŒ(struct fscache_cache *cache)”h]”já)�”}”(hŒstruct fscache_cache *cache”h]”(j_)�”}”(hjèh]”hŒstruct”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jkah"]”h$]”h&]”uh1j^hjubjq)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”j}ah"]”h$]”h&]”uh1jphjubh)�”}”(hhh]”j…)�”}”(hŒ fscache_cache”h]”hŒ fscache_cache”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”j‘ah"]”h$]”h&]”uh1j„hj3ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jœŒreftype”jžŒ reftarget”j8Œmodname”NŒ classname”Nj¢j¥)�”}”j¨]”j«)�”}”jžjþsbŒc.fscache_wait_for_objects”†”asbuh1hhjubjq)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjVh²hh³Nh´Nubah}”(h]”h ]”j}ah"]”h$]”h&]”uh1jphjubj2)�”}”(hjÀh]”hŒ*”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”j=ah"]”h$]”h&]”uh1j1hjubj…)�”}”(hŒcache”h]”hŒcache”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”j‘ah"]”h$]”h&]”uh1j„hjubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jàhjubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jÚhj×h²hh³jéh´K´ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjbˆuh1jXjcjdhjÓh²hh³jéh´K´ubah}”(h]”jÎah ]”(jhjieh"]”h$]”h&]”jmˆjn)johuh1jRh³jéh´K´hjÐh²hubjq)�”}”(hhh]”hÞ)�”}”(hŒ$Wait for all objects to be withdrawn”h]”hŒ$Wait for all objects to be withdrawn”…”�”}”(hj›h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´K´hj˜h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jphjÐh²hh³jéh´K´ubeh}”(h]”h ]”(jœŒfunction”eh"]”h$]”h&]”j‘jœj’j³j“j³j”‰j•‰j–‰uh1jMh²hhj+h³Nh´Nubj˜)�”}”(hŒ¤**Parameters** ``struct fscache_cache *cache`` The cache to query **Description** Wait for all extant objects in a cache to finish being withdrawn and go away.”h]”(hÞ)�”}”(hŒ**Parameters**”h]”j¢)�”}”(hj½h]”hŒ Parameters”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¡hj»ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´K¸hj·ubj¸)�”}”(hhh]”j½)�”}”(hŒ3``struct fscache_cache *cache`` The cache to query ”h]”(jÃ)�”}”(hŒ``struct fscache_cache *cache``”h]”j¥)�”}”(hjÜh]”hŒstruct fscache_cache *cache”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤hjÚubah}”(h]”h ]”h"]”h$]”h&]”uh1jÂh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´KµhjÖubjÝ)�”}”(hhh]”hÞ)�”}”(hŒThe cache to query”h]”hŒThe cache to query”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³jñh´Kµhjòubah}”(h]”h ]”h"]”h$]”h&]”uh1jÜhjÖubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¼h³jñh´KµhjÓubah}”(h]”h ]”h"]”h$]”h&]”uh1j·hj·ubhÞ)�”}”(hŒ**Description**”h]”j¢)�”}”(hjh]”hŒ Description”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¡hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´K·hj·ubhÞ)�”}”(hŒMWait for all extant objects in a cache to finish being withdrawn and go away.”h]”hŒMWait for all extant objects in a cache to finish being withdrawn and go away.”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œn/var/lib/git/docbuild/linux/Documentation/filesystems/caching/backend-api:479: ./include/linux/fscache-cache.h”h´K¶hj·ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j—hj+h²hh³Nh´Nubeh}”(h]”Œapi-function-reference”ah ]”h"]”Œapi function reference”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´MÝubeh}”(h]”Œcache-backend-api”ah ]”h"]”Œcache backend api”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hÍNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”jLŒfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”juŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jPjMjljijçjäjTjQj—j”jfjcjÌjÉjIjFjšj—j= j: j¨ j¥ j(j%jHjEuŒ nametypes”}”(jP‰jl‰jç‰jT‰j—‰jf‰j̉jI‰jš‰j= ‰j¨ ‰j(‰jH‰uh}”(jMhÊjihýjäjojQjêj”jWjcjšjÉjijFjÏj—jLj: j�j¥ j@ j%j« jEj+jKjTj;j@jÌjÑjMjRjÎjÓuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.