Print this page
NEX-18761 panic in smb_ofile_free with vdbench
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-15578 SMB2 durable handle redesign
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-15069 smtorture smb2.create.blob is failed
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-15578 SMB2 durable handle redesign
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-15069 smtorture smb2.create.blob is failed
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-4053 Customer DIR command hangs with smb2 enabled
NEX-4080 SMB_ODIR_FLAG_WILDCARDS can be incorrectly inherited
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
NEX-2058 Access Based Enumeration partially working in 4.0.1
OS-143 Cpqary3 driver does not see drives on P400 Smart-Array
SUP-813 Directory's are not visible or deleteable though CIFS
SMB-11 SMB2 message parse & dispatch
SMB-12 SMB2 Negotiate Protocol
SMB-13 SMB2 Session Setup
SMB-14 SMB2 Logoff
SMB-15 SMB2 Tree Connect
SMB-16 SMB2 Tree Disconnect
SMB-17 SMB2 Create
SMB-18 SMB2 Close
SMB-19 SMB2 Flush
SMB-20 SMB2 Read
SMB-21 SMB2 Write
SMB-22 SMB2 Lock/Unlock
SMB-23 SMB2 Ioctl
SMB-24 SMB2 Cancel
SMB-25 SMB2 Echo
SMB-26 SMB2 Query Dir
SMB-27 SMB2 Change Notify
SMB-28 SMB2 Query Info
SMB-29 SMB2 Set Info
SMB-30 SMB2 Oplocks
SMB-53 SMB2 Create Context options
(SMB2 code review cleanup 1, 2, 3)
SMB-65 SMB server in non-global zones (use zone_kcred())
SMB-65 SMB server in non-global zones (kmem_caches)
common kmem_cache instances across zones
separate GZ-only init from NGZ init
SMB-63 taskq_create_proc ... TQ_DYNAMIC puts tasks in p0
re #11974 CIFS Share - Tree connect fails from Windows 7 Clients
re #7815 SMB server delivers old modification time...
re #6854 FindFirstFile,FindFirstFileEx,... are not working correctly on Nexenta CIFS-shares
re #10733 Windows 7 directory listing keeps restarting (fix lint)
re #10733 Windows 7 directory listing keeps restarting
*** 18,28 ****
*
* CDDL HEADER END
*/
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
! * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
*/
/*
* General Structures Layout
* -------------------------
--- 18,28 ----
*
* CDDL HEADER END
*/
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
! * Copyright 2018 Nexenta Systems, Inc. All rights reserved.
*/
/*
* General Structures Layout
* -------------------------
*** 262,271 ****
--- 262,272 ----
smb_odirent_t *, smb_fileinfo_t *);
static int smb_odir_next_odirent(smb_odir_t *, smb_odirent_t *);
static boolean_t smb_odir_lookup_link(smb_request_t *, smb_odir_t *,
char *, smb_node_t **);
static boolean_t smb_odir_match_name(smb_odir_t *, smb_odirent_t *);
+ static void smb_odir_delete(void *);
/*
* smb_odir_openpath
*
*** 443,452 ****
--- 444,455 ----
* a list while an iteration may be in progress.
*/
void
smb_odir_release(smb_odir_t *od)
{
+ smb_tree_t *tree = od->d_tree;
+
SMB_ODIR_VALID(od);
mutex_enter(&od->d_mutex);
ASSERT(od->d_refcnt > 0);
*** 460,470 ****
break;
case SMB_ODIR_STATE_CLOSING:
od->d_refcnt--;
if (od->d_refcnt == 0) {
od->d_state = SMB_ODIR_STATE_CLOSED;
! smb_tree_post_odir(od->d_tree, od);
}
break;
case SMB_ODIR_STATE_CLOSED:
default:
break;
--- 463,474 ----
break;
case SMB_ODIR_STATE_CLOSING:
od->d_refcnt--;
if (od->d_refcnt == 0) {
od->d_state = SMB_ODIR_STATE_CLOSED;
! smb_llist_post(&tree->t_odir_list, od,
! smb_odir_delete);
}
break;
case SMB_ODIR_STATE_CLOSED:
default:
break;
*** 987,997 ****
* Delete an odir.
*
* Remove the odir from the tree list before freeing resources
* associated with the odir.
*/
! void
smb_odir_delete(void *arg)
{
smb_tree_t *tree;
smb_odir_t *od = (smb_odir_t *)arg;
--- 991,1001 ----
* Delete an odir.
*
* Remove the odir from the tree list before freeing resources
* associated with the odir.
*/
! static void
smb_odir_delete(void *arg)
{
smb_tree_t *tree;
smb_odir_t *od = (smb_odir_t *)arg;
*** 1005,1014 ****
--- 1009,1025 ----
if (od->d_odid != 0)
smb_idpool_free(&tree->t_odid_pool, od->d_odid);
atomic_dec_32(&tree->t_session->s_dir_cnt);
smb_llist_exit(&tree->t_odir_list);
+ /*
+ * This ofile is no longer on t_odir_list, however...
+ *
+ * This is called via smb_llist_post, which means it may run
+ * BEFORE smb_odir_release drops d_mutex (if another thread
+ * flushes the delete queue before we do). Synchronize.
+ */
mutex_enter(&od->d_mutex);
mutex_exit(&od->d_mutex);
od->d_magic = 0;
smb_node_release(od->d_dnode);
*** 1046,1061 ****
int reclen;
int eof;
dirent64_t *dp;
edirent_t *edp;
char *np;
! uint32_t abe_flag = 0;
ASSERT(MUTEX_HELD(&od->d_mutex));
bzero(odirent, sizeof (smb_odirent_t));
if (od->d_bufptr != NULL) {
if (od->d_flags & SMB_ODIR_FLAG_EDIRENT)
reclen = od->d_edp->ed_reclen;
else
reclen = od->d_dp->d_reclen;
--- 1057,1077 ----
int reclen;
int eof;
dirent64_t *dp;
edirent_t *edp;
char *np;
! uint32_t rddir_flags = 0;
ASSERT(MUTEX_HELD(&od->d_mutex));
bzero(odirent, sizeof (smb_odirent_t));
+ if (od->d_flags & SMB_ODIR_FLAG_ABE)
+ rddir_flags |= SMB_ABE;
+ if (od->d_flags & SMB_ODIR_FLAG_EDIRENT)
+ rddir_flags |= SMB_EDIRENT;
+
if (od->d_bufptr != NULL) {
if (od->d_flags & SMB_ODIR_FLAG_EDIRENT)
reclen = od->d_edp->ed_reclen;
else
reclen = od->d_dp->d_reclen;
*** 1073,1087 ****
if (od->d_eof)
return (ENOENT);
od->d_bufsize = sizeof (od->d_buf);
- if (od->d_flags & SMB_ODIR_FLAG_ABE)
- abe_flag = SMB_ABE;
-
rc = smb_vop_readdir(od->d_dnode->vp, od->d_offset,
! od->d_buf, &od->d_bufsize, &eof, abe_flag, od->d_cred);
if ((rc == 0) && (od->d_bufsize == 0))
rc = ENOENT;
if (rc != 0) {
--- 1089,1100 ----
if (od->d_eof)
return (ENOENT);
od->d_bufsize = sizeof (od->d_buf);
rc = smb_vop_readdir(od->d_dnode->vp, od->d_offset,
! od->d_buf, &od->d_bufsize, &eof, rddir_flags, od->d_cred);
if ((rc == 0) && (od->d_bufsize == 0))
rc = ENOENT;
if (rc != 0) {