truncate an overlayfs inode was checking IS_APPEND() on overlay inode, but overlay inode does not have the S_APPEND flag and IS_APPEND() is always checked on backing inode in other places. Move the IS_APPEND() check to after we have the upperdentry and use the d_backing_inode() macro to explicitly highlight the places where the backing inode is used. Signed-off-by: Amir Goldstein <amir73il@xxxxxxxxx> --- fs/open.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/fs/open.c b/fs/open.c index 0e3c12b..baf67cd 100644 --- a/fs/open.c +++ b/fs/open.c @@ -87,10 +87,6 @@ long vfs_truncate(const struct path *path, loff_t length) if (error) goto mnt_drop_write_and_out; - error = -EPERM; - if (IS_APPEND(inode)) - goto mnt_drop_write_and_out; - /* * If this is an overlayfs then do as if opening the file so we get * write access on the upper inode, not on the overlay inode. For @@ -101,7 +97,11 @@ long vfs_truncate(const struct path *path, loff_t length) if (IS_ERR(upperdentry)) goto mnt_drop_write_and_out; - error = get_write_access(upperdentry->d_inode); + error = -EPERM; + if (IS_APPEND(d_backing_inode(upperdentry))) + goto mnt_drop_write_and_out; + + error = get_write_access(d_backing_inode(upperdentry)); if (error) goto mnt_drop_write_and_out; @@ -120,7 +120,7 @@ long vfs_truncate(const struct path *path, loff_t length) error = do_truncate(path->dentry, length, 0, NULL); put_write_and_out: - put_write_access(upperdentry->d_inode); + put_write_access(d_backing_inode(upperdentry)); mnt_drop_write_and_out: mnt_drop_write(path->mnt); out: -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe linux-unionfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html