Re: smbfs writepage & struct file

From: Trond Myklebust (trond.myklebust@fys.uio.no)
Date: Wed Dec 06 2000 - 05:05:05 EST


>>>>> " " == Linus Torvalds <torvalds@transmeta.com> writes:

>> I was "borrowing" stuff from the nfs code and this looked
>> strange:
>>
>> nfs_writepage_sync: struct dentry *dentry = file->f_dentry;
>> struct rpc_cred *cred = nfs_file_cred(file);
>>
>> yet it is called like this from nfs_writepage: err =
>> nfs_writepage_sync(NULL, inode, page, 0, offset);
>>
>> where file is the 1st argument. Oh, it calls
>> nfs_writepage_async most of the time. All of the time?

> That's bogus. But Trond probably overlooked it in testing,
> because yes, it always calls the async version unless there has
> been errors doing async writes (which should be rather
> uncommon).

> Trond? Can you massage the sync version to do the same as the
> async one?

Oops. That was due to a stupid oversight... I grepped for dependencies
upon dentry->d_inode, but forgot to do the same in order to weed out
the remaining file->f_dentry.

The appended patch should remove the last 'struct file' dependencies
from both readpage() and writepage().

Cheers,
  Trond

diff -u --recursive --new-file linux-2.4.0-test12-pre6/fs/nfs/read.c linux-2.4.0-test12-fixme/fs/nfs/read.c
--- linux-2.4.0-test12-pre6/fs/nfs/read.c Wed Dec 6 08:34:53 2000
+++ linux-2.4.0-test12-fixme/fs/nfs/read.c Wed Dec 6 08:41:54 2000
@@ -84,8 +84,7 @@
 static int
 nfs_readpage_sync(struct file *file, struct inode *inode, struct page *page)
 {
- struct dentry *dentry = file->f_dentry;
- struct rpc_cred *cred = nfs_file_cred(file);
+ struct rpc_cred *cred = NULL;
         struct nfs_fattr fattr;
         loff_t offset = page_offset(page);
         char *buffer;
@@ -97,6 +96,9 @@
 
         dprintk("NFS: nfs_readpage_sync(%p)\n", page);
 
+ if (file)
+ cred = nfs_file_cred(file);
+
         /*
          * This works now because the socket layer never tries to DMA
          * into this buffer directly.
@@ -106,9 +108,9 @@
                 if (count < rsize)
                         rsize = count;
 
- dprintk("NFS: nfs_proc_read(%s, (%s/%s), %Ld, %d, %p)\n",
+ dprintk("NFS: nfs_proc_read(%s, (%x/%Ld), %Ld, %d, %p)\n",
                         NFS_SERVER(inode)->hostname,
- dentry->d_parent->d_name.name, dentry->d_name.name,
+ inode->i_dev, (long long)NFS_FILEID(inode),
                         (long long)offset, rsize, buffer);
 
                 lock_kernel();
diff -u --recursive --new-file linux-2.4.0-test12-pre6/fs/nfs/write.c linux-2.4.0-test12-fixme/fs/nfs/write.c
--- linux-2.4.0-test12-pre6/fs/nfs/write.c Wed Dec 6 08:34:53 2000
+++ linux-2.4.0-test12-fixme/fs/nfs/write.c Wed Dec 6 08:43:52 2000
@@ -171,8 +171,7 @@
 nfs_writepage_sync(struct file *file, struct inode *inode, struct page *page,
                    unsigned int offset, unsigned int count)
 {
- struct dentry *dentry = file->f_dentry;
- struct rpc_cred *cred = nfs_file_cred(file);
+ struct rpc_cred *cred = NULL;
         loff_t base;
         unsigned int wsize = NFS_SERVER(inode)->wsize;
         int result, refresh = 0, written = 0, flags;
@@ -180,9 +179,13 @@
         struct nfs_fattr fattr;
         struct nfs_writeverf verf;
 
+
+ if (file)
+ cred = nfs_file_cred(file);
+
         lock_kernel();
- dprintk("NFS: nfs_writepage_sync(%s/%s %d@%Ld)\n",
- dentry->d_parent->d_name.name, dentry->d_name.name,
+ dprintk("NFS: nfs_writepage_sync(%x/%Ld %d@%Ld)\n",
+ inode->i_dev, (long long)NFS_FILEID(inode),
                 count, (long long)(page_offset(page) + offset));
 
         buffer = kmap(page) + offset;
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Thu Dec 07 2000 - 21:00:15 EST