Skip to content

Commit

Permalink
CacheFiles: Permit the page lock state to be monitored
Browse files Browse the repository at this point in the history
Add a function to install a monitor on the page lock waitqueue for a particular
page, thus allowing the page being unlocked to be detected.

This is used by CacheFiles to detect read completion on a page in the backing
filesystem so that it can then copy the data to the waiting netfs page.

Signed-off-by: David Howells <dhowells@redhat.com>
Acked-by: Steve Dickson <steved@redhat.com>
Acked-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Acked-by: Rik van Riel <riel@redhat.com>
Acked-by: Al Viro <viro@zeniv.linux.org.uk>
Tested-by: Daire Byrne <Daire.Byrne@framestore.com>
  • Loading branch information
David Howells committed Apr 3, 2009
1 parent b510882 commit 385e1ca
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 0 deletions.
5 changes: 5 additions & 0 deletions include/linux/pagemap.h
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,11 @@ static inline void wait_on_page_writeback(struct page *page)

extern void end_page_writeback(struct page *page);

/*
* Add an arbitrary waiter to a page's wait queue
*/
extern void add_page_wait_queue(struct page *page, wait_queue_t *waiter);

/*
* Fault a userspace page into pagetables. Return non-zero on a fault.
*
Expand Down
18 changes: 18 additions & 0 deletions mm/filemap.c
Original file line number Diff line number Diff line change
Expand Up @@ -564,6 +564,24 @@ void wait_on_page_bit(struct page *page, int bit_nr)
}
EXPORT_SYMBOL(wait_on_page_bit);

/**
* add_page_wait_queue - Add an arbitrary waiter to a page's wait queue
* @page - Page defining the wait queue of interest
* @waiter - Waiter to add to the queue
*
* Add an arbitrary @waiter to the wait queue for the nominated @page.
*/
void add_page_wait_queue(struct page *page, wait_queue_t *waiter)
{
wait_queue_head_t *q = page_waitqueue(page);
unsigned long flags;

spin_lock_irqsave(&q->lock, flags);
__add_wait_queue(q, waiter);
spin_unlock_irqrestore(&q->lock, flags);
}
EXPORT_SYMBOL_GPL(add_page_wait_queue);

/**
* unlock_page - unlock a locked page
* @page: the page
Expand Down

0 comments on commit 385e1ca

Please sign in to comment.