From: Sunil Mushran <sunil.mushran@oracle.com>
To: ocfs2-devel@oss.oracle.com
Subject: [Ocfs2-devel] [PATCH 1/2] ocfs2: Wrap signal blocking in void functions.
Date: Wed, 12 May 2010 14:01:16 -0700 [thread overview]
Message-ID: <4BEB171C.6070002@oracle.com> (raw)
In-Reply-To: <20100510190003.GD25670@mail.oracle.com>
Signed-off-by: Sunil Mushran<sunil.mushran@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@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 */
>
next prev parent reply other threads:[~2010-05-12 21:01 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-10 18:59 [Ocfs2-devel] [PATCH 0/2] ocfs2: Block signals for file creation Joel Becker
2010-05-10 19:00 ` [Ocfs2-devel] [PATCH 1/2] ocfs2: Wrap signal blocking in void functions Joel Becker
2010-05-12 21:01 ` Sunil Mushran [this message]
2010-05-10 19:00 ` [Ocfs2-devel] [PATCH 2/2] ocfs2: Block signals for mkdir/link/symlink/O_CREAT Joel Becker
2010-05-12 21:09 ` Sunil Mushran
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4BEB171C.6070002@oracle.com \
--to=sunil.mushran@oracle.com \
--cc=ocfs2-devel@oss.oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.