From: Steve Dickson <SteveD@redhat.com>
To: nfs@lists.sourceforge.net
Subject: [PATCH] Reinstantiating stale inodes
Date: Fri, 23 Apr 2004 10:15:35 -0400 [thread overview]
Message-ID: <40892507.2030004@RedHat.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 1049 bytes --]
Here is a 2.4 patch that will reinstantiate an inode
when a ESTALE error is returned on a getattr. When
the error occurs, a lookup is immediately issued
to get a new fh.
The fixes the problem of a server rsync -a directory
that a client has mounted. The key being the -a flag
since it causes the server not to update the mtime on
the directory.
My initial efforts was to make nfs_lookup_revalidate()
a bit smarter with the use of ctimes but turns out
that when nfs_lookup_revalidate() does no caching
(i.e. an otw lookup is issued on every call) the
ESTALEs still occurred.
Then I turned my attention to __nfs_refresh_inode() and
had it used ctime in its calculations of what is
and is not valid... This did work, but it cause a significant
amount of extra otw traffic (using the cthon test suite) for
the non error cases. The one thing good about this patch (imho)
is the extra lookups only occur after an error that generally
does not happen...
Comments would be appreciated, especially about how
I'm reinstantiating the dentry....
SteveD.
[-- Attachment #2: linux-2.4.21-nfs-estale.patch --]
[-- Type: text/plain, Size: 1413 bytes --]
--- linux-2.4.21/fs/nfs/inode.c.org 2004-04-17 18:26:32.000000000 -0400
+++ linux-2.4.21/fs/nfs/inode.c 2004-04-23 03:19:51.000000000 -0400
@@ -953,13 +953,57 @@ nfs_wait_on_inode(struct inode *inode, i
}
/*
+ * Reinstantiate an inode that has gone stale
+ */
+static int
+nfs_reinstantiate(
+ struct inode *dir,
+ struct dentry *dentry,
+ struct nfs_fattr *fattr)
+{
+ int error;
+ struct nfs_fh fhandle;
+ struct inode *inode;
+
+ error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, &fhandle, &fattr);
+ if (!error) {
+ error = -ENOMEM;
+ inode = nfs_fhget(dentry, &fhandle, &fattr);
+ if (inode) {
+ d_drop(dentry);
+ dput(dentry);
+ d_instantiate(dentry, inode);
+ dentry->d_time = jiffies;
+ error = 0;
+ }
+ }
+ return error;
+}
+
+/*
* Externally visible revalidation function
*/
int
nfs_revalidate(struct dentry *dentry)
{
struct inode *inode = dentry->d_inode;
- return nfs_revalidate_inode(NFS_SERVER(inode), inode);
+ struct inode *pinode;
+ struct nfs_fattr fattr;
+ int error;
+
+ error = nfs_revalidate_inode(NFS_SERVER(inode), inode);
+ if (!error || error != -ESTALE)
+ return error;
+ /*
+ * We have a stale fh so ask the server for another one
+ */
+ pinode = dentry->d_parent->d_inode;
+ if (nfs_reinstantiate(pinode, dentry, &fattr) == 0) {
+ inode = dentry->d_inode;
+ if (nfs_refresh_inode(inode, &fattr) == 0)
+ error = 0;
+ }
+ return error;
}
/*
next reply other threads:[~2004-04-23 14:15 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-04-23 14:15 Steve Dickson [this message]
2004-04-23 14:33 ` [PATCH] Reinstantiating stale inodes Olaf Kirch
2004-04-23 15:50 ` Steve Dickson
2004-04-23 17:55 ` Olaf Kirch
2004-04-23 18:43 ` Steve Dickson
2004-04-23 18:50 ` Olaf Kirch
2004-04-23 20:07 ` Steve Dickson
2004-04-23 14:36 ` Trond Myklebust
2004-04-23 16:01 ` Steve Dickson
2004-04-23 16:21 ` Trond Myklebust
2004-04-23 17:21 ` Steve Dickson
2004-04-23 17:49 ` Trond Myklebust
2004-04-23 19:14 ` Steve Dickson
[not found] ` <40892DC0.1010001@redhat.com>
2004-04-23 16:04 ` Steve Dickson
2004-05-01 16:13 ` Steve Dickson
2004-05-01 19:25 ` Trond Myklebust
2004-05-01 23:57 ` Steve Dickson
2004-05-02 0:22 ` Trond Myklebust
2004-05-02 3:19 ` Steve Dickson
2004-05-02 3:28 ` Trond Myklebust
2004-05-03 19:50 ` Steve Dickson
2004-05-03 20:15 ` Trond Myklebust
2004-05-03 20:33 ` Steve Dickson
2004-05-03 21:27 ` Trond Myklebust
2004-05-04 19:05 ` Steve Dickson
2004-05-06 17:39 ` Steve Dickson
-- strict thread matches above, loose matches on Subject: below --
2004-04-23 14:48 Lever, Charles
2004-04-23 15:00 ` Trond Myklebust
2004-04-23 16:16 ` Steve Dickson
2004-04-23 15:08 ` Olaf Kirch
2004-04-23 15:17 Lever, Charles
2004-04-23 16:16 Lever, Charles
2004-04-23 16:27 ` Steve Dickson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=40892507.2030004@RedHat.com \
--to=steved@redhat.com \
--cc=nfs@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.