aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs/cache.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/cifs/cache.c')
-rw-r--r--fs/cifs/cache.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/fs/cifs/cache.c b/fs/cifs/cache.c
index b2649cfd3a04..224d7bbd1fcc 100644
--- a/fs/cifs/cache.c
+++ b/fs/cifs/cache.c
@@ -290,6 +290,36 @@ fscache_checkaux cifs_fscache_inode_check_aux(void *cookie_netfs_data,
290 return FSCACHE_CHECKAUX_OKAY; 290 return FSCACHE_CHECKAUX_OKAY;
291} 291}
292 292
293static void cifs_fscache_inode_now_uncached(void *cookie_netfs_data)
294{
295 struct cifsInodeInfo *cifsi = cookie_netfs_data;
296 struct pagevec pvec;
297 pgoff_t first;
298 int loop, nr_pages;
299
300 pagevec_init(&pvec, 0);
301 first = 0;
302
303 cFYI(1, "cifs inode 0x%p now uncached", cifsi);
304
305 for (;;) {
306 nr_pages = pagevec_lookup(&pvec,
307 cifsi->vfs_inode.i_mapping, first,
308 PAGEVEC_SIZE - pagevec_count(&pvec));
309 if (!nr_pages)
310 break;
311
312 for (loop = 0; loop < nr_pages; loop++)
313 ClearPageFsCache(pvec.pages[loop]);
314
315 first = pvec.pages[nr_pages - 1]->index + 1;
316
317 pvec.nr = nr_pages;
318 pagevec_release(&pvec);
319 cond_resched();
320 }
321}
322
293const struct fscache_cookie_def cifs_fscache_inode_object_def = { 323const struct fscache_cookie_def cifs_fscache_inode_object_def = {
294 .name = "CIFS.uniqueid", 324 .name = "CIFS.uniqueid",
295 .type = FSCACHE_COOKIE_TYPE_DATAFILE, 325 .type = FSCACHE_COOKIE_TYPE_DATAFILE,
@@ -297,4 +327,5 @@ const struct fscache_cookie_def cifs_fscache_inode_object_def = {
297 .get_attr = cifs_fscache_inode_get_attr, 327 .get_attr = cifs_fscache_inode_get_attr,
298 .get_aux = cifs_fscache_inode_get_aux, 328 .get_aux = cifs_fscache_inode_get_aux,
299 .check_aux = cifs_fscache_inode_check_aux, 329 .check_aux = cifs_fscache_inode_check_aux,
330 .now_uncached = cifs_fscache_inode_now_uncached,
300}; 331};