diff options
author | Robert Thurlow <Robert.Thurlow@Sun.COM> | 2009-12-09 17:27:22 -0600 |
---|---|---|
committer | Robert Thurlow <Robert.Thurlow@Sun.COM> | 2009-12-09 17:27:22 -0600 |
commit | 2f172c55ef76964744bc62b4500ece87f3089b4d (patch) | |
tree | 68a197e4eb4d77acf9993e2e3d75c3f3b06f6a86 /usr/src/uts/common/fs/fs_subr.c | |
parent | 1dbbbf767041f5cea7771826e2efc21c03bbffda (diff) | |
download | illumos-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.c | 18 |
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 */ |