summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/fs/fs_subr.c
diff options
context:
space:
mode:
authorRobert Thurlow <Robert.Thurlow@Sun.COM>2009-12-09 17:27:22 -0600
committerRobert Thurlow <Robert.Thurlow@Sun.COM>2009-12-09 17:27:22 -0600
commit2f172c55ef76964744bc62b4500ece87f3089b4d (patch)
tree68a197e4eb4d77acf9993e2e3d75c3f3b06f6a86 /usr/src/uts/common/fs/fs_subr.c
parent1dbbbf767041f5cea7771826e2efc21c03bbffda (diff)
downloadillumos-gate-2f172c55ef76964744bc62b4500ece87f3089b4d.tar.gz
6232737 Client should support NFS4ERR_MOVED and fs_locations
6232743 Server should support NFS4ERR_MOVED and fs_locations 6891289 client panick mutex_vector_tryenter with some stress testing
Diffstat (limited to 'usr/src/uts/common/fs/fs_subr.c')
-rw-r--r--usr/src/uts/common/fs/fs_subr.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/usr/src/uts/common/fs/fs_subr.c b/usr/src/uts/common/fs/fs_subr.c
index a465a97043..b1fec8b4ba 100644
--- a/usr/src/uts/common/fs/fs_subr.c
+++ b/usr/src/uts/common/fs/fs_subr.c
@@ -938,7 +938,7 @@ int
reparse_kderef(const char *svc_type, const char *svc_data, char *buf,
size_t *bufsize)
{
- int err, retries, need_free;
+ int err, retries, need_free, retried_doorhd;
size_t dlen, res_len;
char *darg;
door_arg_t door_args;
@@ -975,6 +975,7 @@ reparse_kderef(const char *svc_type, const char *svc_data, char *buf,
door_args.rsize = *bufsize;
/* do the door_call */
+ retried_doorhd = 0;
retries = 0;
door_ki_hold(rp_door);
while ((err = door_ki_upcall_limited(rp_door, &door_args,
@@ -987,10 +988,23 @@ reparse_kderef(const char *svc_type, const char *svc_data, char *buf,
} else if (err == EBADF) {
/* door server goes away... */
reparse_door_reset_handle();
+
+ if (retried_doorhd == 0) {
+ door_ki_rele(rp_door);
+ retried_doorhd++;
+ rp_door = reparse_door_get_handle();
+ if (rp_door != NULL) {
+ door_ki_hold(rp_door);
+ continue;
+ }
+ }
}
break;
}
- door_ki_rele(rp_door);
+
+ if (rp_door)
+ door_ki_rele(rp_door);
+
if (need_free)
kmem_free(darg, dlen); /* done with args buffer */