@ -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
@ -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 ) )
@ -1589,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 )
if ( ! ( attr - > ia_valid & ATTR_UID ) | | uid_eq ( ouid , nuid ) )
ouid = nuid = NO_UID_QUOTA_CHANGE ;
if ( ! ( attr - > ia_valid & ATTR_GID ) | | ogid = = ngid )
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_UID_QUOTA_CHANGE | | ogid ! = NO_GID_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 ;
@ -1612,7 +1614,8 @@ static int setattr_chown(struct inode *inode, struct iattr *attr)
if ( error )
goto out_end_trans ;
if ( ouid ! = NO_UID_QUOTA_CHANGE | | ogid ! = NO_GID_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 ) ;