X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmdd%2Fmdd_dir.c;fp=lustre%2Fmdd%2Fmdd_dir.c;h=b3fcc45de37d678a8b3d2e43759f24c40c3ec331;hp=40afae5142a273d70b4af05bcd339850629e9e06;hb=534f10e45ab1f575a0a0c81964d4792ec33696fa;hpb=34bc379f7425f364535e608d03f424a64bd1a04e diff --git a/lustre/mdd/mdd_dir.c b/lustre/mdd/mdd_dir.c index 40afae5..b3fcc45 100644 --- a/lustre/mdd/mdd_dir.c +++ b/lustre/mdd/mdd_dir.c @@ -43,6 +43,7 @@ #include #include #include +#include #include "mdd_internal.h" @@ -2037,12 +2038,24 @@ static int mdd_create_sanity_check(const struct lu_env *env, if (rc != 0) RETURN(rc); - /* sgid check */ + /* sgid check */ if (pattr->la_mode & S_ISGID) { + struct lu_ucred *uc = lu_ucred(env); + cattr->la_gid = pattr->la_gid; + + /* Directories are special, and always inherit S_ISGID */ if (S_ISDIR(cattr->la_mode)) { cattr->la_mode |= S_ISGID; cattr->la_valid |= LA_MODE; + } else if ((cattr->la_mode & (S_ISGID | S_IXGRP)) + == (S_ISGID | S_IXGRP) && + !lustre_in_group_p(uc, + (cattr->la_valid & LA_GID) ? + cattr->la_gid : pattr->la_gid) && + !md_capable(uc, CFS_CAP_FSETID)) { + cattr->la_mode &= ~S_ISGID; + cattr->la_valid |= LA_MODE; } }