Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2
* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2: (47 commits) ocfs2: Silence a gcc warning. ocfs2: Don't retry xattr set in case value extension fails. ocfs2:dlm: avoid dlm->ast_lock lockres->spinlock dependency break ocfs2: Reset xattr value size after xa_cleanup_value_truncate(). fs/ocfs2/dlm: Use kstrdup fs/ocfs2/dlm: Drop memory allocation cast Ocfs2: Optimize punching-hole code. Ocfs2: Make ocfs2_find_cpos_for_left_leaf() public. Ocfs2: Fix hole punching to correctly do CoW during cluster zeroing. Ocfs2: Optimize ocfs2 truncate to use ocfs2_remove_btree_range() instead. ocfs2: Block signals for mkdir/link/symlink/O_CREAT. ocfs2: Wrap signal blocking in void functions. ocfs2/dlm: Increase o2dlm lockres hash size ocfs2: Make ocfs2_extend_trans() really extend. ocfs2/trivial: Code cleanup for allocation reservation. ocfs2: make ocfs2_adjust_resv_from_alloc simple. ocfs2: Make nointr a default mount option ocfs2/dlm: Make o2dlm domain join/leave messages KERN_NOTICE o2net: log socket state changes ocfs2: print node # when tcp fails ...
This commit is contained in:
@@ -41,44 +41,20 @@
|
||||
#include "file.h"
|
||||
#include "inode.h"
|
||||
#include "mmap.h"
|
||||
#include "super.h"
|
||||
|
||||
static inline int ocfs2_vm_op_block_sigs(sigset_t *blocked, sigset_t *oldset)
|
||||
{
|
||||
/* The best way to deal with signals in the vm path is
|
||||
* to block them upfront, rather than allowing the
|
||||
* locking paths to return -ERESTARTSYS. */
|
||||
sigfillset(blocked);
|
||||
|
||||
/* We should technically never get a bad return value
|
||||
* from sigprocmask */
|
||||
return sigprocmask(SIG_BLOCK, blocked, oldset);
|
||||
}
|
||||
|
||||
static inline int ocfs2_vm_op_unblock_sigs(sigset_t *oldset)
|
||||
{
|
||||
return sigprocmask(SIG_SETMASK, oldset, NULL);
|
||||
}
|
||||
|
||||
static int ocfs2_fault(struct vm_area_struct *area, struct vm_fault *vmf)
|
||||
{
|
||||
sigset_t blocked, oldset;
|
||||
int error, ret;
|
||||
sigset_t oldset;
|
||||
int ret;
|
||||
|
||||
mlog_entry("(area=%p, page offset=%lu)\n", area, vmf->pgoff);
|
||||
|
||||
error = ocfs2_vm_op_block_sigs(&blocked, &oldset);
|
||||
if (error < 0) {
|
||||
mlog_errno(error);
|
||||
ret = VM_FAULT_SIGBUS;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ocfs2_block_signals(&oldset);
|
||||
ret = filemap_fault(area, vmf);
|
||||
ocfs2_unblock_signals(&oldset);
|
||||
|
||||
error = ocfs2_vm_op_unblock_sigs(&oldset);
|
||||
if (error < 0)
|
||||
mlog_errno(error);
|
||||
out:
|
||||
mlog_exit_ptr(vmf->page);
|
||||
return ret;
|
||||
}
|
||||
@@ -158,14 +134,10 @@ static int ocfs2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
|
||||
struct page *page = vmf->page;
|
||||
struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
|
||||
struct buffer_head *di_bh = NULL;
|
||||
sigset_t blocked, oldset;
|
||||
int ret, ret2;
|
||||
sigset_t oldset;
|
||||
int ret;
|
||||
|
||||
ret = ocfs2_vm_op_block_sigs(&blocked, &oldset);
|
||||
if (ret < 0) {
|
||||
mlog_errno(ret);
|
||||
return ret;
|
||||
}
|
||||
ocfs2_block_signals(&oldset);
|
||||
|
||||
/*
|
||||
* The cluster locks taken will block a truncate from another
|
||||
@@ -193,9 +165,7 @@ static int ocfs2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
|
||||
ocfs2_inode_unlock(inode, 1);
|
||||
|
||||
out:
|
||||
ret2 = ocfs2_vm_op_unblock_sigs(&oldset);
|
||||
if (ret2 < 0)
|
||||
mlog_errno(ret2);
|
||||
ocfs2_unblock_signals(&oldset);
|
||||
if (ret)
|
||||
ret = VM_FAULT_SIGBUS;
|
||||
return ret;
|
||||
|
Reference in New Issue
Block a user