Print this page
Plug sharefs zone-shutdown leaks

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/sharefs/sharetab.c
          +++ new/usr/src/uts/common/fs/sharefs/sharetab.c
↓ open down ↓ 17 lines elided ↑ open up ↑
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  24   24   */
  25   25  
  26   26  /*
  27   27   * Copyright 2018 Nexenta Systems, Inc.
       28 + * Copyright 2019 Joyent, Inc.
  28   29   */
  29   30  
  30   31  #include <sys/types.h>
  31   32  #include <sys/types32.h>
  32   33  #include <sys/param.h>
  33   34  #include <sys/systm.h>
  34   35  #include <rpc/types.h>
  35   36  #include <sys/vfs.h>
  36   37  #include <sys/siginfo.h>
  37   38  #include <sys/proc.h>           /* for exit() declaration */
↓ open down ↓ 264 lines elided ↑ open up ↑
 302  303  
 303  304  /* ARGSUSED */
 304  305  static void
 305  306  sharetab_zone_fini(zoneid_t zoneid, void *data)
 306  307  {
 307  308          sharetab_globals_t *sg = data;
 308  309  
 309  310          rw_destroy(&sg->sharefs_lock);
 310  311          rw_destroy(&sg->sharetab_lock);
 311  312  
      313 +        /* ALL of the allocated things must be cleaned before we free sg. */
      314 +        while (sg->sharefs_sharetab != NULL) {
      315 +                int i;
      316 +                sharetab_t *freeing = sg->sharefs_sharetab;
      317 +
      318 +                sg->sharefs_sharetab = freeing->s_next;
      319 +                kmem_free(freeing->s_fstype, strlen(freeing->s_fstype) + 1);
      320 +                for (i = 0; i < PKP_HASH_SIZE; i++) {
      321 +                        sharefs_hash_head_t *bucket;
      322 +
      323 +                        bucket = &(freeing->s_buckets[i]);
      324 +                        while (bucket->ssh_sh != NULL) {
      325 +                                share_t *share = bucket->ssh_sh;
      326 +
      327 +                                bucket->ssh_sh = share->sh_next;
      328 +                                sharefree(share, NULL);
      329 +                        }
      330 +                }
      331 +                kmem_free(freeing, sizeof (*freeing));
      332 +        }
      333 +
 312  334          kmem_free(sg, sizeof (*sg));
 313  335  }
 314  336  
 315  337  void
 316  338  sharefs_sharetab_init(void)
 317  339  {
 318  340          zone_key_create(&sharetab_zone_key, sharetab_zone_init,
 319  341              NULL, sharetab_zone_fini);
 320  342  }
 321  343  
↓ open down ↓ 120 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX