[Ocfs2-devel] [PATCH 1/2] ocfs2: Wrap signal blocking in void functions.
Sunil Mushran
sunil.mushran at oracle.com
Wed May 12 14:01:16 PDT 2010
Signed-off-by: Sunil Mushran<sunil.mushran at oracle.com>
On 05/10/2010 12:00 PM, Joel Becker wrote:
> ocfs2 sometimes needs to block signals around dlm operations, but it
> currently does it with sigprocmask(). Even worse, it's checking the
> error code of sigprocmask(). The in-kernel sigprocmask() can only error
> if you get the SIG_* argument wrong. We don't.
>
> Wrap the sigprocmask() calls with ocfs2_[un]block_signals(). These
> functions are void, but they will BUG() if somehow sigprocmask() returns
> an error.
>
> Signed-off-by: Joel Becker<joel.becker at oracle.com>
> ---
> fs/ocfs2/inode.c | 14 +++-----------
> fs/ocfs2/mmap.c | 48 +++++++++---------------------------------------
> fs/ocfs2/super.c | 20 ++++++++++++++++++++
> fs/ocfs2/super.h | 7 +++++++
> 4 files changed, 39 insertions(+), 50 deletions(-)
>
> diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c
> index 9ee13f7..b7650cc 100644
> --- a/fs/ocfs2/inode.c
> +++ b/fs/ocfs2/inode.c
> @@ -957,7 +957,7 @@ static void ocfs2_cleanup_delete_inode(struct inode *inode,
> void ocfs2_delete_inode(struct inode *inode)
> {
> int wipe, status;
> - sigset_t blocked, oldset;
> + sigset_t oldset;
> struct buffer_head *di_bh = NULL;
>
> mlog_entry("(inode->i_ino = %lu)\n", inode->i_ino);
> @@ -984,13 +984,7 @@ void ocfs2_delete_inode(struct inode *inode)
> * messaging paths may return us -ERESTARTSYS. Which would
> * cause us to exit early, resulting in inodes being orphaned
> * forever. */
> - sigfillset(&blocked);
> - status = sigprocmask(SIG_BLOCK,&blocked,&oldset);
> - if (status< 0) {
> - mlog_errno(status);
> - ocfs2_cleanup_delete_inode(inode, 1);
> - goto bail;
> - }
> + ocfs2_block_signals(&oldset);
>
> /*
> * Synchronize us against ocfs2_get_dentry. We take this in
> @@ -1064,9 +1058,7 @@ bail_unlock_nfs_sync:
> ocfs2_nfs_sync_unlock(OCFS2_SB(inode->i_sb), 0);
>
> bail_unblock:
> - status = sigprocmask(SIG_SETMASK,&oldset, NULL);
> - if (status< 0)
> - mlog_errno(status);
> + ocfs2_unblock_signals(&oldset);
> bail:
> clear_inode(inode);
> mlog_exit_void();
> diff --git a/fs/ocfs2/mmap.c b/fs/ocfs2/mmap.c
> index 3973761..a61809f 100644
> --- a/fs/ocfs2/mmap.c
> +++ b/fs/ocfs2/mmap.c
> @@ -42,44 +42,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;
> }
> @@ -159,14 +135,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
> @@ -194,9 +166,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;
> diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c
> index 12c2203..cf6d87b 100644
> --- a/fs/ocfs2/super.c
> +++ b/fs/ocfs2/super.c
> @@ -2560,5 +2560,25 @@ void __ocfs2_abort(struct super_block* sb,
> ocfs2_handle_error(sb);
> }
>
> +/*
> + * Void signal blockers, because in-kernel sigprocmask() only fails
> + * when SIG_* is wrong.
> + */
> +void ocfs2_block_signals(sigset_t *oldset)
> +{
> + int rc;
> + sigset_t blocked;
> +
> + sigfillset(&blocked);
> + rc = sigprocmask(SIG_BLOCK,&blocked, oldset);
> + BUG_ON(rc);
> +}
> +
> +void ocfs2_unblock_signals(sigset_t *oldset)
> +{
> + int rc = sigprocmask(SIG_SETMASK, oldset, NULL);
> + BUG_ON(rc);
> +}
> +
> module_init(ocfs2_init);
> module_exit(ocfs2_exit);
> diff --git a/fs/ocfs2/super.h b/fs/ocfs2/super.h
> index 783f527..40c7de0 100644
> --- a/fs/ocfs2/super.h
> +++ b/fs/ocfs2/super.h
> @@ -45,4 +45,11 @@ void __ocfs2_abort(struct super_block *sb,
>
> #define ocfs2_abort(sb, fmt, args...) __ocfs2_abort(sb, __PRETTY_FUNCTION__, fmt, ##args)
>
> +/*
> + * Void signal blockers, because in-kernel sigprocmask() only fails
> + * when SIG_* is wrong.
> + */
> +void ocfs2_block_signals(sigset_t *oldset);
> +void ocfs2_unblock_signals(sigset_t *oldset);
> +
> #endif /* OCFS2_SUPER_H */
>
More information about the Ocfs2-devel
mailing list