file.c (1cf7a1518aefa69ac6ba0c3f9206073e4221e3c8) file.c (13524ab3c6f41bcd257d28644414297bea8282b7)
1/* AFS filesystem file handling
2 *
3 * Copyright (C) 2002, 2007 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com)
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

--- 569 unchanged lines hidden (view full) ---

578/*
579 * invalidate part or all of a page
580 * - release a page and clean up its private data if offset is 0 (indicating
581 * the entire page)
582 */
583static void afs_invalidatepage(struct page *page, unsigned int offset,
584 unsigned int length)
585{
1/* AFS filesystem file handling
2 *
3 * Copyright (C) 2002, 2007 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com)
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

--- 569 unchanged lines hidden (view full) ---

578/*
579 * invalidate part or all of a page
580 * - release a page and clean up its private data if offset is 0 (indicating
581 * the entire page)
582 */
583static void afs_invalidatepage(struct page *page, unsigned int offset,
584 unsigned int length)
585{
586 struct afs_vnode *vnode = AFS_FS_I(page->mapping->host);
587 unsigned long priv;
588
586 _enter("{%lu},%u,%u", page->index, offset, length);
587
588 BUG_ON(!PageLocked(page));
589
590 /* we clean up only if the entire page is being invalidated */
591 if (offset == 0 && length == PAGE_SIZE) {
592#ifdef CONFIG_AFS_FSCACHE
593 if (PageFsCache(page)) {
594 struct afs_vnode *vnode = AFS_FS_I(page->mapping->host);
595 fscache_wait_on_page_write(vnode->cache, page);
596 fscache_uncache_page(vnode->cache, page);
597 }
598#endif
599
600 if (PagePrivate(page)) {
589 _enter("{%lu},%u,%u", page->index, offset, length);
590
591 BUG_ON(!PageLocked(page));
592
593 /* we clean up only if the entire page is being invalidated */
594 if (offset == 0 && length == PAGE_SIZE) {
595#ifdef CONFIG_AFS_FSCACHE
596 if (PageFsCache(page)) {
597 struct afs_vnode *vnode = AFS_FS_I(page->mapping->host);
598 fscache_wait_on_page_write(vnode->cache, page);
599 fscache_uncache_page(vnode->cache, page);
600 }
601#endif
602
603 if (PagePrivate(page)) {
604 priv = page_private(page);
605 trace_afs_page_dirty(vnode, tracepoint_string("inval"),
606 page->index, priv);
601 set_page_private(page, 0);
602 ClearPagePrivate(page);
603 }
604 }
605
606 _leave("");
607}
608
609/*
610 * release a page and clean up its private state if it's not busy
611 * - return true if the page can now be released, false if not
612 */
613static int afs_releasepage(struct page *page, gfp_t gfp_flags)
614{
615 struct afs_vnode *vnode = AFS_FS_I(page->mapping->host);
607 set_page_private(page, 0);
608 ClearPagePrivate(page);
609 }
610 }
611
612 _leave("");
613}
614
615/*
616 * release a page and clean up its private state if it's not busy
617 * - return true if the page can now be released, false if not
618 */
619static int afs_releasepage(struct page *page, gfp_t gfp_flags)
620{
621 struct afs_vnode *vnode = AFS_FS_I(page->mapping->host);
622 unsigned long priv;
616
617 _enter("{{%x:%u}[%lu],%lx},%x",
618 vnode->fid.vid, vnode->fid.vnode, page->index, page->flags,
619 gfp_flags);
620
621 /* deny if page is being written to the cache and the caller hasn't
622 * elected to wait */
623#ifdef CONFIG_AFS_FSCACHE
624 if (!fscache_maybe_release_page(vnode->cache, page, gfp_flags)) {
625 _leave(" = F [cache busy]");
626 return 0;
627 }
628#endif
629
630 if (PagePrivate(page)) {
623
624 _enter("{{%x:%u}[%lu],%lx},%x",
625 vnode->fid.vid, vnode->fid.vnode, page->index, page->flags,
626 gfp_flags);
627
628 /* deny if page is being written to the cache and the caller hasn't
629 * elected to wait */
630#ifdef CONFIG_AFS_FSCACHE
631 if (!fscache_maybe_release_page(vnode->cache, page, gfp_flags)) {
632 _leave(" = F [cache busy]");
633 return 0;
634 }
635#endif
636
637 if (PagePrivate(page)) {
638 priv = page_private(page);
639 trace_afs_page_dirty(vnode, tracepoint_string("rel"),
640 page->index, priv);
631 set_page_private(page, 0);
632 ClearPagePrivate(page);
633 }
634
635 /* indicate that the page can be released */
636 _leave(" = T");
637 return 1;
638}

--- 13 unchanged lines hidden ---
641 set_page_private(page, 0);
642 ClearPagePrivate(page);
643 }
644
645 /* indicate that the page can be released */
646 _leave(" = T");
647 return 1;
648}

--- 13 unchanged lines hidden ---