return 0;
}
-/* reverse map */
+/*
+ * Reverse map
+ * Do not ignore rootsquash.
+ */
void mdt_body_reverse_idmap(struct mdt_thread_info *info, struct mdt_body *body)
{
struct ptlrpc_request *req = mdt_info_req(info);
return;
if (body->valid & OBD_MD_FLUID) {
- if ((uc->mu_valid == UCRED_OLD) ||
- (uc->mu_valid == UCRED_NEW)) {
+ if (((uc->mu_valid == UCRED_OLD) ||
+ (uc->mu_valid == UCRED_NEW)) &&
+ !(uc->mu_squash & SQUASH_UID)) {
if (body->uid == uc->mu_uid)
uid = uc->mu_o_uid;
else if (body->uid == uc->mu_fsuid)
}
if (body->valid & OBD_MD_FLGID) {
- if ((uc->mu_valid == UCRED_OLD) ||
- (uc->mu_valid == UCRED_NEW)) {
+ if (((uc->mu_valid == UCRED_OLD) ||
+ (uc->mu_valid == UCRED_NEW)) &&
+ !(uc->mu_squash & SQUASH_GID)) {
if (body->gid == uc->mu_gid)
gid = uc->mu_o_gid;
else if (body->gid == uc->mu_fsgid)
if ((uc->mu_valid != UCRED_OLD) && (uc->mu_valid != UCRED_NEW))
RETURN(-EINVAL);
+ if (!med->med_rmtclient && (uc->mu_squash == SQUASH_NONE))
+ RETURN(0);
+
if (op != REINT_SETATTR) {
if ((attr->la_valid & LA_UID) && (attr->la_uid != -1))
attr->la_uid = uc->mu_fsuid;
}
uc->mu_valid = UCRED_OLD;
+ uc->mu_squash = SQUASH_NONE;
uc->mu_o_uid = uc->mu_uid = body->uid;
uc->mu_o_gid = uc->mu_gid = body->gid;
uc->mu_o_fsuid = uc->mu_fsuid = body->fsuid;
}
uc->mu_valid = UCRED_OLD;
+ uc->mu_squash = SQUASH_NONE;
uc->mu_o_uid = uc->mu_o_fsuid = uc->mu_uid = uc->mu_fsuid;
uc->mu_o_gid = uc->mu_o_fsgid = uc->mu_gid = uc->mu_fsgid;
uc->mu_ginfo = NULL;
struct ptlrpc_user_desc *pud, lnet_nid_t peernid)
{
struct rootsquash_info *rsi = mdt->mdt_rootsquash_info;
- int squash_count = 0;
if (!rsi || (!rsi->rsi_uid && !rsi->rsi_gid) ||
nid_nosquash(mdt, peernid))
if (rsi->rsi_uid) {
if (!pud->pud_uid) {
ucred->mu_uid = rsi->rsi_uid;
- squash_count++;
+ ucred->mu_squash |= SQUASH_UID;
} else {
ucred->mu_uid = pud->pud_uid;
}
if (!pud->pud_fsuid) {
ucred->mu_fsuid = rsi->rsi_uid;
- squash_count++;
+ ucred->mu_squash |= SQUASH_UID;
} else {
ucred->mu_fsuid = pud->pud_fsuid;
}
if (!pud->pud_gid) {
ucred->mu_gid = rsi->rsi_gid;
- squash_count++;
+ ucred->mu_squash |= SQUASH_GID;
} else {
ucred->mu_gid = pud->pud_gid;
}
if (!pud->pud_fsgid) {
ucred->mu_fsgid = rsi->rsi_gid;
- squash_count++;
+ ucred->mu_squash |= SQUASH_GID;
} else {
ucred->mu_fsgid = pud->pud_fsgid;
}
for (i = 0; i < 2; i++) {
if (!ucred->mu_suppgids[i]) {
ucred->mu_suppgids[i] = rsi->rsi_gid;
- squash_count++;
+ ucred->mu_squash |= SQUASH_GID;
}
}
for (i = 0; i < pud->pud_ngroups; i++) {
if (!pud->pud_groups[i]) {
pud->pud_groups[i] = rsi->rsi_gid;
- squash_count++;
+ ucred->mu_squash |= SQUASH_GID;
}
}
} else {
ucred->mu_fsgid = pud->pud_fsgid;
}
- if (squash_count || ucred->mu_fsuid)
+ if ((ucred->mu_squash & SQUASH_UID) || ucred->mu_fsuid)
ucred->mu_cap = (pud->pud_cap & ~CAP_FS_MASK);
else
ucred->mu_cap = pud->pud_cap;
check_squash:
/* FIXME: The exact behavior of root_squash is not defined. */
+ ucred->mu_squash = SQUASH_NONE;
root_squashed = mdt_squash_root(mdt, ucred, pud, peernid);
if (!root_squashed) {
ucred->mu_uid = pud->pud_uid;
ucred->mu_gid = pud->pud_gid;
ucred->mu_fsuid = pud->pud_fsuid;
ucred->mu_fsgid = pud->pud_fsgid;
- ucred->mu_cap = pud->pud_cap;
/* remove fs privilege for non-root user */
if (pud->pud_fsuid)
- ucred->mu_cap &= ~CAP_FS_MASK;
+ ucred->mu_cap = (pud->pud_cap & ~CAP_FS_MASK);
+ else
+ ucred->mu_cap = pud->pud_cap;
}
/*