diff options
author | NeilBrown <neilb@suse.de> | 2009-06-03 15:48:08 -0400 |
---|---|---|
committer | Steve Dickson <steved@redhat.com> | 2009-06-03 15:48:08 -0400 |
commit | abf92485ae52bd637d544e2ac73147271b310a14 (patch) | |
tree | 07089784cdf051dbdaa98386eaf371b694acc23f /utils/mountd/mountd.c | |
parent | ab20f16a06e4f476b6480ddd27da724d14631411 (diff) | |
download | nfs-utils-abf92485ae52bd637d544e2ac73147271b310a14.tar.gz nfs-utils-abf92485ae52bd637d544e2ac73147271b310a14.tar.xz nfs-utils-abf92485ae52bd637d544e2ac73147271b310a14.zip |
Retry export if getfh fails.
mountd tries to avoid telling the kernel to export something
when the kernel already knows to do that.
However sometimes (exportfs -r) the kernel can be told
to forget something without mountd realising.
So if mountd finds that it cannot get a valid filehandle,
make sure it really has been exported to the kernel.
This only applies if the nfsd filesystem is not mounted.
Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'utils/mountd/mountd.c')
-rw-r--r-- | utils/mountd/mountd.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/utils/mountd/mountd.c b/utils/mountd/mountd.c index 25d292b..b59f939 100644 --- a/utils/mountd/mountd.c +++ b/utils/mountd/mountd.c @@ -467,8 +467,12 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, nfs_export **expret, return NULL; } } else { - if (exp->m_exported<1) + int did_export = 0; + retry: + if (exp->m_exported<1) { export_export(exp); + did_export = 1; + } if (!exp->m_xtabent) xtab_append(exp); @@ -482,6 +486,11 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, nfs_export **expret, fh = getfh_old ((struct sockaddr *) sin, stb.st_dev, stb.st_ino); } + if (fh == NULL && !did_export) { + exp->m_exported = 0; + goto retry; + } + if (fh == NULL) { xlog(L_WARNING, "getfh failed: %s", strerror(errno)); *error = NFSERR_ACCES; |