From: Erez Zadok Date: Sun, 6 Mar 2011 20:55:41 +0000 (-0500) Subject: Unionfs: ->setattr fixes X-Git-Tag: master_top~1 X-Git-Url: https://git.fsl.cs.sunysb.edu/?a=commitdiff_plain;h=8aedd430eeb044ffcdd5c887d3f19b6d9927e7a3;p=unionfs-2.6.22.y.git Unionfs: ->setattr fixes Call inode_check_ok first thing on our inode. Pass lower_file in struct iattr to lower file system. Signed-off-by: Erez Zadok --- diff --git a/fs/unionfs/inode.c b/fs/unionfs/inode.c index be5c75499ba..16d76d3831d 100644 --- a/fs/unionfs/inode.c +++ b/fs/unionfs/inode.c @@ -888,6 +888,12 @@ static int unionfs_setattr(struct dentry *dentry, struct iattr *ia) struct inode *lower_inode; int bstart, bend, bindex; loff_t size; + struct iattr lower_ia; + + /* check if user has permission to change inode */ + err = inode_change_ok(dentry->d_inode, ia); + if (err) + goto out_err; unionfs_read_lock(dentry->d_sb, UNIONFS_SMUTEX_CHILD); parent = unionfs_lock_parent(dentry, UNIONFS_DMUTEX_PARENT); @@ -968,8 +974,15 @@ static int unionfs_setattr(struct dentry *dentry, struct iattr *ia) * unlinked (no inode->i_sb and i_ino==0. This happens if someone * tries to open(), unlink(), then ftruncate() a file. */ + /* prepare our own lower struct iattr (with our own lower file) */ + memcpy(&lower_ia, ia, sizeof(lower_ia)); + if (ia->ia_valid & ATTR_FILE) { + lower_ia.ia_file = unionfs_lower_file(ia->ia_file); + BUG_ON(!lower_ia.ia_file); // XXX? + } + mutex_lock(&lower_dentry->d_inode->i_mutex); - err = notify_change(lower_dentry, ia); + err = notify_change(lower_dentry, &lower_ia); mutex_unlock(&lower_dentry->d_inode->i_mutex); if (err) goto out; @@ -997,7 +1010,7 @@ out: unionfs_unlock_dentry(dentry); unionfs_unlock_parent(dentry, parent); unionfs_read_unlock(dentry->d_sb); - +out_err: return err; }