← Documents Documentation/filesystems/caching/backend-api.rst GitHub 원문 ↗

Linux 6.18.37 · Filesystems

Cache Backend API

FS-Cache의 cache·volume·data cookie 구조, backend callback과 안전한 철회 절차 전문 번역입니다.

Source pathDocumentation/filesystems/caching/backend-api.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약·해설

backend-api.rst:1-479

FS-Cache backend API는 cache, volume, data cookie의 세 계층으로 네트워크 파일시스템의 캐시 저장소를 모델링합니다. 이름으로 공유되는 cache cookie 아래에 volume과 data object를 연결하고, 계층별 access pin과 object count로 online·withdrawal 사이의 수명 경쟁을 막습니다.

백엔드는 `fscache_cache_ops` callback으로 volume 준비, cookie 조회·철회, resize, invalidation, 로컬 쓰기 준비와 I/O operation 시작을 구현합니다. 실제 data I/O는 `begin_operation()`이 `netfs_cache_resources`에 연결한 `netfs_cache_ops`를 통해 netfs library가 수행합니다.

FS-Cache 백엔드 수명 주기
`fscache_acquire_cache()`로 이름 기반 cookie 획득백엔드 자원 준비 후 `fscache_add_cache()`volume과 data cookie lookup·operation 수행오류·invalidation·resize 상태 관리`fscache_withdraw_cache()`로 신규 접근 차단data object, volume 순서로 철회`fscache_relinquish_cache()`로 최종 참조 해제

등록부터 I/O와 안전한 철회까지의 핵심 경로입니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 .. SPDX-License-Identifier: GPL-2.0
2
3 =================
4 Cache Backend API
5 =================
6
7 The FS-Cache system provides an API by which actual caches can be supplied to
8 FS-Cache for it to then serve out to network filesystems and other interested
9 parties. This API is used by::
10
11 #include <linux/fscache-cache.h>.
12
13
14 Overview
15 ========
16
17 Interaction with the API is handled on three levels: cache, volume and data
18 storage, and each level has its own type of cookie object:
19
20 ======================= =======================
21 COOKIE C TYPE
22 ======================= =======================
23 Cache cookie struct fscache_cache
24 Volume cookie struct fscache_volume
25 Data storage cookie struct fscache_cookie
26 ======================= =======================
27
28 Cookies are used to provide some filesystem data to the cache, manage state and
29 pin the cache during access in addition to acting as reference points for the
30 API functions. Each cookie has a debugging ID that is included in trace points
31 to make it easier to correlate traces. Note, though, that debugging IDs are
32 simply allocated from incrementing counters and will eventually wrap.
33
34 The cache backend and the network filesystem can both ask for cache cookies -
35 and if they ask for one of the same name, they'll get the same cookie. Volume
36 and data cookies, however, are created at the behest of the filesystem only.
37
38
39 Cache Cookies
40 =============
41
42 Caches are represented in the API by cache cookies. These are objects of
43 type::
44
45 struct fscache_cache {
46 void *cache_priv;
47 unsigned int debug_id;
48 char *name;
49 ...
50 };
51
52 There are a few fields that the cache backend might be interested in. The
53 ``debug_id`` can be used in tracing to match lines referring to the same cache
54 and ``name`` is the name the cache was registered with. The ``cache_priv``
55 member is private data provided by the cache when it is brought online. The
56 other fields are for internal use.
57
58
59 Registering a Cache
60 ===================
61
62 When a cache backend wants to bring a cache online, it should first register
63 the cache name and that will get it a cache cookie. This is done with::
64
65 struct fscache_cache *fscache_acquire_cache(const char *name);
66
67 This will look up and potentially create a cache cookie. The cache cookie may
68 have already been created by a network filesystem looking for it, in which case
69 that cache cookie will be used. If the cache cookie is not in use by another
70 cache, it will be moved into the preparing state, otherwise it will return
71 busy.
72
73 If successful, the cache backend can then start setting up the cache. In the
74 event that the initialisation fails, the cache backend should call::
75
76 void fscache_relinquish_cache(struct fscache_cache *cache);
77
78 to reset and discard the cookie.
79
80
81 Bringing a Cache Online
82 =======================
83
84 Once the cache is set up, it can be brought online by calling::
85
86 int fscache_add_cache(struct fscache_cache *cache,
87 const struct fscache_cache_ops *ops,
88 void *cache_priv);
89
90 This stores the cache operations table pointer and cache private data into the
91 cache cookie and moves the cache to the active state, thereby allowing accesses
92 to take place.
93
94
95 Withdrawing a Cache From Service
96 ================================
97
98 The cache backend can withdraw a cache from service by calling this function::
99
100 void fscache_withdraw_cache(struct fscache_cache *cache);
101
102 This moves the cache to the withdrawn state to prevent new cache- and
103 volume-level accesses from starting and then waits for outstanding cache-level
104 accesses to complete.
105
106 The cache must then go through the data storage objects it has and tell fscache
107 to withdraw them, calling::
108
109 void fscache_withdraw_cookie(struct fscache_cookie *cookie);
110
111 on the cookie that each object belongs to. This schedules the specified cookie
112 for withdrawal. This gets offloaded to a workqueue. The cache backend can
113 wait for completion by calling::
114
115 void fscache_wait_for_objects(struct fscache_cache *cache);
116
117 Once all the cookies are withdrawn, a cache backend can withdraw all the
118 volumes, calling::
119
120 void fscache_withdraw_volume(struct fscache_volume *volume);
121
122 to tell fscache that a volume has been withdrawn. This waits for all
123 outstanding accesses on the volume to complete before returning.
124
125 When the cache is completely withdrawn, fscache should be notified by
126 calling::
127
128 void fscache_relinquish_cache(struct fscache_cache *cache);
129
130 to clear fields in the cookie and discard the caller's ref on it.
131
132
133 Volume Cookies
134 ==============
135
136 Within a cache, the data storage objects are organised into logical volumes.
137 These are represented in the API as objects of type::
138
139 struct fscache_volume {
140 struct fscache_cache *cache;
141 void *cache_priv;
142 unsigned int debug_id;
143 char *key;
144 unsigned int key_hash;
145 ...
146 u8 coherency_len;
147 u8 coherency[];
148 };
149
150 There are a number of fields here that are of interest to the caching backend:
151
152 * ``cache`` - The parent cache cookie.
153
154 * ``cache_priv`` - A place for the cache to stash private data.
155
156 * ``debug_id`` - A debugging ID for logging in tracepoints.
157
158 * ``key`` - A printable string with no '/' characters in it that represents
159 the index key for the volume. The key is NUL-terminated and padded out to
160 a multiple of 4 bytes.
161
162 * ``key_hash`` - A hash of the index key. This should work out the same, no
163 matter the cpu arch and endianness.
164
165 * ``coherency`` - A piece of coherency data that should be checked when the
166 volume is bound to in the cache.
167
168 * ``coherency_len`` - The amount of data in the coherency buffer.
169
170
171 Data Storage Cookies
172 ====================
173
174 A volume is a logical group of data storage objects, each of which is
175 represented to the network filesystem by a cookie. Cookies are represented in
176 the API as objects of type::
177
178 struct fscache_cookie {
179 struct fscache_volume *volume;
180 void *cache_priv;
181 unsigned long flags;
182 unsigned int debug_id;
183 unsigned int inval_counter;
184 loff_t object_size;
185 u8 advice;
186 u32 key_hash;
187 u8 key_len;
188 u8 aux_len;
189 ...
190 };
191
192 The fields in the cookie that are of interest to the cache backend are:
193
194 * ``volume`` - The parent volume cookie.
195
196 * ``cache_priv`` - A place for the cache to stash private data.
197
198 * ``flags`` - A collection of bit flags, including:
199
200 * FSCACHE_COOKIE_NO_DATA_TO_READ - There is no data available in the
201 cache to be read as the cookie has been created or invalidated.
202
203 * FSCACHE_COOKIE_NEEDS_UPDATE - The coherency data and/or object size has
204 been changed and needs committing.
205
206 * FSCACHE_COOKIE_LOCAL_WRITE - The netfs's data has been modified
207 locally, so the cache object may be in an incoherent state with respect
208 to the server.
209
210 * FSCACHE_COOKIE_HAVE_DATA - The backend should set this if it
211 successfully stores data into the cache.
212
213 * FSCACHE_COOKIE_RETIRED - The cookie was invalidated when it was
214 relinquished and the cached data should be discarded.
215
216 * ``debug_id`` - A debugging ID for logging in tracepoints.
217
218 * ``inval_counter`` - The number of invalidations done on the cookie.
219
220 * ``advice`` - Information about how the cookie is to be used.
221
222 * ``key_hash`` - A hash of the index key. This should work out the same, no
223 matter the cpu arch and endianness.
224
225 * ``key_len`` - The length of the index key.
226
227 * ``aux_len`` - The length of the coherency data buffer.
228
229 Each cookie has an index key, which may be stored inline to the cookie or
230 elsewhere. A pointer to this can be obtained by calling::
231
232 void *fscache_get_key(struct fscache_cookie *cookie);
233
234 The index key is a binary blob, the storage for which is padded out to a
235 multiple of 4 bytes.
236
237 Each cookie also has a buffer for coherency data. This may also be inline or
238 detached from the cookie and a pointer is obtained by calling::
239
240 void *fscache_get_aux(struct fscache_cookie *cookie);
241
242
243
244 Cookie Accounting
245 =================
246
247 Data storage cookies are counted and this is used to block cache withdrawal
248 completion until all objects have been destroyed. The following functions are
249 provided to the cache to deal with that::
250
251 void fscache_count_object(struct fscache_cache *cache);
252 void fscache_uncount_object(struct fscache_cache *cache);
253 void fscache_wait_for_objects(struct fscache_cache *cache);
254
255 The count function records the allocation of an object in a cache and the
256 uncount function records its destruction. Warning: by the time the uncount
257 function returns, the cache may have been destroyed.
258
259 The wait function can be used during the withdrawal procedure to wait for
260 fscache to finish withdrawing all the objects in the cache. When it completes,
261 there will be no remaining objects referring to the cache object or any volume
262 objects.
263
264
265 Cache Management API
266 ====================
267
268 The cache backend implements the cache management API by providing a table of
269 operations that fscache can use to manage various aspects of the cache. These
270 are held in a structure of type::
271
272 struct fscache_cache_ops {
273 const char *name;
274 ...
275 };
276
277 This contains a printable name for the cache backend driver plus a number of
278 pointers to methods to allow fscache to request management of the cache:
279
280 * Set up a volume cookie [optional]::
281
282 void (*acquire_volume)(struct fscache_volume *volume);
283
284 This method is called when a volume cookie is being created. The caller
285 holds a cache-level access pin to prevent the cache from going away for
286 the duration. This method should set up the resources to access a volume
287 in the cache and should not return until it has done so.
288
289 If successful, it can set ``cache_priv`` to its own data.
290
291
292 * Clean up volume cookie [optional]::
293
294 void (*free_volume)(struct fscache_volume *volume);
295
296 This method is called when a volume cookie is being released if
297 ``cache_priv`` is set.
298
299
300 * Look up a cookie in the cache [mandatory]::
301
302 bool (*lookup_cookie)(struct fscache_cookie *cookie);
303
304 This method is called to look up/create the resources needed to access the
305 data storage for a cookie. It is called from a worker thread with a
306 volume-level access pin in the cache to prevent it from being withdrawn.
307
308 True should be returned if successful and false otherwise. If false is
309 returned, the withdraw_cookie op (see below) will be called.
310
311 If lookup fails, but the object could still be created (e.g. it hasn't
312 been cached before), then::
313
314 void fscache_cookie_lookup_negative(
315 struct fscache_cookie *cookie);
316
317 can be called to let the network filesystem proceed and start downloading
318 stuff whilst the cache backend gets on with the job of creating things.
319
320 If successful, ``cookie->cache_priv`` can be set.
321
322
323 * Withdraw an object without any cookie access counts held [mandatory]::
324
325 void (*withdraw_cookie)(struct fscache_cookie *cookie);
326
327 This method is called to withdraw a cookie from service. It will be
328 called when the cookie is relinquished by the netfs, withdrawn or culled
329 by the cache backend or closed after a period of non-use by fscache.
330
331 The caller doesn't hold any access pins, but it is called from a
332 non-reentrant work item to manage races between the various ways
333 withdrawal can occur.
334
335 The cookie will have the ``FSCACHE_COOKIE_RETIRED`` flag set on it if the
336 associated data is to be removed from the cache.
337
338
339 * Change the size of a data storage object [mandatory]::
340
341 void (*resize_cookie)(struct netfs_cache_resources *cres,
342 loff_t new_size);
343
344 This method is called to inform the cache backend of a change in size of
345 the netfs file due to local truncation. The cache backend should make all
346 of the changes it needs to make before returning as this is done under the
347 netfs inode mutex.
348
349 The caller holds a cookie-level access pin to prevent a race with
350 withdrawal and the netfs must have the cookie marked in-use to prevent
351 garbage collection or culling from removing any resources.
352
353
354 * Invalidate a data storage object [mandatory]::
355
356 bool (*invalidate_cookie)(struct fscache_cookie *cookie);
357
358 This is called when the network filesystem detects a third-party
359 modification or when an O_DIRECT write is made locally. This requests
360 that the cache backend should throw away all the data in the cache for
361 this object and start afresh. It should return true if successful and
362 false otherwise.
363
364 On entry, new I O/operations are blocked. Once the cache is in a position
365 to accept I/O again, the backend should release the block by calling::
366
367 void fscache_resume_after_invalidation(struct fscache_cookie *cookie);
368
369 If the method returns false, caching will be withdrawn for this cookie.
370
371
372 * Prepare to make local modifications to the cache [mandatory]::
373
374 void (*prepare_to_write)(struct fscache_cookie *cookie);
375
376 This method is called when the network filesystem finds that it is going
377 to need to modify the contents of the cache due to local writes or
378 truncations. This gives the cache a chance to note that a cache object
379 may be incoherent with respect to the server and may need writing back
380 later. This may also cause the cached data to be scrapped on later
381 rebinding if not properly committed.
382
383
384 * Begin an operation for the netfs lib [mandatory]::
385
386 bool (*begin_operation)(struct netfs_cache_resources *cres,
387 enum fscache_want_state want_state);
388
389 This method is called when an I/O operation is being set up (read, write
390 or resize). The caller holds an access pin on the cookie and must have
391 marked the cookie as in-use.
392
393 If it can, the backend should attach any resources it needs to keep around
394 to the netfs_cache_resources object and return true.
395
396 If it can't complete the setup, it should return false.
397
398 The want_state parameter indicates the state the caller needs the cache
399 object to be in and what it wants to do during the operation:
400
401 * ``FSCACHE_WANT_PARAMS`` - The caller just wants to access cache
402 object parameters; it doesn't need to do data I/O yet.
403
404 * ``FSCACHE_WANT_READ`` - The caller wants to read data.
405
406 * ``FSCACHE_WANT_WRITE`` - The caller wants to write to or resize the
407 cache object.
408
409 Note that there won't necessarily be anything attached to the cookie's
410 cache_priv yet if the cookie is still being created.
411
412
413 Data I/O API
414 ============
415
416 A cache backend provides a data I/O API by through the netfs library's ``struct
417 netfs_cache_ops`` attached to a ``struct netfs_cache_resources`` by the
418 ``begin_operation`` method described above.
419
420 See the Documentation/filesystems/netfs_library.rst for a description.
421
422
423 Miscellaneous Functions
424 =======================
425
426 FS-Cache provides some utilities that a cache backend may make use of:
427
428 * Note occurrence of an I/O error in a cache::
429
430 void fscache_io_error(struct fscache_cache *cache);
431
432 This tells FS-Cache that an I/O error occurred in the cache. This
433 prevents any new I/O from being started on the cache.
434
435 This does not actually withdraw the cache. That must be done separately.
436
437 * Note cessation of caching on a cookie due to failure::
438
439 void fscache_caching_failed(struct fscache_cookie *cookie);
440
441 This notes that a the caching that was being done on a cookie failed in
442 some way, for instance the backing storage failed to be created or
443 invalidation failed and that no further I/O operations should take place
444 on it until the cache is reset.
445
446 * Count I/O requests::
447
448 void fscache_count_read(void);
449 void fscache_count_write(void);
450
451 These record reads and writes from/to the cache. The numbers are
452 displayed in /proc/fs/fscache/stats.
453
454 * Count out-of-space errors::
455
456 void fscache_count_no_write_space(void);
457 void fscache_count_no_create_space(void);
458
459 These record ENOSPC errors in the cache, divided into failures of data
460 writes and failures of filesystem object creations (e.g. mkdir).
461
462 * Count objects culled::
463
464 void fscache_count_culled(void);
465
466 This records the culling of an object.
467
468 * Get the cookie from a set of cache resources::
469
470 struct fscache_cookie *fscache_cres_cookie(struct netfs_cache_resources *cres)
471
472 Pull a pointer to the cookie from the cache resources. This may return a
473 NULL cookie if no cookie was set.
474
475
476 API Function Reference
477 ======================
478
479 .. kernel-doc:: include/linux/fscache-cache.h
480

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

Cache Backend API 개요

1-38

FS-Cache는 실제 캐시 구현을 등록하여 네트워크 파일시스템과 다른 사용자가 이용하게 하는 API를 제공합니다. 캐시 백엔드는 `#include <linux/fscache-cache.h>`를 통해 이 API를 사용합니다.

API 상호작용은 cache, volume, data storage의 세 계층에서 이루어지며 각 계층에는 고유한 cookie 객체 형식이 있습니다. cache cookie는 `struct fscache_cache`, volume cookie는 `struct fscache_volume`, data storage cookie는 `struct fscache_cookie`입니다.

cookie는 파일시스템 데이터를 캐시에 제공하고, 상태를 관리하며, 접근 중 캐시가 사라지지 않게 고정하는 동시에 API 함수의 참조 지점 역할을 합니다. 각 cookie에는 trace point에서 같은 객체의 기록을 연결하기 쉬운 debugging ID가 있습니다. 이 ID는 증가 카운터에서 단순 할당하므로 언젠가는 wrap됩니다.

캐시 백엔드와 네트워크 파일시스템은 둘 다 cache cookie를 요청할 수 있습니다. 같은 이름을 요청하면 같은 cookie를 받습니다. 반면 volume cookie와 data cookie는 파일시스템의 요청으로만 생성됩니다.

FS-Cache cookie 계층
계층C 형식생성 요청자
Cache`struct fscache_cache`캐시 백엔드 또는 네트워크 파일시스템
Volume`struct fscache_volume`파일시스템
Data storage`struct fscache_cookie`파일시스템

캐시 전체에서 개별 데이터 객체까지의 API 객체입니다.

.. SPDX-License-Identifier: GPL-2.0

=================
Cache Backend API
=================

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

        #include <linux/fscache-cache.h>.


Overview
========

Interaction with the API is handled on three levels: cache, volume and data
storage, and each level has its own type of cookie object:

        =======================        =======================
        COOKIE                        C TYPE
        =======================        =======================
        Cache cookie                struct fscache_cache
        Volume cookie                struct fscache_volume
        Data storage cookie        struct fscache_cookie
        =======================        =======================

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.

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.

캐시 등록

59-80

캐시 백엔드가 캐시를 online으로 전환하려면 먼저 캐시 이름을 등록하여 cache cookie를 얻어야 합니다. `struct fscache_cache *fscache_acquire_cache(const char *name);`을 호출합니다.

이 함수는 cache cookie를 조회하고 필요하면 생성합니다. 네트워크 파일시스템이 같은 이름의 캐시를 찾으면서 cookie를 이미 만들었을 수 있으며, 그 경우 기존 cookie를 사용합니다.

다른 캐시가 해당 cookie를 사용하고 있지 않으면 preparing 상태로 옮깁니다. 이미 사용 중이면 busy를 반환합니다.

성공하면 백엔드는 캐시 설정을 시작할 수 있습니다. 초기화에 실패하면 `void fscache_relinquish_cache(struct fscache_cache *cache);`를 호출해 cookie를 초기 상태로 되돌리고 폐기해야 합니다.

캐시 등록과 초기화 실패 처리
`fscache_acquire_cache(name)` 호출동일 이름 cookie 조회 또는 생성사용 중이면 busy비어 있으면 preparing 상태백엔드 초기화실패하면 `fscache_relinquish_cache()`

이름 기반 cookie 획득부터 준비 상태까지의 흐름입니다.

Registering a Cache
===================

When a cache backend wants to bring a cache online, it should first register
the cache name and that will get it a cache cookie.  This is done with::

        struct fscache_cache *fscache_acquire_cache(const char *name);

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.

If successful, the cache backend can then start setting up the cache.  In the
event that the initialisation fails, the cache backend should call::

        void fscache_relinquish_cache(struct fscache_cache *cache);

to reset and discard the cookie.

캐시 online 전환

81-94

캐시 설정이 끝나면 `fscache_add_cache(cache, ops, cache_priv)`를 호출해 online으로 전환할 수 있습니다.

이 함수는 cache operation table 포인터와 캐시 private data를 cache cookie에 저장하고 캐시를 active 상태로 옮깁니다. 그 결과 캐시 접근을 시작할 수 있습니다.

캐시 활성화
백엔드 캐시 자원 설정 완료`fscache_cache_ops` 준비`cache_priv` 준비`fscache_add_cache()` 호출cookie에 ops와 private data 저장active 상태로 전환

preparing 상태의 캐시를 접근 가능한 active 상태로 전환합니다.

Bringing a Cache Online
=======================

Once the cache is set up, it can be brought online by calling::

        int fscache_add_cache(struct fscache_cache *cache,
                              const struct fscache_cache_ops *ops,
                              void *cache_priv);

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.

캐시 서비스 철회

95-132

캐시 백엔드는 `fscache_withdraw_cache(cache)`를 호출해 캐시를 서비스에서 철회할 수 있습니다. 이 함수는 캐시를 withdrawn 상태로 옮겨 새로운 cache 계층과 volume 계층 접근이 시작되지 않게 하고, 이미 진행 중인 cache 계층 접근이 완료될 때까지 기다립니다.

그 다음 캐시는 보유한 data storage object를 순회하며 각 객체가 속한 cookie에 `fscache_withdraw_cookie(cookie)`를 호출해야 합니다. 이 호출은 지정한 cookie의 철회를 workqueue에 예약합니다.

백엔드는 `fscache_wait_for_objects(cache)`를 호출해 모든 data storage object의 철회 완료를 기다릴 수 있습니다.

모든 data cookie가 철회되면 각 volume에 `fscache_withdraw_volume(volume)`을 호출해 volume 철회를 알립니다. 이 함수는 해당 volume의 진행 중인 모든 접근이 끝날 때까지 기다린 뒤 반환합니다.

캐시 철회가 완전히 끝나면 `fscache_relinquish_cache(cache)`를 호출해야 합니다. 이 함수는 cookie 필드를 지우고 호출자가 가진 참조를 버립니다.

캐시 철회 순서
`fscache_withdraw_cache()`로 신규 cache·volume 접근 차단진행 중인 cache 접근 완료 대기각 data cookie에 `fscache_withdraw_cookie()` 예약`fscache_wait_for_objects()`로 객체 철회 완료 대기각 volume에 `fscache_withdraw_volume()``fscache_relinquish_cache()`로 최종 참조 해제

상위 계층을 닫은 뒤 하위 객체부터 안전하게 정리합니다.

Withdrawing a Cache From Service
================================

The cache backend can withdraw a cache from service by calling this function::

        void fscache_withdraw_cache(struct fscache_cache *cache);

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.

The cache must then go through the data storage objects it has and tell fscache
to withdraw them, calling::

        void fscache_withdraw_cookie(struct fscache_cookie *cookie);

on the cookie that each object belongs to.  This schedules the specified cookie
for withdrawal.  This gets offloaded to a workqueue.  The cache backend can
wait for completion by calling::

        void fscache_wait_for_objects(struct fscache_cache *cache);

Once all the cookies are withdrawn, a cache backend can withdraw all the
volumes, calling::

        void fscache_withdraw_volume(struct fscache_volume *volume);

to tell fscache that a volume has been withdrawn.  This waits for all
outstanding accesses on the volume to complete before returning.

When the cache is completely withdrawn, fscache should be notified by
calling::

        void fscache_relinquish_cache(struct fscache_cache *cache);

to clear fields in the cookie and discard the caller's ref on it.

Cache management table과 volume callback

265-299

캐시 백엔드는 FS-Cache가 캐시의 여러 측면을 관리할 수 있도록 operation table을 제공해 cache management API를 구현합니다. 이 table은 `struct fscache_cache_ops` 형식이며 출력 가능한 백엔드 드라이버 이름과 메서드 포인터를 담습니다.

선택적 `acquire_volume(volume)`은 volume cookie를 만들 때 호출됩니다. 호출자는 작업 동안 캐시가 사라지지 않도록 cache 계층 access pin을 보유합니다. 이 메서드는 캐시 안의 volume에 접근하는 데 필요한 자원을 설정하고 완료할 때까지 반환하지 않아야 합니다. 성공하면 `volume->cache_priv`에 백엔드 데이터를 저장할 수 있습니다.

선택적 `free_volume(volume)`은 volume cookie를 해제할 때 `cache_priv`가 설정되어 있으면 호출됩니다.

Volume 관리 callback
callback필수 여부책임
`acquire_volume`선택volume 접근 자원 설정, 성공 시 `cache_priv` 저장
`free_volume`선택`cache_priv`가 있는 volume 자원 정리

volume cookie 생성과 해제에 대응하는 선택적 연산입니다.

Cache Management API
====================

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

        struct fscache_cache_ops {
                const char *name;
                ...
        };

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:

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

`prepare_to_write` callback

372-383

필수 `prepare_to_write(cookie)`는 로컬 쓰기나 truncation 때문에 네트워크 파일시스템이 캐시 내용을 수정해야 한다고 판단할 때 호출됩니다.

이 callback은 캐시 객체가 서버와 일관되지 않을 수 있고 나중에 writeback이 필요할 수 있음을 백엔드가 기록할 기회를 줍니다. 변경 상태가 올바르게 commit되지 않으면 나중에 다시 bind할 때 캐시 데이터를 폐기하게 할 수도 있습니다.

로컬 수정 준비
netfs가 로컬 write 또는 truncation 예정`prepare_to_write(cookie)` 호출백엔드가 잠재적 incoherent 상태 기록필요 시 향후 writeback 표시commit되지 않으면 재bind 시 캐시 폐기 가능

서버와 캐시의 일관성 상태를 변경 전에 기록합니다.

   * 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_operation`과 요청 상태

384-412

필수 `begin_operation(cres, want_state)`는 read, write 또는 resize I/O operation을 설정할 때 호출됩니다. 호출자는 cookie access pin을 보유하고 cookie를 in-use로 표시해 두어야 합니다.

설정할 수 있다면 백엔드는 operation 동안 유지해야 하는 자원을 `netfs_cache_resources` 객체에 연결하고 true를 반환합니다. 설정을 완료할 수 없으면 false를 반환합니다.

`want_state`는 호출자가 캐시 객체에 요구하는 상태와 operation에서 하려는 일을 나타냅니다.

`FSCACHE_WANT_PARAMS`는 data I/O 없이 캐시 객체 매개변수만 접근하려는 요청입니다. `FSCACHE_WANT_READ`는 데이터를 읽으려는 요청입니다. `FSCACHE_WANT_WRITE`는 캐시 객체에 쓰거나 크기를 바꾸려는 요청입니다.

cookie가 아직 생성 중이라면 `cookie->cache_priv`에 반드시 무언가가 연결되어 있으리라는 보장은 없습니다.

`fscache_want_state`
상태요청
`FSCACHE_WANT_PARAMS`객체 매개변수 접근, data I/O 불필요
`FSCACHE_WANT_READ`캐시 데이터 읽기
`FSCACHE_WANT_WRITE`캐시 데이터 쓰기 또는 resize

operation 시작 시 백엔드가 준비해야 하는 수준입니다.

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

Data I/O API 연결

413-422

캐시 백엔드는 앞에서 설명한 `begin_operation` 메서드가 `struct netfs_cache_resources`에 연결하는 netfs library의 `struct netfs_cache_ops`를 통해 data I/O API를 제공합니다.

자세한 설명은 `Documentation/filesystems/netfs_library.rst`를 참고하십시오.

FS-Cache에서 netfs I/O로 연결
FS-Cache가 `begin_operation(cres, want_state)` 호출백엔드가 `netfs_cache_resources`에 자원 연결`struct netfs_cache_ops` 제공netfs library가 read·write·resize I/O 수행

관리 callback이 실제 data I/O operation table을 전달합니다.

Data I/O API
============

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.

See the Documentation/filesystems/netfs_library.rst for a description.

기타 유틸리티 함수

423-475

`fscache_io_error(cache)`는 캐시에서 I/O 오류가 발생했음을 FS-Cache에 알립니다. 그 뒤 해당 캐시에서 새 I/O가 시작되지 않습니다. 이 함수가 캐시를 실제로 철회하지는 않으므로 withdrawal은 별도로 수행해야 합니다.

`fscache_caching_failed(cookie)`는 backing storage 생성 실패나 invalidation 실패처럼 cookie에서 수행하던 caching이 실패했음을 기록합니다. 캐시를 reset할 때까지 해당 cookie에서 더 이상의 I/O operation을 수행하지 않아야 함을 나타냅니다.

`fscache_count_read()`와 `fscache_count_write()`는 캐시에서의 read와 캐시로의 write를 기록합니다. 계수는 `/proc/fs/fscache/stats`에 표시됩니다.

`fscache_count_no_write_space()`와 `fscache_count_no_create_space()`는 캐시의 `ENOSPC` 오류를 각각 data write 실패와 `mkdir` 같은 파일시스템 객체 생성 실패로 나누어 기록합니다.

`fscache_count_culled()`는 객체 culling을 기록합니다.

`fscache_cres_cookie(cres)`는 cache resources에서 cookie 포인터를 꺼냅니다. cookie가 설정되지 않았다면 `NULL`을 반환할 수 있습니다.

백엔드 유틸리티와 통계
함수기록·동작
`fscache_io_error`새 cache I/O 차단, withdrawal은 별도
`fscache_caching_failed`cookie caching 실패와 reset 전 I/O 중단
`fscache_count_read` / `count_write`read·write 계수
`fscache_count_no_write_space`data write `ENOSPC`
`fscache_count_no_create_space`객체 생성 `ENOSPC`
`fscache_count_culled`cull된 객체 계수
`fscache_cres_cookie`resources에서 cookie 또는 `NULL` 반환

오류 차단, 실패 기록과 운영 계수를 제공하는 함수입니다.

Miscellaneous Functions
=======================

FS-Cache provides some utilities that a cache backend may make use of:

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

API 함수 참조

476-479

이 절의 API 함수 참조는 `include/linux/fscache-cache.h`의 kernel-doc 주석에서 생성됩니다.

API 참조 생성
`include/linux/fscache-cache.h`kernel-doc 선언과 설명 추출Cache Backend API 함수 참조 생성

헤더의 선언과 주석이 렌더링되는 경로입니다.

API Function Reference
======================

.. kernel-doc:: include/linux/fscache-cache.h