|
@@ -74,9 +74,12 @@ static struct list_head family_ht[GENL_FAM_TAB_SIZE];
|
|
|
* Bit 17 is marked as already used since the VFS quota code
|
|
|
* also abused this API and relied on family == group ID, we
|
|
|
* cater to that by giving it a static family and group ID.
|
|
|
+ * Bit 18 is marked as already used since the PMCRAID driver
|
|
|
+ * did the same thing as the VFS quota code (maybe copied?)
|
|
|
*/
|
|
|
static unsigned long mc_group_start = 0x3 | BIT(GENL_ID_CTRL) |
|
|
|
- BIT(GENL_ID_VFS_DQUOT);
|
|
|
+ BIT(GENL_ID_VFS_DQUOT) |
|
|
|
+ BIT(GENL_ID_PMCRAID);
|
|
|
static unsigned long *mc_groups = &mc_group_start;
|
|
|
static unsigned long mc_groups_longs = 1;
|
|
|
|
|
@@ -139,6 +142,7 @@ static u16 genl_generate_id(void)
|
|
|
|
|
|
for (i = 0; i <= GENL_MAX_ID - GENL_MIN_ID; i++) {
|
|
|
if (id_gen_idx != GENL_ID_VFS_DQUOT &&
|
|
|
+ id_gen_idx != GENL_ID_PMCRAID &&
|
|
|
!genl_family_find_byid(id_gen_idx))
|
|
|
return id_gen_idx;
|
|
|
if (++id_gen_idx > GENL_MAX_ID)
|
|
@@ -236,9 +240,12 @@ static int genl_validate_assign_mc_groups(struct genl_family *family)
|
|
|
} else if (strcmp(family->name, "NET_DM") == 0) {
|
|
|
first_id = 1;
|
|
|
BUG_ON(n_groups != 1);
|
|
|
- } else if (strcmp(family->name, "VFS_DQUOT") == 0) {
|
|
|
+ } else if (family->id == GENL_ID_VFS_DQUOT) {
|
|
|
first_id = GENL_ID_VFS_DQUOT;
|
|
|
BUG_ON(n_groups != 1);
|
|
|
+ } else if (family->id == GENL_ID_PMCRAID) {
|
|
|
+ first_id = GENL_ID_PMCRAID;
|
|
|
+ BUG_ON(n_groups != 1);
|
|
|
} else {
|
|
|
groups_allocated = true;
|
|
|
err = genl_allocate_reserve_groups(n_groups, &first_id);
|