Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm...
[firefly-linux-kernel-4.4.55.git] / fs / gfs2 / inode.c
index db048a8ab6a859dc2466b56f61c59767f0244525..cc00bd1d1f87ed331dea2b35b76d503a4bbf1c7a 100644 (file)
@@ -368,10 +368,11 @@ static void munge_mode_uid_gid(const struct gfs2_inode *dip,
                               struct inode *inode)
 {
        if (GFS2_SB(&dip->i_inode)->sd_args.ar_suiddir &&
-           (dip->i_inode.i_mode & S_ISUID) && dip->i_inode.i_uid) {
+           (dip->i_inode.i_mode & S_ISUID) &&
+           !uid_eq(dip->i_inode.i_uid, GLOBAL_ROOT_UID)) {
                if (S_ISDIR(inode->i_mode))
                        inode->i_mode |= S_ISUID;
-               else if (dip->i_inode.i_uid != current_fsuid())
+               else if (!uid_eq(dip->i_inode.i_uid, current_fsuid()))
                        inode->i_mode &= ~07111;
                inode->i_uid = dip->i_inode.i_uid;
        } else
@@ -455,8 +456,8 @@ static void init_dinode(struct gfs2_inode *dip, struct gfs2_inode *ip,
        di->di_num.no_formal_ino = cpu_to_be64(ip->i_no_formal_ino);
        di->di_num.no_addr = cpu_to_be64(ip->i_no_addr);
        di->di_mode = cpu_to_be32(ip->i_inode.i_mode);
-       di->di_uid = cpu_to_be32(ip->i_inode.i_uid);
-       di->di_gid = cpu_to_be32(ip->i_inode.i_gid);
+       di->di_uid = cpu_to_be32(i_uid_read(&ip->i_inode));
+       di->di_gid = cpu_to_be32(i_gid_read(&ip->i_inode));
        di->di_nlink = 0;
        di->di_size = cpu_to_be64(ip->i_inode.i_size);
        di->di_blocks = cpu_to_be64(1);
@@ -548,7 +549,7 @@ static int link_dinode(struct gfs2_inode *dip, const struct qstr *name,
        if (error)
                return error;
 
-       error = gfs2_quota_lock(dip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
+       error = gfs2_quota_lock(dip, NO_UID_QUOTA_CHANGE, NO_GID_QUOTA_CHANGE);
        if (error)
                goto fail;
 
@@ -978,8 +979,8 @@ static int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name,
                return -EPERM;
 
        if ((dip->i_inode.i_mode & S_ISVTX) &&
-           dip->i_inode.i_uid != current_fsuid() &&
-           ip->i_inode.i_uid != current_fsuid() && !capable(CAP_FOWNER))
+           !uid_eq(dip->i_inode.i_uid, current_fsuid()) &&
+           !uid_eq(ip->i_inode.i_uid, current_fsuid()) && !capable(CAP_FOWNER))
                return -EPERM;
 
        if (IS_APPEND(&dip->i_inode))
@@ -1580,7 +1581,8 @@ static int setattr_chown(struct inode *inode, struct iattr *attr)
 {
        struct gfs2_inode *ip = GFS2_I(inode);
        struct gfs2_sbd *sdp = GFS2_SB(inode);
-       u32 ouid, ogid, nuid, ngid;
+       kuid_t ouid, nuid;
+       kgid_t ogid, ngid;
        int error;
 
        ouid = inode->i_uid;
@@ -1588,16 +1590,17 @@ static int setattr_chown(struct inode *inode, struct iattr *attr)
        nuid = attr->ia_uid;
        ngid = attr->ia_gid;
 
-       if (!(attr->ia_valid & ATTR_UID) || ouid == nuid)
-               ouid = nuid = NO_QUOTA_CHANGE;
-       if (!(attr->ia_valid & ATTR_GID) || ogid == ngid)
-               ogid = ngid = NO_QUOTA_CHANGE;
+       if (!(attr->ia_valid & ATTR_UID) || uid_eq(ouid, nuid))
+               ouid = nuid = NO_UID_QUOTA_CHANGE;
+       if (!(attr->ia_valid & ATTR_GID) || gid_eq(ogid, ngid))
+               ogid = ngid = NO_GID_QUOTA_CHANGE;
 
        error = gfs2_quota_lock(ip, nuid, ngid);
        if (error)
                return error;
 
-       if (ouid != NO_QUOTA_CHANGE || ogid != NO_QUOTA_CHANGE) {
+       if (!uid_eq(ouid, NO_UID_QUOTA_CHANGE) ||
+           !gid_eq(ogid, NO_GID_QUOTA_CHANGE)) {
                error = gfs2_quota_check(ip, nuid, ngid);
                if (error)
                        goto out_gunlock_q;
@@ -1611,7 +1614,8 @@ static int setattr_chown(struct inode *inode, struct iattr *attr)
        if (error)
                goto out_end_trans;
 
-       if (ouid != NO_QUOTA_CHANGE || ogid != NO_QUOTA_CHANGE) {
+       if (!uid_eq(ouid, NO_UID_QUOTA_CHANGE) ||
+           !gid_eq(ogid, NO_GID_QUOTA_CHANGE)) {
                u64 blocks = gfs2_get_inode_blocks(&ip->i_inode);
                gfs2_quota_change(ip, -blocks, ouid, ogid);
                gfs2_quota_change(ip, blocks, nuid, ngid);