patch-2.4.19 linux-2.4.19/fs/nfs/pagelist.c
Next file: linux-2.4.19/fs/nfs/read.c
Previous file: linux-2.4.19/fs/nfs/nfsroot.c
Back to the patch index
Back to the overall index
- Lines: 143
- Date:
Fri Aug 2 17:39:45 2002
- Orig file:
linux-2.4.18/fs/nfs/pagelist.c
- Orig date:
Fri Dec 21 09:41:55 2001
diff -urN linux-2.4.18/fs/nfs/pagelist.c linux-2.4.19/fs/nfs/pagelist.c
@@ -53,7 +53,7 @@
/**
* nfs_create_request - Create an NFS read/write request.
- * @file: file that owns this request
+ * @cred: RPC credential to use
* @inode: inode to which the request is attached
* @page: page to write
* @offset: starting offset within the page for the write
@@ -66,7 +66,7 @@
* User should ensure it is safe to sleep in this function.
*/
struct nfs_page *
-nfs_create_request(struct file *file, struct inode *inode,
+nfs_create_request(struct rpc_cred *cred, struct inode *inode,
struct page *page,
unsigned int offset, unsigned int count)
{
@@ -96,7 +96,7 @@
continue;
if (signalled() && (server->flags & NFS_MOUNT_INTR))
return ERR_PTR(-ERESTARTSYS);
- current->policy = SCHED_YIELD;
+ current->policy |= SCHED_YIELD;
schedule();
}
@@ -108,34 +108,49 @@
req->wb_offset = offset;
req->wb_bytes = count;
- /* If we have a struct file, use its cached credentials */
- if (file) {
- req->wb_file = file;
- get_file(file);
- req->wb_cred = nfs_file_cred(file);
- }
+ if (cred)
+ req->wb_cred = get_rpccred(cred);
req->wb_inode = inode;
req->wb_count = 1;
return req;
}
+/**
+ * nfs_clear_request - Free up all resources allocated to the request
+ * @req:
+ *
+ * Release all resources associated with a write request after it
+ * has completed.
+ */
+void nfs_clear_request(struct nfs_page *req)
+{
+ /* Release struct file or cached credential */
+ if (req->wb_file) {
+ fput(req->wb_file);
+ req->wb_file = NULL;
+ }
+ if (req->wb_cred) {
+ put_rpccred(req->wb_cred);
+ req->wb_cred = NULL;
+ }
+ if (req->wb_page) {
+ page_cache_release(req->wb_page);
+ req->wb_page = NULL;
+ atomic_dec(&NFS_REQUESTLIST(req->wb_inode)->nr_requests);
+ }
+}
+
/**
* nfs_release_request - Release the count on an NFS read/write request
* @req: request to release
*
- * Release all resources associated with a write request after it
- * has been committed to stable storage
- *
* Note: Should never be called with the spinlock held!
*/
void
nfs_release_request(struct nfs_page *req)
{
- struct inode *inode = req->wb_inode;
- struct nfs_reqlist *cache = NFS_REQUESTLIST(inode);
-
spin_lock(&nfs_wreq_lock);
if (--req->wb_count) {
spin_unlock(&nfs_wreq_lock);
@@ -143,7 +158,6 @@
}
__nfs_del_lru(req);
spin_unlock(&nfs_wreq_lock);
- atomic_dec(&cache->nr_requests);
#ifdef NFS_PARANOIA
if (!list_empty(&req->wb_list))
@@ -152,16 +166,12 @@
BUG();
if (NFS_WBACK_BUSY(req))
BUG();
- if (atomic_read(&cache->nr_requests) < 0)
+ if (atomic_read(&NFS_REQUESTLIST(req->wb_inode)->nr_requests) < 0)
BUG();
#endif
/* Release struct file or cached credential */
- if (req->wb_file)
- fput(req->wb_file);
- else if (req->wb_cred)
- put_rpccred(req->wb_cred);
- page_cache_release(req->wb_page);
+ nfs_clear_request(req);
nfs_page_free(req);
}
@@ -236,7 +246,7 @@
req = nfs_list_entry(head->next);
if (prev) {
- if (req->wb_file != prev->wb_file)
+ if (req->wb_cred != prev->wb_cred)
break;
if (page_index(req->wb_page) != page_index(prev->wb_page)+1)
break;
@@ -270,7 +280,7 @@
{
struct nfs_server *server = NFS_SERVER(req->wb_inode);
struct list_head *pos, *head = req->wb_list_head;
- struct file *file = req->wb_file;
+ struct rpc_cred *cred = req->wb_cred;
unsigned long idx = page_index(req->wb_page) + 1;
int npages = 0;
@@ -291,7 +301,7 @@
break;
if (req->wb_offset != 0)
break;
- if (req->wb_file != file)
+ if (req->wb_cred != cred)
break;
}
return npages;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)