diff --git a/lustre/mds/mds_reint.c b/lustre/mds/mds_reint.c index 3cd251f67c21b1540b778bb94b1b9ace464371cb..5cead34a816b0e202e4ad2beda55a0205cdf2b45 100644 --- a/lustre/mds/mds_reint.c +++ b/lustre/mds/mds_reint.c @@ -320,7 +320,15 @@ int mds_fix_attr(struct inode *inode, struct mds_update_record *rec) attr->ia_valid |= ATTR_MODE; } } else if (ia_valid & ATTR_MODE) { - int mode = attr->ia_mode; + int mode; + if (!(attr->ia_valid & ATTR_FORCE)) { + mode = inode->i_mode; + if (((mode & S_ISUID) && (!(attr->ia_mode & S_ISUID))) || + ((mode & S_ISGID) && (mode & S_IXGRP) && + (!(attr->ia_mode & S_ISGID)))) + attr->ia_valid |= ATTR_FORCE; + } + mode = attr->ia_mode; /* chmod */ if (attr->ia_mode == (umode_t)-1) mode = inode->i_mode;