Whamcloud - gitweb
LU-12691 ldlm: obd_max_recoverable_clients is not atomic
[fs/lustre-release.git] / lustre / obdclass / idmap.c
index 6652f89..1fcbb2a 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
+ * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * GPL HEADER END
  */
@@ -27,7 +23,7 @@
  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2012, 2014, Intel Corporation.
+ * Copyright (c) 2012, 2017, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
 #include <md_object.h>
 #include <obd_support.h>
 
-#define lustre_get_group_info(group_info) do {         \
-       atomic_inc(&(group_info)->usage);               \
-} while (0)
-
-#define lustre_put_group_info(group_info) do {         \
-       if (atomic_dec_and_test(&(group_info)->usage))  \
-               groups_free(group_info);                \
-} while (0)
-
 /*
  * groups_search() is copied from linux kernel!
  * A simple bsearch.
@@ -91,6 +78,9 @@ static int lustre_groups_search(struct group_info *group_info,
 
 void lustre_groups_from_list(struct group_info *ginfo, gid_t *glist)
 {
+#ifdef HAVE_GROUP_INFO_GID
+       memcpy(ginfo->gid, glist, ginfo->ngroups * sizeof(__u32));
+#else
        int i;
        int count = ginfo->ngroups;
 
@@ -103,6 +93,7 @@ void lustre_groups_from_list(struct group_info *ginfo, gid_t *glist)
                memcpy(ginfo->blocks[i], glist + off, len);
                count -= cp_count;
        }
+#endif
 }
 EXPORT_SYMBOL(lustre_groups_from_list);
 
@@ -110,12 +101,12 @@ EXPORT_SYMBOL(lustre_groups_from_list);
 /* a simple shell-metzner sort */
 void lustre_groups_sort(struct group_info *group_info)
 {
-        int base, max, stride;
-        int gidsetsize = group_info->ngroups;
+       int base, max, stride;
+       int gidsetsize = group_info->ngroups;
 
-        for (stride = 1; stride < gidsetsize; stride = 3 * stride + 1)
-                ; /* nothing */
-        stride /= 3;
+       for (stride = 1; stride < gidsetsize; stride = 3 * stride + 1)
+               ; /* nothing */
+       stride /= 3;
 
        while (stride) {
                max = gidsetsize - stride;
@@ -162,9 +153,10 @@ int lustre_in_group_p(struct lu_ucred *mu, gid_t grp)
                if (!group_info)
                        return 0;
 
-               lustre_get_group_info(group_info);
+               atomic_inc(&group_info->usage);
                rc = lustre_groups_search(group_info, grp);
-               lustre_put_group_info(group_info);
+               if (atomic_dec_and_test(&group_info->usage))
+                       groups_free(group_info);
        }
        return rc;
 }