From: Andrew Morton <akpm@linux-foundation.org>
To: Mark Fasheh <mark.fasheh@oracle.com>
Cc: linux-kernel@vger.kernel.org, ocfs2-devel@oss.oracle.com
Subject: [Ocfs2-devel] [PATCH 03/30] ocfs2: Remove mount/unmount votes
Date: Wed, 23 Jan 2008 22:05:21 -0000 [thread overview]
Message-ID: <20080123140509.4db5fb47.akpm@linux-foundation.org> (raw)
In-Reply-To: <1200609356-17788-4-git-send-email-mark.fasheh@oracle.com>
> On Thu, 17 Jan 2008 14:35:29 -0800 Mark Fasheh <mark.fasheh@oracle.com> wrote:
> The node maps that are set/unset by these votes are no longer relevant, thus
> we can remove the mount and umount votes. Since those are the last two
> remaining votes, we can also remove the entire vote infrastructure.
>
> The vote thread has been renamed to the downconvert thread, and the small
> amount of functionality related to managing it has been moved into
> fs/ocfs2/dlmglue.c. All references to votes have been removed or updated.
>
Locking looks fishy.
>
>...
>
> +static void ocfs2_downconvert_thread_do_work(struct ocfs2_super *osb)
> +{
> + unsigned long processed;
> + struct ocfs2_lock_res *lockres;
> +
> + mlog_entry_void();
> +
> + spin_lock(&osb->dc_task_lock);
> + /* grab this early so we know to try again if a state change and
> + * wake happens part-way through our work */
> + osb->dc_work_sequence = osb->dc_wake_sequence;
> +
> + processed = osb->blocked_lock_count;
> + while (processed) {
> + BUG_ON(list_empty(&osb->blocked_lock_list));
> +
> + lockres = list_entry(osb->blocked_lock_list.next,
> + struct ocfs2_lock_res, l_blocked_list);
> + list_del_init(&lockres->l_blocked_list);
> + osb->blocked_lock_count--;
> + spin_unlock(&osb->dc_task_lock);
> +
> + BUG_ON(!processed);
> + processed--;
> +
> + ocfs2_process_blocked_lock(osb, lockres);
> +
> + spin_lock(&osb->dc_task_lock);
> + }
> + spin_unlock(&osb->dc_task_lock);
Once the lock has been dropped there is (apparently) nothing to prevent
alteration of the list and of ->blocked_lock_count. If this happens,
either items will be missed or we go BUG.
> + mlog_exit_void();
> +}
> +
> +static int ocfs2_downconvert_thread_lists_empty(struct ocfs2_super *osb)
> +{
> + int empty = 0;
> +
> + spin_lock(&osb->dc_task_lock);
> + if (list_empty(&osb->blocked_lock_list))
> + empty = 1;
> +
> + spin_unlock(&osb->dc_task_lock);
> + return empty;
> +}
This function appears to be returning a value which is unreliable once the
lock was dropped.
> +static int ocfs2_downconvert_thread_should_wake(struct ocfs2_super *osb)
> +{
> + int should_wake = 0;
> +
> + spin_lock(&osb->dc_task_lock);
> + if (osb->dc_work_sequence != osb->dc_wake_sequence)
> + should_wake = 1;
> + spin_unlock(&osb->dc_task_lock);
> +
> + return should_wake;
> +}
Ditto.
> +int ocfs2_downconvert_thread(void *arg)
> +{
> + int status = 0;
> + struct ocfs2_super *osb = arg;
> +
> + /* only quit once we've been asked to stop and there is no more
> + * work available */
> + while (!(kthread_should_stop() &&
> + ocfs2_downconvert_thread_lists_empty(osb))) {
Extra whitespace
> + wait_event_interruptible(osb->dc_event,
> + ocfs2_downconvert_thread_should_wake(osb) ||
> + kthread_should_stop());
> +
> + mlog(0, "downconvert_thread: awoken\n");
> +
> + ocfs2_downconvert_thread_do_work(osb);
> + }
> +
> + osb->dc_task = NULL;
> + return status;
> +}
> +
WARNING: multiple messages have this Message-ID (diff)
From: Andrew Morton <akpm@linux-foundation.org>
To: Mark Fasheh <mark.fasheh@oracle.com>
Cc: linux-kernel@vger.kernel.org, ocfs2-devel@oss.oracle.com,
mark.fasheh@oracle.com
Subject: Re: [PATCH 03/30] ocfs2: Remove mount/unmount votes
Date: Wed, 23 Jan 2008 14:05:09 -0800 [thread overview]
Message-ID: <20080123140509.4db5fb47.akpm@linux-foundation.org> (raw)
In-Reply-To: <1200609356-17788-4-git-send-email-mark.fasheh@oracle.com>
> On Thu, 17 Jan 2008 14:35:29 -0800 Mark Fasheh <mark.fasheh@oracle.com> wrote:
> The node maps that are set/unset by these votes are no longer relevant, thus
> we can remove the mount and umount votes. Since those are the last two
> remaining votes, we can also remove the entire vote infrastructure.
>
> The vote thread has been renamed to the downconvert thread, and the small
> amount of functionality related to managing it has been moved into
> fs/ocfs2/dlmglue.c. All references to votes have been removed or updated.
>
Locking looks fishy.
>
>...
>
> +static void ocfs2_downconvert_thread_do_work(struct ocfs2_super *osb)
> +{
> + unsigned long processed;
> + struct ocfs2_lock_res *lockres;
> +
> + mlog_entry_void();
> +
> + spin_lock(&osb->dc_task_lock);
> + /* grab this early so we know to try again if a state change and
> + * wake happens part-way through our work */
> + osb->dc_work_sequence = osb->dc_wake_sequence;
> +
> + processed = osb->blocked_lock_count;
> + while (processed) {
> + BUG_ON(list_empty(&osb->blocked_lock_list));
> +
> + lockres = list_entry(osb->blocked_lock_list.next,
> + struct ocfs2_lock_res, l_blocked_list);
> + list_del_init(&lockres->l_blocked_list);
> + osb->blocked_lock_count--;
> + spin_unlock(&osb->dc_task_lock);
> +
> + BUG_ON(!processed);
> + processed--;
> +
> + ocfs2_process_blocked_lock(osb, lockres);
> +
> + spin_lock(&osb->dc_task_lock);
> + }
> + spin_unlock(&osb->dc_task_lock);
Once the lock has been dropped there is (apparently) nothing to prevent
alteration of the list and of ->blocked_lock_count. If this happens,
either items will be missed or we go BUG.
> + mlog_exit_void();
> +}
> +
> +static int ocfs2_downconvert_thread_lists_empty(struct ocfs2_super *osb)
> +{
> + int empty = 0;
> +
> + spin_lock(&osb->dc_task_lock);
> + if (list_empty(&osb->blocked_lock_list))
> + empty = 1;
> +
> + spin_unlock(&osb->dc_task_lock);
> + return empty;
> +}
This function appears to be returning a value which is unreliable once the
lock was dropped.
> +static int ocfs2_downconvert_thread_should_wake(struct ocfs2_super *osb)
> +{
> + int should_wake = 0;
> +
> + spin_lock(&osb->dc_task_lock);
> + if (osb->dc_work_sequence != osb->dc_wake_sequence)
> + should_wake = 1;
> + spin_unlock(&osb->dc_task_lock);
> +
> + return should_wake;
> +}
Ditto.
> +int ocfs2_downconvert_thread(void *arg)
> +{
> + int status = 0;
> + struct ocfs2_super *osb = arg;
> +
> + /* only quit once we've been asked to stop and there is no more
> + * work available */
> + while (!(kthread_should_stop() &&
> + ocfs2_downconvert_thread_lists_empty(osb))) {
Extra whitespace
> + wait_event_interruptible(osb->dc_event,
> + ocfs2_downconvert_thread_should_wake(osb) ||
> + kthread_should_stop());
> +
> + mlog(0, "downconvert_thread: awoken\n");
> +
> + ocfs2_downconvert_thread_do_work(osb);
> + }
> +
> + osb->dc_task = NULL;
> + return status;
> +}
> +
next prev parent reply other threads:[~2008-01-23 22:05 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-17 14:37 [Ocfs2-devel] [PATCH 0/30] Ocfs2 and Configfs patches for 2.6.25-rc1 Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:36 ` [Ocfs2-devel] [PATCH 20/30] ocfs2: Silence false lockdep warnings Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:36 ` [Ocfs2-devel] [PATCH 30/30] configfs: file.c fix possible recursive locking Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:36 ` [Ocfs2-devel] [PATCH 16/30] ocfs2: Support commit= mount option Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:36 ` [Ocfs2-devel] [PATCH 24/30] ocfs2: Update default cluster timeouts Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:36 ` [Ocfs2-devel] [PATCH 27/30] ocfs2: bump version number Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:36 ` [Ocfs2-devel] [PATCH 09/30] ocfs2: Documentation update Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:36 ` [Ocfs2-devel] [PATCH 15/30] ocfs2: build warnings fix Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:36 ` [Ocfs2-devel] [PATCH 07/30] dlm: Split lock mode and flag constants into a sharable header Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:36 ` [Ocfs2-devel] [PATCH 21/30] ocfs2: Safer read_inline_data() Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:36 ` [Ocfs2-devel] [PATCH 05/30] ocfs2: Remove data locks Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:36 ` [Ocfs2-devel] [PATCH 04/30] ocfs2: Add data downconvert worker to inode lock Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:36 ` [Ocfs2-devel] [PATCH 10/30] ocfs2: Initalize bitmap_cpg of ocfs2_super to be the maximum Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:36 ` [Ocfs2-devel] [PATCH 03/30] ocfs2: Remove mount/unmount votes Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-23 22:05 ` Andrew Morton [this message]
2008-01-23 22:05 ` [Ocfs2-devel] " Andrew Morton
2008-01-23 17:02 ` [Ocfs2-devel] " Mark Fasheh
2008-01-24 1:02 ` Mark Fasheh
2008-01-17 14:36 ` [Ocfs2-devel] [PATCH 18/30] ocfs2: add flock lock type Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:36 ` [Ocfs2-devel] [PATCH 12/30] ocfs2: Add group extend for online resize Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-23 22:05 ` Andrew Morton
2008-01-23 22:06 ` [Ocfs2-devel] " Andrew Morton
2008-01-23 19:15 ` [Ocfs2-devel] " Mark Fasheh
2008-01-24 3:14 ` Mark Fasheh
2008-01-17 14:36 ` [Ocfs2-devel] [PATCH 25/30] ocfs2: convert byte order of constant instead of variable Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:37 ` [Ocfs2-devel] [PATCH 08/30] ocfs2: Readpages support Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-23 22:05 ` Andrew Morton
2008-01-23 22:05 ` [Ocfs2-devel] " Andrew Morton
2008-01-23 17:21 ` [Ocfs2-devel] " Mark Fasheh
2008-01-24 1:20 ` Mark Fasheh
2008-01-17 14:37 ` [Ocfs2-devel] [PATCH 02/30] ocfs2: Remove fs dependency on ocfs2_heartbeat module Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:37 ` [Ocfs2-devel] [PATCH 14/30] ocfs2: Add missing permission checks Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:37 ` [Ocfs2-devel] [PATCH 01/30] ocfs2_dlm: Call node eviction callbacks from heartbeat handler Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:37 ` [Ocfs2-devel] [PATCH 23/30] ocfs2: printf fixes Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:37 ` [Ocfs2-devel] [PATCH 29/30] configfs: dir.c fix possible recursive locking Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:37 ` [Ocfs2-devel] [PATCH 06/30] ocfs2: Rename ocfs2_meta_[un]lock Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:37 ` [Ocfs2-devel] [PATCH 19/30] ocfs2: cluster aware flock() Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:37 ` [Ocfs2-devel] [PATCH 11/30] ocfs2: Reserve ioctl range Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:37 ` [Ocfs2-devel] [PATCH 28/30] configfs: Remove EXPERIMENTAL Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:37 ` [Ocfs2-devel] [PATCH 26/30] ocfs2/dlm: Clear joining_node on hearbeat node down Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:37 ` [Ocfs2-devel] [PATCH 17/30] ocfs2: Local alloc window size changeable via mount option Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:37 ` [Ocfs2-devel] [PATCH 22/30] ocfs2: Use generic_file_llseek Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-17 14:37 ` [Ocfs2-devel] [PATCH 13/30] ocfs2: Implement group add for online resize Mark Fasheh
2008-01-17 22:35 ` Mark Fasheh
2008-01-23 22:05 ` Andrew Morton
2008-01-23 22:08 ` [Ocfs2-devel] " Andrew Morton
2008-01-23 18:48 ` [Ocfs2-devel] " Mark Fasheh
2008-01-24 2:48 ` Mark Fasheh
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=20080123140509.4db5fb47.akpm@linux-foundation.org \
--to=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.fasheh@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.