From: Amir Goldstein <amir73il@xxxxxxxxxxxx> Enforce snapshot file permissions. Write, truncate and unlink of snapshot inodes is not allowed. Signed-off-by: Amir Goldstein <amir73il@xxxxxxxxxxxx> Signed-off-by: Yongqiang Yang <xiaoqiangnk@xxxxxxxxx> --- fs/ext4/file.c | 7 +++++++ fs/ext4/inode.c | 7 +++++++ fs/ext4/namei.c | 8 ++++++++ 3 files changed, 22 insertions(+), 0 deletions(-) diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 60b3b19..f31e58e 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -168,6 +168,13 @@ static int ext4_file_open(struct inode * inode, struct file * filp) struct path path; char buf[64], *cp; + if (ext4_snapshot_file(inode) && + (filp->f_flags & O_ACCMODE) != O_RDONLY) + /* + * allow only read-only access to snapshot files + */ + return -EPERM; + if (unlikely(!(sbi->s_mount_flags & EXT4_MF_MNTDIR_SAMPLED) && !(sb->s_flags & MS_RDONLY))) { sbi->s_mount_flags |= EXT4_MF_MNTDIR_SAMPLED; diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 3acdbe5..c3af773 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -4748,6 +4748,13 @@ void ext4_truncate(struct inode *inode) ext4_lblk_t last_block, max_block; unsigned blocksize = inode->i_sb->s_blocksize; + /* prevent truncate of files on snapshot list */ + if (ext4_snapshot_list(inode)) { + snapshot_debug(1, "snapshot (%u) cannot be truncated!\n", + inode->i_generation); + return; + } + if (!ext4_can_truncate(inode)) return; diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index b70fa13..02ba825 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c @@ -2213,6 +2213,14 @@ static int ext4_unlink(struct inode *dir, struct dentry *dentry) inode->i_ino, inode->i_nlink); inode->i_nlink = 1; } + /* prevent unlink of files on snapshot list */ + if (inode->i_nlink == 1 && + ext4_snapshot_list(inode)) { + snapshot_debug(1, "snapshot (%u) cannot be unlinked!\n", + inode->i_generation); + retval = -EPERM; + goto end_unlink; + } retval = ext4_delete_entry(handle, dir, de, bh); if (retval) goto end_unlink; -- 1.7.0.4 -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html