From: fanyong Date: Sun, 8 Oct 2006 07:36:00 +0000 (+0000) Subject: (1) Adding squash flag in md_ucred will increase performance of idmap. X-Git-Tag: v1_8_0_110~486^2~643 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=b61caead6c76d5c70032904d5350eb94e1bb663f;p=fs%2Flustre-release.git (1) Adding squash flag in md_ucred will increase performance of idmap. (2) Fix bug about mdt_body_reverse_idmap for remote user with rootsquash. --- diff --git a/lustre/include/md_object.h b/lustre/include/md_object.h index 3c61d10..a138925 100644 --- a/lustre/include/md_object.h +++ b/lustre/include/md_object.h @@ -54,8 +54,13 @@ typedef enum { UCRED_NEW = 2, } ucred_t; +#define SQUASH_NONE 0x00 +#define SQUASH_UID 0x01 +#define SQUASH_GID 0x02 + struct md_ucred { ucred_t mu_valid; + __u32 mu_squash; __u32 mu_o_uid; __u32 mu_o_gid; __u32 mu_o_fsuid; diff --git a/lustre/mdt/mdt_idmap.c b/lustre/mdt/mdt_idmap.c index 8d6dff6..20277ee 100644 --- a/lustre/mdt/mdt_idmap.c +++ b/lustre/mdt/mdt_idmap.c @@ -560,7 +560,10 @@ int ptlrpc_user_desc_do_idmap(struct ptlrpc_request *req, 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); @@ -574,8 +577,9 @@ void mdt_body_reverse_idmap(struct mdt_thread_info *info, struct mdt_body *body) 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) @@ -597,8 +601,9 @@ void mdt_body_reverse_idmap(struct mdt_thread_info *info, struct mdt_body *body) } 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) @@ -677,6 +682,9 @@ int mdt_fix_attr_ucred(struct mdt_thread_info *info, __u32 op) 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; diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index a0e4b22..0c7bcf3 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -138,6 +138,7 @@ static int old_init_ucred(struct mdt_thread_info *info, } 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; @@ -173,6 +174,7 @@ static int old_init_ucred_reint(struct mdt_thread_info *info) } 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; @@ -198,7 +200,6 @@ static int mdt_squash_root(struct mdt_device *mdt, struct md_ucred *ucred, 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)) @@ -217,14 +218,14 @@ static int mdt_squash_root(struct mdt_device *mdt, struct md_ucred *ucred, 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; } @@ -238,14 +239,14 @@ static int mdt_squash_root(struct mdt_device *mdt, struct md_ucred *ucred, 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; } @@ -253,14 +254,14 @@ static int mdt_squash_root(struct mdt_device *mdt, struct md_ucred *ucred, 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 { @@ -268,7 +269,7 @@ static int mdt_squash_root(struct mdt_device *mdt, struct md_ucred *ucred, 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; @@ -385,16 +386,18 @@ static int new_init_ucred(struct mdt_thread_info *info, ucred_init_type_t type, 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; } /*