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 f44f7d3..b210b33 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -4727,6 +4727,13 @@ void ext4_truncate(struct inode *inode) trace_ext4_truncate_enter(inode); + /* 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 93196b6..41df36f 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c @@ -2225,6 +2225,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.4.1 -- 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