提交 fef6925c 编写于 作者: J Jan Kara 提交者: Al Viro

ocfs2: Convert to new freezing mechanism

Protect ocfs2_page_mkwrite() and ocfs2_file_aio_write() using the new freeze
protection. We also protect several ioctl entry points which were missing the
protection. Finally, we add freeze protection to the journaling mechanism so
that iput() of unlinked inode cannot modify a frozen filesystem.

CC: Mark Fasheh <mfasheh@suse.com>
CC: Joel Becker <jlbec@evilplan.org>
CC: ocfs2-devel@oss.oracle.com
Acked-by: NJoel Becker <jlbec@evilplan.org>
Signed-off-by: NJan Kara <jack@suse.cz>
Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
上级 d9457dc0
...@@ -1971,6 +1971,7 @@ int ocfs2_change_file_space(struct file *file, unsigned int cmd, ...@@ -1971,6 +1971,7 @@ int ocfs2_change_file_space(struct file *file, unsigned int cmd,
{ {
struct inode *inode = file->f_path.dentry->d_inode; struct inode *inode = file->f_path.dentry->d_inode;
struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
int ret;
if ((cmd == OCFS2_IOC_RESVSP || cmd == OCFS2_IOC_RESVSP64) && if ((cmd == OCFS2_IOC_RESVSP || cmd == OCFS2_IOC_RESVSP64) &&
!ocfs2_writes_unwritten_extents(osb)) !ocfs2_writes_unwritten_extents(osb))
...@@ -1985,7 +1986,12 @@ int ocfs2_change_file_space(struct file *file, unsigned int cmd, ...@@ -1985,7 +1986,12 @@ int ocfs2_change_file_space(struct file *file, unsigned int cmd,
if (!(file->f_mode & FMODE_WRITE)) if (!(file->f_mode & FMODE_WRITE))
return -EBADF; return -EBADF;
return __ocfs2_change_file_space(file, inode, file->f_pos, cmd, sr, 0); ret = mnt_want_write_file(file);
if (ret)
return ret;
ret = __ocfs2_change_file_space(file, inode, file->f_pos, cmd, sr, 0);
mnt_drop_write_file(file);
return ret;
} }
static long ocfs2_fallocate(struct file *file, int mode, loff_t offset, static long ocfs2_fallocate(struct file *file, int mode, loff_t offset,
...@@ -2261,7 +2267,7 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb, ...@@ -2261,7 +2267,7 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
if (iocb->ki_left == 0) if (iocb->ki_left == 0)
return 0; return 0;
vfs_check_frozen(inode->i_sb, SB_FREEZE_WRITE); sb_start_write(inode->i_sb);
appending = file->f_flags & O_APPEND ? 1 : 0; appending = file->f_flags & O_APPEND ? 1 : 0;
direct_io = file->f_flags & O_DIRECT ? 1 : 0; direct_io = file->f_flags & O_DIRECT ? 1 : 0;
...@@ -2436,6 +2442,7 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb, ...@@ -2436,6 +2442,7 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
ocfs2_iocb_clear_sem_locked(iocb); ocfs2_iocb_clear_sem_locked(iocb);
mutex_unlock(&inode->i_mutex); mutex_unlock(&inode->i_mutex);
sb_end_write(inode->i_sb);
if (written) if (written)
ret = written; ret = written;
......
...@@ -928,7 +928,12 @@ long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) ...@@ -928,7 +928,12 @@ long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
if (get_user(new_clusters, (int __user *)arg)) if (get_user(new_clusters, (int __user *)arg))
return -EFAULT; return -EFAULT;
return ocfs2_group_extend(inode, new_clusters); status = mnt_want_write_file(filp);
if (status)
return status;
status = ocfs2_group_extend(inode, new_clusters);
mnt_drop_write_file(filp);
return status;
case OCFS2_IOC_GROUP_ADD: case OCFS2_IOC_GROUP_ADD:
case OCFS2_IOC_GROUP_ADD64: case OCFS2_IOC_GROUP_ADD64:
if (!capable(CAP_SYS_RESOURCE)) if (!capable(CAP_SYS_RESOURCE))
...@@ -937,7 +942,12 @@ long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) ...@@ -937,7 +942,12 @@ long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
if (copy_from_user(&input, (int __user *) arg, sizeof(input))) if (copy_from_user(&input, (int __user *) arg, sizeof(input)))
return -EFAULT; return -EFAULT;
return ocfs2_group_add(inode, &input); status = mnt_want_write_file(filp);
if (status)
return status;
status = ocfs2_group_add(inode, &input);
mnt_drop_write_file(filp);
return status;
case OCFS2_IOC_REFLINK: case OCFS2_IOC_REFLINK:
if (copy_from_user(&args, argp, sizeof(args))) if (copy_from_user(&args, argp, sizeof(args)))
return -EFAULT; return -EFAULT;
......
...@@ -355,11 +355,14 @@ handle_t *ocfs2_start_trans(struct ocfs2_super *osb, int max_buffs) ...@@ -355,11 +355,14 @@ handle_t *ocfs2_start_trans(struct ocfs2_super *osb, int max_buffs)
if (journal_current_handle()) if (journal_current_handle())
return jbd2_journal_start(journal, max_buffs); return jbd2_journal_start(journal, max_buffs);
sb_start_intwrite(osb->sb);
down_read(&osb->journal->j_trans_barrier); down_read(&osb->journal->j_trans_barrier);
handle = jbd2_journal_start(journal, max_buffs); handle = jbd2_journal_start(journal, max_buffs);
if (IS_ERR(handle)) { if (IS_ERR(handle)) {
up_read(&osb->journal->j_trans_barrier); up_read(&osb->journal->j_trans_barrier);
sb_end_intwrite(osb->sb);
mlog_errno(PTR_ERR(handle)); mlog_errno(PTR_ERR(handle));
...@@ -388,8 +391,10 @@ int ocfs2_commit_trans(struct ocfs2_super *osb, ...@@ -388,8 +391,10 @@ int ocfs2_commit_trans(struct ocfs2_super *osb,
if (ret < 0) if (ret < 0)
mlog_errno(ret); mlog_errno(ret);
if (!nested) if (!nested) {
up_read(&journal->j_trans_barrier); up_read(&journal->j_trans_barrier);
sb_end_intwrite(osb->sb);
}
return ret; return ret;
} }
......
...@@ -136,6 +136,7 @@ static int ocfs2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) ...@@ -136,6 +136,7 @@ static int ocfs2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
sigset_t oldset; sigset_t oldset;
int ret; int ret;
sb_start_pagefault(inode->i_sb);
ocfs2_block_signals(&oldset); ocfs2_block_signals(&oldset);
/* /*
...@@ -165,6 +166,7 @@ static int ocfs2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) ...@@ -165,6 +166,7 @@ static int ocfs2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
out: out:
ocfs2_unblock_signals(&oldset); ocfs2_unblock_signals(&oldset);
sb_end_pagefault(inode->i_sb);
return ret; return ret;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册