Print this page
11929 mac_minor_hold() gets id_alloc_nosleep() wrong
        
*** 19,29 ****
   * CDDL HEADER END
   */
  
  /*
   * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
!  * Copyright (c) 2017, Joyent, Inc.
   * Copyright 2015 Garrett D'Amore <garrett@damore.org>
   */
  
  /*
   * MAC Services Module
--- 19,29 ----
   * CDDL HEADER END
   */
  
  /*
   * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
!  * Copyright 2019 Joyent, Inc.
   * Copyright 2015 Garrett D'Amore <garrett@damore.org>
   */
  
  /*
   * MAC Services Module
*** 2285,2312 ****
   * Allocate a minor number.
   */
  minor_t
  mac_minor_hold(boolean_t sleep)
  {
!         minor_t minor;
  
          /*
           * Grab a value from the arena.
           */
          atomic_inc_32(&minor_count);
  
          if (sleep)
!                 minor = (uint_t)id_alloc(minor_ids);
!         else
!                 minor = (uint_t)id_alloc_nosleep(minor_ids);
  
!         if (minor == 0) {
                  atomic_dec_32(&minor_count);
                  return (0);
          }
  
!         return (minor);
  }
  
  /*
   * Release a previously allocated minor number.
   */
--- 2285,2310 ----
   * Allocate a minor number.
   */
  minor_t
  mac_minor_hold(boolean_t sleep)
  {
!         id_t id;
  
          /*
           * Grab a value from the arena.
           */
          atomic_inc_32(&minor_count);
  
          if (sleep)
!                 return ((uint_t)id_alloc(minor_ids));
  
!         if ((id = id_alloc_nosleep(minor_ids)) == -1) {
                  atomic_dec_32(&minor_count);
                  return (0);
          }
  
!         return ((uint_t)id);
  }
  
  /*
   * Release a previously allocated minor number.
   */