changeset 12631:7312bbaa193c

6906432 File system space on globalfilesystem shared by NFS not returned after rm(1) of files on NFS clients 6952856 Minor inconsistencies in rfs4_dss_clear_oldstate() 6954235 ASSERT() in the rfs4_state_has_access() have no effect
author Marcel Telka <Marcel.Telka@Sun.COM>
date Wed, 16 Jun 2010 16:07:57 +0200
parents e9b26c370c79
children 2e5ce9dbe1f9
files usr/src/uts/common/fs/nfs/nfs4_state.c
diffstat 1 files changed, 10 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/fs/nfs/nfs4_state.c	Wed Jun 16 10:53:17 2010 +0100
+++ b/usr/src/uts/common/fs/nfs/nfs4_state.c	Wed Jun 16 16:07:57 2010 +0200
@@ -19,8 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
  */
 
 #include <sys/systm.h>
@@ -741,8 +740,10 @@
 	rw_enter(&sip->oldstate_lock, RW_WRITER);
 	os_head = sip->oldstate;
 
-	if (os_head == NULL)
+	if (os_head == NULL) {
+		rw_exit(&sip->oldstate_lock);
 		return;
+	}
 
 	/* skip dummy entry */
 	osp = os_head->next;
@@ -754,8 +755,7 @@
 
 		if (osp->cl_id4.id_val)
 			kmem_free(osp->cl_id4.id_val, osp->cl_id4.id_len);
-		if (osp->ss_pn)
-			kmem_free(osp->ss_pn, sizeof (rfs4_ss_pn_t));
+		rfs4_ss_pnfree(osp->ss_pn);
 
 		os_next = osp->next;
 		remque(osp);
@@ -763,11 +763,6 @@
 		osp = os_next;
 	}
 
-	/* free dummy entry */
-	kmem_free(osp, sizeof (rfs4_oldstate_t));
-
-	sip->oldstate = NULL;
-
 	rw_exit(&sip->oldstate_lock);
 }
 
@@ -2910,6 +2905,9 @@
 	if (rfs4_dbe_is_invalid(dsp->rds_dbe))
 		return (TRUE);
 
+	if (dsp->rds_dtype == OPEN_DELEGATE_NONE)
+		return (TRUE);
+
 	if ((gethrestime_sec() - dsp->rds_client->rc_last_access
 	    > rfs4_lease_time)) {
 		rfs4_dbe_invalidate(dsp->rds_dbe);
@@ -3529,8 +3527,8 @@
 				 */
 				if (sp->rs_share_deny & OPEN4_SHARE_DENY_READ)
 					deny_read = 1;
-				ASSERT(fp->rf_deny_read - deny_read >= 0);
-				if (fp->rf_deny_read - deny_read > 0)
+				ASSERT(fp->rf_deny_read >= deny_read);
+				if (fp->rf_deny_read > deny_read)
 					stat = NFS4ERR_OPENMODE;
 				rfs4_dbe_unlock(fp->rf_dbe);
 				rfs4_file_rele(fp);