#define POLICYDB_VERSION_CONSTRAINT_NAMES      29
 #define POLICYDB_VERSION_XPERMS_IOCTL  30
 #define POLICYDB_VERSION_INFINIBAND            31
+#define POLICYDB_VERSION_GLBLUB                32
 
 /* Range of policy versions we understand*/
 #define POLICYDB_VERSION_MIN   POLICYDB_VERSION_BASE
-#define POLICYDB_VERSION_MAX   POLICYDB_VERSION_INFINIBAND
+#define POLICYDB_VERSION_MAX   POLICYDB_VERSION_GLBLUB
 
 /* Mask for just the mount related flags */
 #define SE_MNTMASK     0x0f
 
        return rc;
 }
 
+
+static inline int mls_context_glblub(struct context *dst,
+                                    struct context *c1, struct context *c2)
+{
+       struct mls_range *dr = &dst->range, *r1 = &c1->range, *r2 = &c2->range;
+       int rc = 0;
+
+       if (r1->level[1].sens < r2->level[0].sens ||
+           r2->level[1].sens < r1->level[0].sens)
+               /* These ranges have no common sensitivities */
+               return -EINVAL;
+
+       /* Take the greatest of the low */
+       dr->level[0].sens = max(r1->level[0].sens, r2->level[0].sens);
+
+       /* Take the least of the high */
+       dr->level[1].sens = min(r1->level[1].sens, r2->level[1].sens);
+
+       rc = ebitmap_and(&dr->level[0].cat,
+                        &r1->level[0].cat, &r2->level[0].cat);
+       if (rc)
+               goto out;
+
+       rc = ebitmap_and(&dr->level[1].cat,
+                        &r1->level[1].cat, &r2->level[1].cat);
+       if (rc)
+               goto out;
+
+out:
+       return rc;
+}
+
 static inline int mls_context_cmp(struct context *c1, struct context *c2)
 {
        return ((c1->range.level[0].sens == c2->range.level[0].sens) &&
 
        return 0;
 }
 
+int ebitmap_and(struct ebitmap *dst, struct ebitmap *e1, struct ebitmap *e2)
+{
+       struct ebitmap_node *n;
+       int bit, rc;
+
+       ebitmap_init(dst);
+
+       ebitmap_for_each_positive_bit(e1, n, bit) {
+               if (ebitmap_get_bit(e2, bit)) {
+                       rc = ebitmap_set_bit(dst, bit, 1);
+                       if (rc < 0)
+                               return rc;
+               }
+       }
+       return 0;
+}
+
+
 #ifdef CONFIG_NETLABEL
 /**
  * ebitmap_netlbl_export - Export an ebitmap into a NetLabel category bitmap
 
 
 int ebitmap_cmp(struct ebitmap *e1, struct ebitmap *e2);
 int ebitmap_cpy(struct ebitmap *dst, struct ebitmap *src);
+int ebitmap_and(struct ebitmap *dst, struct ebitmap *e1, struct ebitmap *e2);
 int ebitmap_contains(struct ebitmap *e1, struct ebitmap *e2, u32 last_e2bit);
 int ebitmap_get_bit(struct ebitmap *e, unsigned long bit);
 int ebitmap_set_bit(struct ebitmap *e, unsigned long bit, int value);
 
                        return mls_context_cpy_high(newcontext, tcontext);
                case DEFAULT_TARGET_LOW_HIGH:
                        return mls_context_cpy(newcontext, tcontext);
+               case DEFAULT_GLBLUB:
+                       return mls_context_glblub(newcontext,
+                                                 scontext, tcontext);
                }
 
                /* Fallthrough */
 
                .sym_num        = SYM_NUM,
                .ocon_num       = OCON_NUM,
        },
+       {
+               .version        = POLICYDB_VERSION_GLBLUB,
+               .sym_num        = SYM_NUM,
+               .ocon_num       = OCON_NUM,
+       },
 };
 
 static struct policydb_compat_info *policydb_lookup_compat(int version)
 
 #define DEFAULT_TARGET_LOW     4
 #define DEFAULT_TARGET_HIGH    5
 #define DEFAULT_TARGET_LOW_HIGH        6
+#define DEFAULT_GLBLUB         7
        char default_range;
 };