diff -u --recursive --new-file linux-2.5.32-vfs1/fs/nfs/inode.c linux-2.5.32-vfs1.5/fs/nfs/inode.c --- linux-2.5.32-vfs1/fs/nfs/inode.c Mon Sep 2 12:33:24 2002 +++ linux-2.5.32-vfs1.5/fs/nfs/inode.c Mon Sep 2 21:38:28 2002 @@ -126,10 +126,10 @@ nfs_clear_inode(struct inode *inode) { struct nfs_inode *nfsi = NFS_I(inode); - struct rpc_cred *cred = nfsi->mm_cred; + struct rpc_cred *cred; - if (cred) - put_rpccred(cred); + if (nfsi->mm_cred) + put_vfscred(nfsi->mm_cred); cred = nfsi->cache_access.cred; if (cred) put_rpccred(cred); @@ -847,14 +847,14 @@ * shared pages */ static inline void -nfs_set_mmcred(struct inode *inode, struct rpc_cred *cred) +nfs_set_mmcred(struct inode *inode, struct vfs_cred *vfscred) { struct rpc_cred **p = &NFS_I(inode)->mm_cred, - *oldcred = *p; + *oldcred; - *p = get_rpccred(cred); + oldcred = xchg(*p, get_vfscred(cred)); if (oldcred) - put_rpccred(oldcred); + put_vfscred(oldcred); } /* @@ -866,7 +866,6 @@ int nfs_open(struct inode *inode, struct file *filp) { struct rpc_auth *auth; - struct rpc_cred *cred; int err = 0; lock_kernel(); @@ -876,11 +875,8 @@ if (err) goto out; } - auth = NFS_CLIENT(inode)->cl_auth; - cred = rpcauth_lookupcred(filp->f_cred, auth, 0); - filp->private_data = cred; if (filp->f_mode & FMODE_WRITE) - nfs_set_mmcred(inode, cred); + nfs_set_mmcred(inode, filp->f_cred); out: unlock_kernel(); return err; @@ -888,13 +884,6 @@ int nfs_release(struct inode *inode, struct file *filp) { - struct rpc_cred *cred; - - lock_kernel(); - cred = nfs_file_cred(filp); - if (cred) - put_rpccred(cred); - unlock_kernel(); return 0; } diff -u --recursive --new-file linux-2.5.32-vfs1/fs/nfs/read.c linux-2.5.32-vfs1.5/fs/nfs/read.c --- linux-2.5.32-vfs1/fs/nfs/read.c Tue Aug 20 19:10:08 2002 +++ linux-2.5.32-vfs1.5/fs/nfs/read.c Mon Sep 2 21:25:06 2002 @@ -84,9 +84,9 @@ * Read a page synchronously. */ static int -nfs_readpage_sync(struct file *file, struct inode *inode, struct page *page) +nfs_readpage_sync(struct vfs_cred *vfscred, struct inode *inode, struct page *page) { - struct rpc_cred *cred = NULL; + struct rpc_cred *cred; struct nfs_fattr fattr; unsigned int offset = 0; unsigned int rsize = NFS_SERVER(inode)->rsize; @@ -97,8 +97,7 @@ dprintk("NFS: nfs_readpage_sync(%p)\n", page); - if (file) - cred = nfs_file_cred(file); + cred = rpcauth_lookupcred(vfscred, NFS_CLIENT(inode)->cl_auth, 0); /* * This works now because the socket layer never tries to DMA @@ -147,6 +146,7 @@ result = 0; io_error: + put_rpccred(cred); unlock_page(page); return result; } @@ -168,12 +168,15 @@ } static int -nfs_readpage_async(struct file *file, struct inode *inode, struct page *page) +nfs_readpage_async(struct vfs_cred *vfscred, struct inode *inode, struct page *page) { struct nfs_inode *nfsi = NFS_I(inode); + struct rpc_cred *cred; struct nfs_page *new; - new = nfs_create_request(nfs_file_cred(file), inode, page, 0, PAGE_CACHE_SIZE); + cred = rpcauth_lookupcred(vfscred, NFS_CLIENT(inode)->cl_auth, 0); + new = nfs_create_request(cred, inode, page, 0, PAGE_CACHE_SIZE); + put_rpccred(cred); if (IS_ERR(new)) return PTR_ERR(new); nfs_mark_request_read(new); @@ -477,11 +480,11 @@ goto out_error; if (!PageError(page) && NFS_SERVER(inode)->rsize >= PAGE_CACHE_SIZE) { - error = nfs_readpage_async(file, inode, page); + error = nfs_readpage_async(file->f_cred, inode, page); goto out; } - error = nfs_readpage_sync(file, inode, page); + error = nfs_readpage_sync(file->f_cred, inode, page); if (error < 0 && IS_SWAPFILE(inode)) printk("Aiee.. nfs swap-in of page failed!\n"); out: diff -u --recursive --new-file linux-2.5.32-vfs1/fs/nfs/write.c linux-2.5.32-vfs1.5/fs/nfs/write.c --- linux-2.5.32-vfs1/fs/nfs/write.c Sat Jul 27 19:28:29 2002 +++ linux-2.5.32-vfs1.5/fs/nfs/write.c Mon Sep 2 21:31:06 2002 @@ -144,7 +144,7 @@ * Offset is the data offset within the page. */ static int -nfs_writepage_sync(struct file *file, struct inode *inode, struct page *page, +nfs_writepage_sync(struct vfs_cred *vfscred, struct inode *inode, struct page *page, unsigned int offset, unsigned int count) { struct rpc_cred *cred = NULL; @@ -156,8 +156,8 @@ struct nfs_writeverf verf; - if (file) - cred = get_rpccred(nfs_file_cred(file)); + if (vfscred) + cred = rpcauth_lookupcred(vfscred, NFS_CLIENT(inode)->cl_auth, 0); if (!cred) cred = get_rpccred(NFS_I(inode)->mm_cred); @@ -645,6 +645,7 @@ unsigned int offset, unsigned int bytes) { struct nfs_page *req, *new = NULL; + struct rpc_cred *cred; unsigned long rqend, end; end = offset + bytes; @@ -680,7 +681,9 @@ } spin_unlock(&nfs_wreq_lock); - new = nfs_create_request(nfs_file_cred(file), inode, page, offset, bytes); + cred = rpcauth_lookupcred(vfscred, NFS_CLIENT(inode)->cl_auth, 0); + new = nfs_create_request(cred, inode, page, offset, bytes); + put_rpccred(cred); if (IS_ERR(new)) return new; if (file) { @@ -765,7 +768,7 @@ nfs_flush_incompatible(struct file *file, struct page *page) { struct inode *inode = page->mapping->host; - struct rpc_cred *cred = nfs_file_cred(file); + struct rpc_cred *cred; struct nfs_page *req; int status = 0; /* @@ -776,12 +779,14 @@ * Also do the same if we find a request from an existing * dropped page. */ + cred = rpcauth_lookupcred(vfscred, NFS_CLIENT(inode)->cl_auth, 0); req = nfs_find_request(inode,page); if (req) { if (req->wb_file != file || req->wb_cred != cred || req->wb_page != page) status = nfs_wb_page(inode, page); nfs_release_request(req); } + put_rpccred(cred); return (status < 0) ? status : 0; } diff -u --recursive --new-file linux-2.5.32-vfs1/include/linux/nfs_fs.h linux-2.5.32-vfs1.5/include/linux/nfs_fs.h --- linux-2.5.32-vfs1/include/linux/nfs_fs.h Sat Jul 27 20:59:41 2002 +++ linux-2.5.32-vfs1.5/include/linux/nfs_fs.h Mon Sep 2 21:39:20 2002 @@ -170,7 +170,7 @@ npages; /* Credentials for shared mmap */ - struct rpc_cred *mm_cred; + struct vfs_cred *mm_cred; wait_queue_head_t nfs_i_wait;