.br
- quota_ops, to allow quota modifications.
.br
+- server_upcall, to define which identity upcall to use. If set, identity upcall
+is defined by server side tunable. If not set, identity upcall is forced to
+INTERNAL, so that servers trust supplementary groups as provided by clients.
+.br
Apart from all, any role not explicitly specified is forbidden. And to forbid
all roles, use 'none' value.
.RE
{ NODEMAP_RBAC_BYFID_OPS, "byfid_ops" },
{ NODEMAP_RBAC_CHLG_OPS, "chlg_ops" },
{ NODEMAP_RBAC_FSCRYPT_ADMIN, "fscrypt_admin" },
+ { NODEMAP_RBAC_SERVER_UPCALL, "server_upcall" },
};
struct nodemap_pde {
int uc_rbac_byfid_ops:1;
int uc_rbac_chlg_ops:1;
int uc_rbac_fscrypt_admin:1;
+ int uc_rbac_server_upcall:1;
};
struct lu_ucred *lu_ucred(const struct lu_env *env);
NODEMAP_RBAC_BYFID_OPS = 0x00000008,
NODEMAP_RBAC_CHLG_OPS = 0x00000010,
NODEMAP_RBAC_FSCRYPT_ADMIN = 0x00000020,
+ NODEMAP_RBAC_SERVER_UPCALL = 0x00000040,
NODEMAP_RBAC_NONE = (__u32)~(NODEMAP_RBAC_FILE_PERMS |
NODEMAP_RBAC_DNE_OPS |
NODEMAP_RBAC_QUOTA_OPS |
NODEMAP_RBAC_BYFID_OPS |
NODEMAP_RBAC_CHLG_OPS |
- NODEMAP_RBAC_FSCRYPT_ADMIN),
+ NODEMAP_RBAC_FSCRYPT_ADMIN |
+ NODEMAP_RBAC_SERVER_UPCALL),
NODEMAP_RBAC_ALL = 0xFFFFFFFF, /* future caps ON by default */
};
uc->uc_rbac_byfid_ops = 1;
uc->uc_rbac_chlg_ops = 1;
uc->uc_rbac_fscrypt_admin = 1;
+ uc->uc_rbac_server_upcall = 1;
RETURN(0);
}
mdt_ucred(info)->uc_rbac_byfid_ops = 1;
mdt_ucred(info)->uc_rbac_chlg_ops = 1;
mdt_ucred(info)->uc_rbac_fscrypt_admin = 1;
+ mdt_ucred(info)->uc_rbac_server_upcall = 1;
rc = mdt_add_dirty_flag(info, mfd->mfd_object, &info->mti_attr);
lu_context_exit(&ses);
uc->uc_rbac_byfid_ops = !!(rbac & NODEMAP_RBAC_BYFID_OPS);
uc->uc_rbac_chlg_ops = !!(rbac & NODEMAP_RBAC_CHLG_OPS);
uc->uc_rbac_fscrypt_admin = !!(rbac & NODEMAP_RBAC_FSCRYPT_ADMIN);
+ uc->uc_rbac_server_upcall = !!(rbac & NODEMAP_RBAC_SERVER_UPCALL);
}
static int new_init_ucred(struct mdt_thread_info *info, ucred_init_type_t type,
uc->uc_rbac_byfid_ops = 1;
uc->uc_rbac_chlg_ops = 1;
uc->uc_rbac_fscrypt_admin = 1;
+ uc->uc_rbac_server_upcall = 1;
task = kthread_create(mdt_restriper_main, info, "mdt_restriper_%03d",
mdt_seq_site(mdt)->ss_node_id);
ucred->uc_rbac_byfid_ops = 1;
ucred->uc_rbac_chlg_ops = 1;
ucred->uc_rbac_fscrypt_admin = 1;
+ ucred->uc_rbac_server_upcall = 1;
}
static void echo_ucred_fini(struct lu_env *env)
(unsigned)NODEMAP_RBAC_CHLG_OPS);
LASSERTF(NODEMAP_RBAC_FSCRYPT_ADMIN == 0x00000020UL, "found 0x%.8xUL\n",
(unsigned)NODEMAP_RBAC_FSCRYPT_ADMIN);
- LASSERTF(NODEMAP_RBAC_NONE == 0xffffffc0UL, "found 0x%.8xUL\n",
+ LASSERTF(NODEMAP_RBAC_SERVER_UPCALL == 0x00000040UL, "found 0x%.8xUL\n",
+ (unsigned)NODEMAP_RBAC_SERVER_UPCALL);
+ LASSERTF(NODEMAP_RBAC_NONE == 0xffffff80UL, "found 0x%.8xUL\n",
(unsigned)NODEMAP_RBAC_NONE);
LASSERTF(NODEMAP_RBAC_ALL == 0xffffffffUL, "found 0x%.8xUL\n",
(unsigned)NODEMAP_RBAC_ALL);
byfid_ops \
chlg_ops \
fscrypt_admin \
+ server_upcall \
;
do
[[ "$rbac" =~ "$role" ]] ||
CHECK_VALUE_X(NODEMAP_RBAC_BYFID_OPS);
CHECK_VALUE_X(NODEMAP_RBAC_CHLG_OPS);
CHECK_VALUE_X(NODEMAP_RBAC_FSCRYPT_ADMIN);
+ CHECK_VALUE_X(NODEMAP_RBAC_SERVER_UPCALL);
CHECK_VALUE_X(NODEMAP_RBAC_NONE);
CHECK_VALUE_X(NODEMAP_RBAC_ALL);
}
(unsigned)NODEMAP_RBAC_CHLG_OPS);
LASSERTF(NODEMAP_RBAC_FSCRYPT_ADMIN == 0x00000020UL, "found 0x%.8xUL\n",
(unsigned)NODEMAP_RBAC_FSCRYPT_ADMIN);
- LASSERTF(NODEMAP_RBAC_NONE == 0xffffffc0UL, "found 0x%.8xUL\n",
+ LASSERTF(NODEMAP_RBAC_SERVER_UPCALL == 0x00000040UL, "found 0x%.8xUL\n",
+ (unsigned)NODEMAP_RBAC_SERVER_UPCALL);
+ LASSERTF(NODEMAP_RBAC_NONE == 0xffffff80UL, "found 0x%.8xUL\n",
(unsigned)NODEMAP_RBAC_NONE);
LASSERTF(NODEMAP_RBAC_ALL == 0xffffffffUL, "found 0x%.8xUL\n",
(unsigned)NODEMAP_RBAC_ALL);