From 13832778224ff7807225fb8b88491e8e982e36c6 Mon Sep 17 00:00:00 2001
From: yangsheng <yangsheng>
Date: Wed, 3 Sep 2008 07:00:06 +0000
Subject: [PATCH] Branch HEAD b=15593 i=nikita, yury

Restore the ATTR_KILL_SUID and bypass permission check in the case.
---
 lustre/llite/llite_lib.c | 10 ++++++++++
 lustre/mdd/mdd_object.c  |  1 +
 lustre/mdt/mdt_lib.c     |  3 +++
 3 files changed, 14 insertions(+)

diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c
index dbf95a8094..85b8d06bd7 100644
--- a/lustre/llite/llite_lib.c
+++ b/lustre/llite/llite_lib.c
@@ -1638,6 +1638,16 @@ int ll_setattr(struct dentry *de, struct iattr *attr)
             (ATTR_CTIME|ATTR_SIZE|ATTR_MODE))
                 attr->ia_valid |= MDS_OPEN_OWNEROVERRIDE;
 
+        if ((de->d_inode->i_mode & S_ISUID) &&
+            !(attr->ia_mode & S_ISUID) &&
+            !(attr->ia_valid & ATTR_KILL_SUID))
+                attr->ia_valid |= ATTR_KILL_SUID;
+
+        if (((de->d_inode->i_mode & (S_ISGID|S_IXGRP)) == (S_ISGID|S_IXGRP)) &&
+            !(attr->ia_mode & S_ISGID) &&
+            !(attr->ia_valid & ATTR_KILL_SGID))
+                attr->ia_valid |= ATTR_KILL_SGID;
+
         return ll_setattr_raw(de->d_inode, attr);
 }
 
diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c
index 74b628b21f..39d3814ab6 100644
--- a/lustre/mdd/mdd_object.c
+++ b/lustre/mdd/mdd_object.c
@@ -735,6 +735,7 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj,
                 /* Bypass la_vaild == LA_MODE,
                  * this is for changing file with SUID or SGID. */
                 if ((la->la_valid & ~LA_MODE) &&
+                    !(ma->ma_attr_flags & MDS_PERM_BYPASS) &&
                     (uc->mu_fsuid != tmp_la->la_uid) &&
                     !mdd_capable(uc, CAP_FOWNER))
                         RETURN(-EPERM);
diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c
index ec1463dd73..5fffcf2052 100644
--- a/lustre/mdt/mdt_lib.c
+++ b/lustre/mdt/mdt_lib.c
@@ -683,6 +683,9 @@ static __u64 mdt_attr_valid_xlate(__u64 in, struct mdt_reint_record *rr,
         if (in & MDS_OPEN_OWNEROVERRIDE)
                 ma->ma_attr_flags |= MDS_OPEN_OWNEROVERRIDE;
 
+        if (in & (ATTR_KILL_SUID|ATTR_KILL_SGID))
+                ma->ma_attr_flags |= MDS_PERM_BYPASS;
+
         /*XXX need ATTR_RAW?*/
         in &= ~(ATTR_MODE|ATTR_UID|ATTR_GID|ATTR_SIZE|ATTR_BLOCKS|
                 ATTR_ATIME|ATTR_MTIME|ATTR_CTIME|ATTR_FROM_OPEN|
-- 
GitLab