Print this page
NEX-16818 Add fksmbcl development tool
NEX-17264 SMB client test tp_smbutil_013 fails after NEX-14666
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
and: (fix ref leaks)
NEX-5665 SMB2 oplock leases
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
NEX-5665 SMB2 oplock leases
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
SMB-50 User-mode SMB server
 Includes work by these authors:
 Thomas Keiser <thomas.keiser@nexenta.com>
 Albert Lee <trisk@nexenta.com>
   1 /*
   2  * This file and its contents are supplied under the terms of the
   3  * Common Development and Distribution License ("CDDL"), version 1.0.
   4  * You may only use this file in accordance with the terms of version
   5  * 1.0 of the CDDL.
   6  *
   7  * A full copy of the text of the CDDL should have accompanied this
   8  * source.  A copy of the CDDL is also available via the Internet at
   9  * http://www.illumos.org/license/CDDL.
  10  */
  11 
  12 /*
  13  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
  14  */
  15 
  16 /*
  17  * rwlock(9f)
  18  */
  19 
  20 /* This is the API we're emulating */
  21 #include <sys/rwlock.h>
  22 
  23 #include <sys/errno.h>
  24 #include <sys/debug.h>
  25 #include <sys/param.h>
  26 #include <sys/synch32.h>
  27 #include <sys/thread.h>
  28 
  29 /* avoiding synch.h */
  30 int     rwlock_init(lwp_rwlock_t *, int, void *);
  31 int     rwlock_destroy(lwp_rwlock_t *);
  32 int     rw_rdlock(lwp_rwlock_t *);
  33 int     rw_wrlock(lwp_rwlock_t *);
  34 int     rw_unlock(lwp_rwlock_t *);
  35 int     rw_tryrdlock(lwp_rwlock_t *);
  36 int     rw_trywrlock(lwp_rwlock_t *);
  37 int     _rw_read_held(void *);
  38 int     _rw_write_held(void *);
  39 
  40 /*ARGSUSED*/
  41 void
  42 rw_init(krwlock_t *rwlp, char *name, krw_type_t type, void *arg)
  43 {
  44         (void) rwlock_init(&rwlp->rw_lock, USYNC_THREAD, NULL);
  45         rwlp->rw_owner = _KTHREAD_INVALID;
  46 }


  55 void
  56 rw_enter(krwlock_t *rwlp, krw_t rw)
  57 {
  58         int rc;
  59 
  60         if (rw == RW_READER) {
  61                 rc = rw_rdlock(&rwlp->rw_lock);
  62         } else {
  63                 rc = rw_wrlock(&rwlp->rw_lock);
  64                 rwlp->rw_owner = _curthread();
  65         }
  66         VERIFY(rc == 0);
  67 }
  68 
  69 void
  70 rw_exit(krwlock_t *rwlp)
  71 {
  72         if (_rw_write_held(&rwlp->rw_lock)) {
  73                 ASSERT(rwlp->rw_owner == _curthread());
  74                 rwlp->rw_owner = _KTHREAD_INVALID;


  75         }
  76         (void) rw_unlock(&rwlp->rw_lock);
  77 }
  78 
  79 int
  80 rw_tryenter(krwlock_t *rwlp, krw_t rw)
  81 {
  82         int rv;
  83 
  84         if (rw == RW_WRITER) {
  85                 rv = rw_trywrlock(&rwlp->rw_lock);
  86                 if (rv == 0)
  87                         rwlp->rw_owner = _curthread();
  88         } else
  89                 rv = rw_tryrdlock(&rwlp->rw_lock);
  90 
  91         return ((rv == 0) ? 1 : 0);
  92 }
  93 
  94 /*ARGSUSED*/


   1 /*
   2  * This file and its contents are supplied under the terms of the
   3  * Common Development and Distribution License ("CDDL"), version 1.0.
   4  * You may only use this file in accordance with the terms of version
   5  * 1.0 of the CDDL.
   6  *
   7  * A full copy of the text of the CDDL should have accompanied this
   8  * source.  A copy of the CDDL is also available via the Internet at
   9  * http://www.illumos.org/license/CDDL.
  10  */
  11 
  12 /*
  13  * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  14  */
  15 
  16 /*
  17  * rwlock(9f)
  18  */
  19 
  20 /* This is the API we're emulating */
  21 #include <sys/rwlock.h>
  22 
  23 #include <sys/errno.h>
  24 #include <sys/debug.h>
  25 #include <sys/param.h>

  26 #include <sys/thread.h>
  27 
  28 /* avoiding synch.h */
  29 int     rwlock_init(lwp_rwlock_t *, int, void *);
  30 int     rwlock_destroy(lwp_rwlock_t *);
  31 int     rw_rdlock(lwp_rwlock_t *);
  32 int     rw_wrlock(lwp_rwlock_t *);
  33 int     rw_unlock(lwp_rwlock_t *);
  34 int     rw_tryrdlock(lwp_rwlock_t *);
  35 int     rw_trywrlock(lwp_rwlock_t *);
  36 int     _rw_read_held(void *);
  37 int     _rw_write_held(void *);
  38 
  39 /*ARGSUSED*/
  40 void
  41 rw_init(krwlock_t *rwlp, char *name, krw_type_t type, void *arg)
  42 {
  43         (void) rwlock_init(&rwlp->rw_lock, USYNC_THREAD, NULL);
  44         rwlp->rw_owner = _KTHREAD_INVALID;
  45 }


  54 void
  55 rw_enter(krwlock_t *rwlp, krw_t rw)
  56 {
  57         int rc;
  58 
  59         if (rw == RW_READER) {
  60                 rc = rw_rdlock(&rwlp->rw_lock);
  61         } else {
  62                 rc = rw_wrlock(&rwlp->rw_lock);
  63                 rwlp->rw_owner = _curthread();
  64         }
  65         VERIFY(rc == 0);
  66 }
  67 
  68 void
  69 rw_exit(krwlock_t *rwlp)
  70 {
  71         if (_rw_write_held(&rwlp->rw_lock)) {
  72                 ASSERT(rwlp->rw_owner == _curthread());
  73                 rwlp->rw_owner = _KTHREAD_INVALID;
  74         } else {
  75                 ASSERT(_rw_read_held(&rwlp->rw_lock));
  76         }
  77         (void) rw_unlock(&rwlp->rw_lock);
  78 }
  79 
  80 int
  81 rw_tryenter(krwlock_t *rwlp, krw_t rw)
  82 {
  83         int rv;
  84 
  85         if (rw == RW_WRITER) {
  86                 rv = rw_trywrlock(&rwlp->rw_lock);
  87                 if (rv == 0)
  88                         rwlp->rw_owner = _curthread();
  89         } else
  90                 rv = rw_tryrdlock(&rwlp->rw_lock);
  91 
  92         return ((rv == 0) ? 1 : 0);
  93 }
  94 
  95 /*ARGSUSED*/