diff options
author | pf199842 <none@none> | 2006-09-11 09:30:49 -0700 |
---|---|---|
committer | pf199842 <none@none> | 2006-09-11 09:30:49 -0700 |
commit | d19d822796ad55c5dba63d1edee11792d6465eb7 (patch) | |
tree | 3a0f0fe7b98d0fc1f42553f31a4c1b12f72caca8 /usr/src | |
parent | fb30ca63f87a9c0edbb4c0693515b012d8e0686d (diff) | |
download | illumos-joyent-d19d822796ad55c5dba63d1edee11792d6465eb7.tar.gz |
6421340 nfssrv:nfslog_write_logrecords() does not release vnode rwlock on ENOSPC condtion..recursive rwenter
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/fs/nfs/nfs_log.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/usr/src/uts/common/fs/nfs/nfs_log.c b/usr/src/uts/common/fs/nfs/nfs_log.c index fe7585a429..fec1b917f2 100644 --- a/usr/src/uts/common/fs/nfs/nfs_log.c +++ b/usr/src/uts/common/fs/nfs/nfs_log.c @@ -835,11 +835,13 @@ nfslog_write_logrecords(struct log_file *lfp, if ((error = VOP_GETATTR(vp, &va, 0, CRED())) == 0) { if ((len + va.va_size) < (MAXOFF32_T)) { error = VOP_WRITE(vp, &uio, ioflag, CRED(), NULL); + VOP_RWUNLOCK(vp, V_WRITELOCK_TRUE, NULL); if (uio.uio_resid) error = ENOSPC; if (error) (void) VOP_SETATTR(vp, &va, 0, CRED(), NULL); } else { + VOP_RWUNLOCK(vp, V_WRITELOCK_TRUE, NULL); if (!(lfp->lf_flags & L_PRINTED)) { cmn_err(CE_WARN, "NFS Logging: buffer file %s exceeds 2GB; " @@ -847,8 +849,9 @@ nfslog_write_logrecords(struct log_file *lfp, } error = ENOSPC; } + } else { + VOP_RWUNLOCK(vp, V_WRITELOCK_TRUE, NULL); } - VOP_RWUNLOCK(vp, V_WRITELOCK_TRUE, NULL); kmem_free(iovp, size_iovecs); |