]> Git Repo - linux.git/blame - fs/afs/file.c
afs: Populate and use client modification time
[linux.git] / fs / afs / file.c
CommitLineData
08e0e7c8 1/* AFS filesystem file handling
1da177e4 2 *
08e0e7c8 3 * Copyright (C) 2002, 2007 Red Hat, Inc. All Rights Reserved.
1da177e4
LT
4 * Written by David Howells ([email protected])
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
10 */
11
12#include <linux/kernel.h>
13#include <linux/module.h>
14#include <linux/init.h>
1da177e4
LT
15#include <linux/fs.h>
16#include <linux/pagemap.h>
31143d5d 17#include <linux/writeback.h>
5a0e3ad6 18#include <linux/gfp.h>
91b467e0 19#include <linux/task_io_accounting_ops.h>
1da177e4
LT
20#include "internal.h"
21
416351f2 22static int afs_readpage(struct file *file, struct page *page);
d47992f8
LC
23static void afs_invalidatepage(struct page *page, unsigned int offset,
24 unsigned int length);
416351f2 25static int afs_releasepage(struct page *page, gfp_t gfp_flags);
31143d5d 26static int afs_launder_page(struct page *page);
1da177e4 27
9b3f26c9
DH
28static int afs_readpages(struct file *filp, struct address_space *mapping,
29 struct list_head *pages, unsigned nr_pages);
30
00d3b7a4
DH
31const struct file_operations afs_file_operations = {
32 .open = afs_open,
58fed94d 33 .flush = afs_flush,
00d3b7a4
DH
34 .release = afs_release,
35 .llseek = generic_file_llseek,
aad4f8bb 36 .read_iter = generic_file_read_iter,
50b5551d 37 .write_iter = afs_file_write,
00d3b7a4 38 .mmap = generic_file_readonly_mmap,
5ffc4ef4 39 .splice_read = generic_file_splice_read,
31143d5d 40 .fsync = afs_fsync,
e8d6c554
DH
41 .lock = afs_lock,
42 .flock = afs_flock,
00d3b7a4
DH
43};
44
754661f1 45const struct inode_operations afs_file_inode_operations = {
416351f2 46 .getattr = afs_getattr,
31143d5d 47 .setattr = afs_setattr,
00d3b7a4 48 .permission = afs_permission,
1da177e4
LT
49};
50
f5e54d6e 51const struct address_space_operations afs_fs_aops = {
416351f2 52 .readpage = afs_readpage,
9b3f26c9 53 .readpages = afs_readpages,
31143d5d
DH
54 .set_page_dirty = afs_set_page_dirty,
55 .launder_page = afs_launder_page,
416351f2
DH
56 .releasepage = afs_releasepage,
57 .invalidatepage = afs_invalidatepage,
15b4650e
NP
58 .write_begin = afs_write_begin,
59 .write_end = afs_write_end,
31143d5d
DH
60 .writepage = afs_writepage,
61 .writepages = afs_writepages,
1da177e4
LT
62};
63
00d3b7a4
DH
64/*
65 * open an AFS file or directory and attach a key to it
66 */
67int afs_open(struct inode *inode, struct file *file)
68{
69 struct afs_vnode *vnode = AFS_FS_I(inode);
70 struct key *key;
260a9803 71 int ret;
00d3b7a4 72
416351f2 73 _enter("{%x:%u},", vnode->fid.vid, vnode->fid.vnode);
00d3b7a4
DH
74
75 key = afs_request_key(vnode->volume->cell);
76 if (IS_ERR(key)) {
77 _leave(" = %ld [key]", PTR_ERR(key));
78 return PTR_ERR(key);
79 }
80
260a9803
DH
81 ret = afs_validate(vnode, key);
82 if (ret < 0) {
83 _leave(" = %d [val]", ret);
84 return ret;
85 }
86
00d3b7a4
DH
87 file->private_data = key;
88 _leave(" = 0");
89 return 0;
90}
91
92/*
93 * release an AFS file or directory and discard its key
94 */
95int afs_release(struct inode *inode, struct file *file)
96{
97 struct afs_vnode *vnode = AFS_FS_I(inode);
98
416351f2 99 _enter("{%x:%u},", vnode->fid.vid, vnode->fid.vnode);
00d3b7a4
DH
100
101 key_put(file->private_data);
102 _leave(" = 0");
103 return 0;
104}
105
196ee9cd
DH
106/*
107 * Dispose of a ref to a read record.
108 */
109void afs_put_read(struct afs_read *req)
110{
111 int i;
112
113 if (atomic_dec_and_test(&req->usage)) {
114 for (i = 0; i < req->nr_pages; i++)
115 if (req->pages[i])
116 put_page(req->pages[i]);
117 kfree(req);
118 }
119}
120
6566abdb 121#ifdef CONFIG_AFS_FSCACHE
1da177e4
LT
122/*
123 * deal with notification that a page was read from the cache
124 */
9b3f26c9
DH
125static void afs_file_readpage_read_complete(struct page *page,
126 void *data,
127 int error)
1da177e4 128{
9b3f26c9 129 _enter("%p,%p,%d", page, data, error);
1da177e4 130
9b3f26c9
DH
131 /* if the read completes with an error, we just unlock the page and let
132 * the VM reissue the readpage */
133 if (!error)
1da177e4
LT
134 SetPageUptodate(page);
135 unlock_page(page);
ec26815a 136}
6566abdb 137#endif
1da177e4 138
1da177e4 139/*
f6d335c0 140 * read page from file, directory or symlink, given a key to use
1da177e4 141 */
f6d335c0 142int afs_page_filler(void *data, struct page *page)
1da177e4 143{
f6d335c0
AV
144 struct inode *inode = page->mapping->host;
145 struct afs_vnode *vnode = AFS_FS_I(inode);
196ee9cd 146 struct afs_read *req;
f6d335c0 147 struct key *key = data;
1da177e4
LT
148 int ret;
149
00d3b7a4 150 _enter("{%x},{%lu},{%lu}", key_serial(key), inode->i_ino, page->index);
1da177e4 151
cd7619d6 152 BUG_ON(!PageLocked(page));
1da177e4
LT
153
154 ret = -ESTALE;
08e0e7c8 155 if (test_bit(AFS_VNODE_DELETED, &vnode->flags))
1da177e4
LT
156 goto error;
157
1da177e4 158 /* is it cached? */
9b3f26c9
DH
159#ifdef CONFIG_AFS_FSCACHE
160 ret = fscache_read_or_alloc_page(vnode->cache,
1da177e4
LT
161 page,
162 afs_file_readpage_read_complete,
163 NULL,
164 GFP_KERNEL);
165#else
166 ret = -ENOBUFS;
167#endif
1da177e4 168 switch (ret) {
1da177e4
LT
169 /* read BIO submitted (page in cache) */
170 case 0:
171 break;
172
9b3f26c9 173 /* page not yet cached */
1da177e4 174 case -ENODATA:
9b3f26c9
DH
175 _debug("cache said ENODATA");
176 goto go_on;
177
178 /* page will not be cached */
179 case -ENOBUFS:
180 _debug("cache said ENOBUFS");
1da177e4 181 default:
9b3f26c9 182 go_on:
196ee9cd
DH
183 req = kzalloc(sizeof(struct afs_read) + sizeof(struct page *),
184 GFP_KERNEL);
185 if (!req)
186 goto enomem;
187
6db3ac3c
DH
188 /* We request a full page. If the page is a partial one at the
189 * end of the file, the server will return a short read and the
190 * unmarshalling code will clear the unfilled space.
191 */
196ee9cd
DH
192 atomic_set(&req->usage, 1);
193 req->pos = (loff_t)page->index << PAGE_SHIFT;
6db3ac3c 194 req->len = PAGE_SIZE;
196ee9cd
DH
195 req->nr_pages = 1;
196 req->pages[0] = page;
197 get_page(page);
1da177e4
LT
198
199 /* read the contents of the file from the server into the
200 * page */
196ee9cd
DH
201 ret = afs_vnode_fetch_data(vnode, key, req);
202 afs_put_read(req);
1da177e4 203 if (ret < 0) {
08e0e7c8 204 if (ret == -ENOENT) {
1da177e4
LT
205 _debug("got NOENT from server"
206 " - marking file deleted and stale");
08e0e7c8 207 set_bit(AFS_VNODE_DELETED, &vnode->flags);
1da177e4
LT
208 ret = -ESTALE;
209 }
9b3f26c9
DH
210
211#ifdef CONFIG_AFS_FSCACHE
212 fscache_uncache_page(vnode->cache, page);
1da177e4 213#endif
9b3f26c9 214 BUG_ON(PageFsCache(page));
1da177e4
LT
215 goto error;
216 }
217
218 SetPageUptodate(page);
219
9b3f26c9
DH
220 /* send the page to the cache */
221#ifdef CONFIG_AFS_FSCACHE
222 if (PageFsCache(page) &&
223 fscache_write_page(vnode->cache, page, GFP_KERNEL) != 0) {
224 fscache_uncache_page(vnode->cache, page);
225 BUG_ON(PageFsCache(page));
1da177e4 226 }
1da177e4 227#endif
9b3f26c9 228 unlock_page(page);
1da177e4
LT
229 }
230
231 _leave(" = 0");
232 return 0;
233
196ee9cd
DH
234enomem:
235 ret = -ENOMEM;
08e0e7c8 236error:
1da177e4
LT
237 SetPageError(page);
238 unlock_page(page);
1da177e4
LT
239 _leave(" = %d", ret);
240 return ret;
ec26815a 241}
1da177e4 242
f6d335c0
AV
243/*
244 * read page from file, directory or symlink, given a file to nominate the key
245 * to be used
246 */
247static int afs_readpage(struct file *file, struct page *page)
248{
249 struct key *key;
250 int ret;
251
252 if (file) {
253 key = file->private_data;
254 ASSERT(key != NULL);
255 ret = afs_page_filler(key, page);
256 } else {
257 struct inode *inode = page->mapping->host;
258 key = afs_request_key(AFS_FS_S(inode->i_sb)->volume->cell);
259 if (IS_ERR(key)) {
260 ret = PTR_ERR(key);
261 } else {
262 ret = afs_page_filler(key, page);
263 key_put(key);
264 }
265 }
266 return ret;
267}
268
91b467e0
DH
269/*
270 * Make pages available as they're filled.
271 */
272static void afs_readpages_page_done(struct afs_call *call, struct afs_read *req)
273{
51c89e6a 274#ifdef CONFIG_AFS_FSCACHE
91b467e0 275 struct afs_vnode *vnode = call->reply;
51c89e6a 276#endif
91b467e0
DH
277 struct page *page = req->pages[req->index];
278
279 req->pages[req->index] = NULL;
280 SetPageUptodate(page);
281
282 /* send the page to the cache */
283#ifdef CONFIG_AFS_FSCACHE
284 if (PageFsCache(page) &&
285 fscache_write_page(vnode->cache, page, GFP_KERNEL) != 0) {
286 fscache_uncache_page(vnode->cache, page);
287 BUG_ON(PageFsCache(page));
288 }
289#endif
290 unlock_page(page);
291 put_page(page);
292}
293
294/*
295 * Read a contiguous set of pages.
296 */
297static int afs_readpages_one(struct file *file, struct address_space *mapping,
298 struct list_head *pages)
299{
300 struct afs_vnode *vnode = AFS_FS_I(mapping->host);
301 struct afs_read *req;
302 struct list_head *p;
303 struct page *first, *page;
304 struct key *key = file->private_data;
305 pgoff_t index;
306 int ret, n, i;
307
308 /* Count the number of contiguous pages at the front of the list. Note
309 * that the list goes prev-wards rather than next-wards.
310 */
311 first = list_entry(pages->prev, struct page, lru);
312 index = first->index + 1;
313 n = 1;
314 for (p = first->lru.prev; p != pages; p = p->prev) {
315 page = list_entry(p, struct page, lru);
316 if (page->index != index)
317 break;
318 index++;
319 n++;
320 }
321
322 req = kzalloc(sizeof(struct afs_read) + sizeof(struct page *) * n,
323 GFP_NOFS);
324 if (!req)
325 return -ENOMEM;
326
327 atomic_set(&req->usage, 1);
328 req->page_done = afs_readpages_page_done;
329 req->pos = first->index;
330 req->pos <<= PAGE_SHIFT;
331
332 /* Transfer the pages to the request. We add them in until one fails
333 * to add to the LRU and then we stop (as that'll make a hole in the
334 * contiguous run.
335 *
336 * Note that it's possible for the file size to change whilst we're
337 * doing this, but we rely on the server returning less than we asked
338 * for if the file shrank. We also rely on this to deal with a partial
339 * page at the end of the file.
340 */
341 do {
342 page = list_entry(pages->prev, struct page, lru);
343 list_del(&page->lru);
344 index = page->index;
345 if (add_to_page_cache_lru(page, mapping, index,
346 readahead_gfp_mask(mapping))) {
347#ifdef CONFIG_AFS_FSCACHE
348 fscache_uncache_page(vnode->cache, page);
349#endif
350 put_page(page);
351 break;
352 }
353
354 req->pages[req->nr_pages++] = page;
355 req->len += PAGE_SIZE;
356 } while (req->nr_pages < n);
357
358 if (req->nr_pages == 0) {
359 kfree(req);
360 return 0;
361 }
362
363 ret = afs_vnode_fetch_data(vnode, key, req);
364 if (ret < 0)
365 goto error;
366
367 task_io_account_read(PAGE_SIZE * req->nr_pages);
368 afs_put_read(req);
369 return 0;
370
371error:
372 if (ret == -ENOENT) {
373 _debug("got NOENT from server"
374 " - marking file deleted and stale");
375 set_bit(AFS_VNODE_DELETED, &vnode->flags);
376 ret = -ESTALE;
377 }
378
379 for (i = 0; i < req->nr_pages; i++) {
380 page = req->pages[i];
381 if (page) {
382#ifdef CONFIG_AFS_FSCACHE
383 fscache_uncache_page(vnode->cache, page);
384#endif
385 SetPageError(page);
386 unlock_page(page);
387 }
388 }
389
390 afs_put_read(req);
391 return ret;
392}
393
1da177e4 394/*
9b3f26c9 395 * read a set of pages
1da177e4 396 */
9b3f26c9
DH
397static int afs_readpages(struct file *file, struct address_space *mapping,
398 struct list_head *pages, unsigned nr_pages)
1da177e4 399{
f6d335c0 400 struct key *key = file->private_data;
9b3f26c9
DH
401 struct afs_vnode *vnode;
402 int ret = 0;
1da177e4 403
f6d335c0
AV
404 _enter("{%d},{%lu},,%d",
405 key_serial(key), mapping->host->i_ino, nr_pages);
406
407 ASSERT(key != NULL);
1da177e4 408
9b3f26c9 409 vnode = AFS_FS_I(mapping->host);
ad2a8e60 410 if (test_bit(AFS_VNODE_DELETED, &vnode->flags)) {
9b3f26c9
DH
411 _leave(" = -ESTALE");
412 return -ESTALE;
413 }
1da177e4 414
9b3f26c9
DH
415 /* attempt to read as many of the pages as possible */
416#ifdef CONFIG_AFS_FSCACHE
417 ret = fscache_read_or_alloc_pages(vnode->cache,
418 mapping,
419 pages,
420 &nr_pages,
421 afs_file_readpage_read_complete,
422 NULL,
423 mapping_gfp_mask(mapping));
424#else
425 ret = -ENOBUFS;
426#endif
427
428 switch (ret) {
429 /* all pages are being read from the cache */
430 case 0:
431 BUG_ON(!list_empty(pages));
432 BUG_ON(nr_pages != 0);
433 _leave(" = 0 [reading all]");
434 return 0;
435
436 /* there were pages that couldn't be read from the cache */
437 case -ENODATA:
438 case -ENOBUFS:
439 break;
440
441 /* other error */
442 default:
443 _leave(" = %d", ret);
444 return ret;
1da177e4
LT
445 }
446
91b467e0
DH
447 while (!list_empty(pages)) {
448 ret = afs_readpages_one(file, mapping, pages);
449 if (ret < 0)
450 break;
451 }
9b3f26c9
DH
452
453 _leave(" = %d [netting]", ret);
454 return ret;
ec26815a 455}
1da177e4 456
31143d5d
DH
457/*
458 * write back a dirty page
459 */
460static int afs_launder_page(struct page *page)
461{
462 _enter("{%lu}", page->index);
463
464 return 0;
465}
466
1da177e4 467/*
9b3f26c9
DH
468 * invalidate part or all of a page
469 * - release a page and clean up its private data if offset is 0 (indicating
470 * the entire page)
471 */
d47992f8
LC
472static void afs_invalidatepage(struct page *page, unsigned int offset,
473 unsigned int length)
9b3f26c9
DH
474{
475 struct afs_writeback *wb = (struct afs_writeback *) page_private(page);
476
d47992f8 477 _enter("{%lu},%u,%u", page->index, offset, length);
9b3f26c9
DH
478
479 BUG_ON(!PageLocked(page));
480
481 /* we clean up only if the entire page is being invalidated */
09cbfeaf 482 if (offset == 0 && length == PAGE_SIZE) {
9b3f26c9
DH
483#ifdef CONFIG_AFS_FSCACHE
484 if (PageFsCache(page)) {
485 struct afs_vnode *vnode = AFS_FS_I(page->mapping->host);
486 fscache_wait_on_page_write(vnode->cache, page);
487 fscache_uncache_page(vnode->cache, page);
9b3f26c9
DH
488 }
489#endif
490
491 if (PagePrivate(page)) {
492 if (wb && !PageWriteback(page)) {
493 set_page_private(page, 0);
494 afs_put_writeback(wb);
495 }
496
497 if (!page_private(page))
498 ClearPagePrivate(page);
499 }
500 }
501
502 _leave("");
503}
504
505/*
506 * release a page and clean up its private state if it's not busy
507 * - return true if the page can now be released, false if not
1da177e4 508 */
416351f2 509static int afs_releasepage(struct page *page, gfp_t gfp_flags)
1da177e4 510{
9b3f26c9 511 struct afs_writeback *wb = (struct afs_writeback *) page_private(page);
416351f2 512 struct afs_vnode *vnode = AFS_FS_I(page->mapping->host);
1da177e4 513
416351f2
DH
514 _enter("{{%x:%u}[%lu],%lx},%x",
515 vnode->fid.vid, vnode->fid.vnode, page->index, page->flags,
516 gfp_flags);
1da177e4 517
9b3f26c9
DH
518 /* deny if page is being written to the cache and the caller hasn't
519 * elected to wait */
520#ifdef CONFIG_AFS_FSCACHE
201a1542
DH
521 if (!fscache_maybe_release_page(vnode->cache, page, gfp_flags)) {
522 _leave(" = F [cache busy]");
523 return 0;
9b3f26c9
DH
524 }
525#endif
526
1da177e4 527 if (PagePrivate(page)) {
9b3f26c9
DH
528 if (wb) {
529 set_page_private(page, 0);
530 afs_put_writeback(wb);
531 }
1da177e4 532 ClearPagePrivate(page);
1da177e4
LT
533 }
534
9b3f26c9
DH
535 /* indicate that the page can be released */
536 _leave(" = T");
537 return 1;
ec26815a 538}
This page took 0.939396 seconds and 4 git commands to generate.