summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/fs/smbsrv/smb_ofile.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/fs/smbsrv/smb_ofile.c')
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_ofile.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/usr/src/uts/common/fs/smbsrv/smb_ofile.c b/usr/src/uts/common/fs/smbsrv/smb_ofile.c
index 6f132cebd3..1d7a5c134f 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_ofile.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_ofile.c
@@ -449,6 +449,20 @@ smb_ofile_close(smb_ofile_t *of, int32_t mtime_sec)
SMB_OFILE_VALID(of);
+ if (of->f_ftype == SMB_FTYPE_DISK) {
+ smb_node_t *node = of->f_node;
+
+ smb_llist_enter(&node->n_ofile_list, RW_READER);
+ mutex_enter(&node->n_oplock.ol_mutex);
+
+ if (of->f_lease != NULL)
+ smb2_lease_ofile_close(of);
+ smb_oplock_break_CLOSE(node, of);
+
+ mutex_exit(&node->n_oplock.ol_mutex);
+ smb_llist_exit(&node->n_ofile_list);
+ }
+
mutex_enter(&of->f_mutex);
ASSERT(of->f_refcnt);
@@ -479,9 +493,6 @@ smb_ofile_close(smb_ofile_t *of, int32_t mtime_sec)
smb2_dh_close_persistent(of);
if (of->f_persistid != 0)
smb_ofile_del_persistid(of);
- if (of->f_lease != NULL)
- smb2_lease_ofile_close(of);
- smb_oplock_break_CLOSE(of->f_node, of);
/* FALLTHROUGH */
case SMB_FTYPE_PRINTER: /* or FTYPE_DISK */
@@ -1442,11 +1453,18 @@ smb_ofile_delete(void *arg)
*/
if (of->f_ftype == SMB_FTYPE_DISK ||
of->f_ftype == SMB_FTYPE_PRINTER) {
- ASSERT(of->f_node != NULL);
+ smb_node_t *node = of->f_node;
+
+ /*
+ * Oplock cleanup should have made sure that
+ * excl_open does not point to this ofile.
+ */
+ VERIFY(node->n_oplock.excl_open != of);
+
/*
* Note smb_ofile_close did smb_node_dec_open_ofiles()
*/
- smb_node_rem_ofile(of->f_node, of);
+ smb_node_rem_ofile(node, of);
}
/*