page_count = nfs_get_user_pages(user_addr, bytes, &pages, rw);
if (page_count < 0) {
- nfs_release_list(requests);
return page_count;
}
break;
}
result = nfs_pagein_list(&requests, NFS_SERVER(inode)->rpages);
- nfs_wait_for_reads(&requests);
break;
case WRITE:
if (IS_SYNC(inode) || (NFS_SERVER(inode)->wsize < PAGE_SIZE))
nfs_page_free(req);
}
-/**
- * nfs_release_list - cleanly dispose of an unattached list of page requests
- * @list: list of doomed page requests
- */
-void
-nfs_release_list(struct list_head *list)
-{
- while (!list_empty(list)) {
- struct nfs_page *req = nfs_list_entry(list);
-
- nfs_list_remove_request(req);
-
- page_cache_release(req->wb_page);
-
- /* Release struct file or cached credential */
- nfs_clear_request(req);
- nfs_page_free(req);
- }
-}
-
/**
* nfs_list_add_request - Insert a request into a sorted list
* @req: request
return nfs_wait_event(clnt, req->wb_wait, !NFS_WBACK_BUSY(req));
}
-/**
- * nfs_wait_for_reads - wait for outstanding requests to complete
- * @head: list of page requests to wait for
- */
-int
-nfs_wait_for_reads(struct list_head *head)
-{
- struct list_head *p = head->next;
- unsigned int res = 0;
-
- while (p != head) {
- struct nfs_page *req = nfs_list_entry(p);
- int error;
-
- if (!NFS_WBACK_BUSY(req))
- continue;
-
- req->wb_count++;
- error = nfs_wait_on_request(req);
- if (error < 0)
- return error;
- nfs_list_remove_request(req);
- nfs_clear_request(req);
- nfs_page_free(req);
-
- p = head->next;
- res++;
- }
- return res;
-}
-
/**
* nfs_coalesce_requests - Split coalesced requests out from a list.
* @head: source list
unsigned int, unsigned int);
extern void nfs_clear_request(struct nfs_page *req);
extern void nfs_release_request(struct nfs_page *req);
-extern void nfs_release_list(struct list_head *list);
extern void nfs_list_add_request(struct nfs_page *, struct list_head *);
extern int nfs_coalesce_requests(struct list_head *, struct list_head *,
unsigned int);
extern int nfs_wait_on_request(struct nfs_page *);
-extern int nfs_wait_for_reads(struct list_head *);
extern spinlock_t nfs_wreq_lock;