]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/ocfs2/file.c
splice: fix deadlock in splicing to file
[linux-2.6-omap-h63xx.git] / fs / ocfs2 / file.c
index e8f795f978aaae80c865d8ed55e694fcbcf35fa1..8672b953603996c2884b17c0294be2be0a6fe1e2 100644 (file)
@@ -1605,7 +1605,7 @@ int ocfs2_change_file_space(struct file *file, unsigned int cmd,
                            struct ocfs2_space_resv *sr)
 {
        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);
 
        if ((cmd == OCFS2_IOC_RESVSP || cmd == OCFS2_IOC_RESVSP64) &&
            !ocfs2_writes_unwritten_extents(osb))
@@ -1926,7 +1926,7 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe,
                   out->f_path.dentry->d_name.len,
                   out->f_path.dentry->d_name.name);
 
-       inode_double_lock(inode, pipe->inode);
+       mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT);
 
        ret = ocfs2_rw_lock(inode, 1);
        if (ret < 0) {
@@ -1941,12 +1941,16 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe,
                goto out_unlock;
        }
 
+       if (pipe->inode)
+               mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_CHILD);
        ret = generic_file_splice_write_nolock(pipe, out, ppos, len, flags);
+       if (pipe->inode)
+               mutex_unlock(&pipe->inode->i_mutex);
 
 out_unlock:
        ocfs2_rw_unlock(inode, 1);
 out:
-       inode_double_unlock(inode, pipe->inode);
+       mutex_unlock(&inode->i_mutex);
 
        mlog_exit(ret);
        return ret;