[Cluster-devel] cluster/gfs-kernel/src/gfs daemon.c glock.c in ...

rpeterso at sourceware.org rpeterso at sourceware.org
Thu Dec 21 20:55:25 UTC 2006


CVSROOT:	/cvs/cluster
Module name:	cluster
Branch: 	RHEL5
Changes by:	rpeterso at sourceware.org	2006-12-21 20:55:25

Modified files:
	gfs-kernel/src/gfs: daemon.c glock.c incore.h ops_fstype.c 
	                    ops_super.c unlinked.c 

Log message:
	Resolves: bz 219876: mount.gfs hangs if there are insufficient
	journals configured in the filesystem

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/daemon.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.7&r2=1.7.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/glock.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.29&r2=1.29.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/incore.h.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.30&r2=1.30.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/ops_fstype.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.28.2.1&r2=1.28.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/ops_super.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.24.2.2&r2=1.24.2.3
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/unlinked.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.8&r2=1.8.2.1

--- cluster/gfs-kernel/src/gfs/daemon.c	2006/07/10 23:22:34	1.7
+++ cluster/gfs-kernel/src/gfs/daemon.c	2006/12/21 20:55:24	1.7.2.1
@@ -11,12 +11,11 @@
 *******************************************************************************
 ******************************************************************************/
 
+#include <linux/kthread.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/smp_lock.h>
 #include <linux/spinlock.h>
-#include <asm/semaphore.h>
-#include <linux/completion.h>
 #include <linux/buffer_head.h>
 
 #include "gfs.h"
@@ -41,26 +40,11 @@
 {
 	struct gfs_sbd *sdp = (struct gfs_sbd *)data;
 
-	daemonize("gfs_scand");
-	sdp->sd_scand_process = current;
-	set_bit(SDF_SCAND_RUN, &sdp->sd_flags);
-	complete(&sdp->sd_thread_completion);
-
-	for (;;) {
+	while (!kthread_should_stop()) {
 		gfs_scand_internal(sdp);
-
-		if (!test_bit(SDF_SCAND_RUN, &sdp->sd_flags))
-			break;
-
-		set_current_state(TASK_INTERRUPTIBLE);
-		schedule_timeout(gfs_tune_get(sdp, gt_scand_secs) * HZ);
+		schedule_timeout_interruptible(gfs_tune_get(sdp, gt_scand_secs) * HZ);
 	}
 
-	down(&sdp->sd_thread_lock);
-	up(&sdp->sd_thread_lock);
-
-	complete(&sdp->sd_thread_completion);
-
 	return 0;
 }
 
@@ -79,31 +63,15 @@
 {
 	struct gfs_sbd *sdp = (struct gfs_sbd *)data;
 
-	daemonize("gfs_glockd");
-	set_bit(SDF_GLOCKD_RUN, &sdp->sd_flags);
-	complete(&sdp->sd_thread_completion);
-
-	for (;;) {
+	while (!kthread_should_stop()) {
 		while (atomic_read(&sdp->sd_reclaim_count))
 			gfs_reclaim_glock(sdp);
 
-		if (!test_bit(SDF_GLOCKD_RUN, &sdp->sd_flags))
-			break;
-
-		{
-			DECLARE_WAITQUEUE(__wait_chan, current);
-			set_current_state(TASK_INTERRUPTIBLE);
-			add_wait_queue(&sdp->sd_reclaim_wchan, &__wait_chan);
-			if (!atomic_read(&sdp->sd_reclaim_count)
-			    && test_bit(SDF_GLOCKD_RUN, &sdp->sd_flags))
-				schedule();
-			remove_wait_queue(&sdp->sd_reclaim_wchan, &__wait_chan);
-			set_current_state(TASK_RUNNING);
-		}
+		wait_event_interruptible(sdp->sd_reclaim_wchan,
+								 (atomic_read(&sdp->sd_reclaim_count) ||
+								  kthread_should_stop()));
 	}
 
-	complete(&sdp->sd_thread_completion);
-
 	return 0;
 }
 
@@ -118,26 +86,11 @@
 {
 	struct gfs_sbd *sdp = (struct gfs_sbd *)data;
 
-	daemonize("gfs_recoverd");
-	sdp->sd_recoverd_process = current;
-	set_bit(SDF_RECOVERD_RUN, &sdp->sd_flags);
-	complete(&sdp->sd_thread_completion);
-
-	for (;;) {
+	while (!kthread_should_stop()) {
 		gfs_check_journals(sdp);
-
-		if (!test_bit(SDF_RECOVERD_RUN, &sdp->sd_flags))
-			break;
-
-		set_current_state(TASK_INTERRUPTIBLE);
-		schedule_timeout(gfs_tune_get(sdp, gt_recoverd_secs) * HZ);
+		schedule_timeout_interruptible(gfs_tune_get(sdp, gt_recoverd_secs) * HZ);
 	}
 
-	down(&sdp->sd_thread_lock);
-	up(&sdp->sd_thread_lock);
-
-	complete(&sdp->sd_thread_completion);
-
 	return 0;
 }
 
@@ -155,12 +108,7 @@
 	struct gfs_sbd *sdp = (struct gfs_sbd *)data;
 	struct gfs_holder ji_gh;
 
-	daemonize("gfs_logd");
-	sdp->sd_logd_process = current;
-	set_bit(SDF_LOGD_RUN, &sdp->sd_flags);
-	complete(&sdp->sd_thread_completion);
-
-	for (;;) {
+	while (!kthread_should_stop()) {
 		/* Advance the log tail */
 		gfs_ail_empty(sdp);
 
@@ -174,18 +122,9 @@
 			sdp->sd_jindex_refresh_time = jiffies;
 		}
 
-		if (!test_bit(SDF_LOGD_RUN, &sdp->sd_flags))
-			break;
-
-		set_current_state(TASK_INTERRUPTIBLE);
-		schedule_timeout(gfs_tune_get(sdp, gt_logd_secs) * HZ);
+		schedule_timeout_interruptible(gfs_tune_get(sdp, gt_logd_secs) * HZ);
 	}
 
-	down(&sdp->sd_thread_lock);
-	up(&sdp->sd_thread_lock);
-
-	complete(&sdp->sd_thread_completion);
-
 	return 0;
 }
 
@@ -201,12 +140,7 @@
 	struct gfs_sbd *sdp = (struct gfs_sbd *)data;
 	int error;
 
-	daemonize("gfs_quotad");
-	sdp->sd_quotad_process = current;
-	set_bit(SDF_QUOTAD_RUN, &sdp->sd_flags);
-	complete(&sdp->sd_thread_completion);
-
-	for (;;) {
+	while (!kthread_should_stop()) {
 		/* Update quota file */
 		if (time_after_eq(jiffies,
 				  sdp->sd_quota_sync_time +
@@ -222,19 +156,9 @@
 
 		/* Clean up */
 		gfs_quota_scan(sdp);
-
-		if (!test_bit(SDF_QUOTAD_RUN, &sdp->sd_flags))
-			break;
-
-		set_current_state(TASK_INTERRUPTIBLE);
-		schedule_timeout(gfs_tune_get(sdp, gt_quotad_secs) * HZ);
+		schedule_timeout_interruptible(gfs_tune_get(sdp, gt_quotad_secs) * HZ);
 	}
 
-	down(&sdp->sd_thread_lock);
-	up(&sdp->sd_thread_lock);
-
-	complete(&sdp->sd_thread_completion);
-
 	return 0;
 }
 
@@ -249,25 +173,10 @@
 {
 	struct gfs_sbd *sdp = (struct gfs_sbd *)data;
 
-	daemonize("gfs_inoded");
-	sdp->sd_inoded_process = current;
-	set_bit(SDF_INODED_RUN, &sdp->sd_flags);
-	complete(&sdp->sd_thread_completion);
-
-	for (;;) {
+	while (!kthread_should_stop()) {
 		gfs_unlinked_dealloc(sdp);
-
-		if (!test_bit(SDF_INODED_RUN, &sdp->sd_flags))
-			break;
-
-		set_current_state(TASK_INTERRUPTIBLE);
-		schedule_timeout(gfs_tune_get(sdp, gt_inoded_secs) * HZ);
+		schedule_timeout_interruptible(gfs_tune_get(sdp, gt_inoded_secs) * HZ);
 	}
 
-	down(&sdp->sd_thread_lock);
-	up(&sdp->sd_thread_lock);
-
-	complete(&sdp->sd_thread_completion);
-
 	return 0;
 }
--- cluster/gfs-kernel/src/gfs/glock.c	2006/09/20 18:48:56	1.29
+++ cluster/gfs-kernel/src/gfs/glock.c	2006/12/21 20:55:24	1.29.2.1
@@ -19,7 +19,6 @@
 #include <linux/completion.h>
 #include <linux/buffer_head.h>
 #include <asm/uaccess.h>
-#include <linux/lm_interface.h>
 
 #include "gfs.h"
 #include "dio.h"
@@ -2242,7 +2241,7 @@
 
 	case LM_CB_NEED_RECOVERY:
 		gfs_add_dirty_j(sdp, *(unsigned int *)data);
-		if (test_bit(SDF_RECOVERD_RUN, &sdp->sd_flags))
+		if (sdp->sd_recoverd_process)
 			wake_up_process(sdp->sd_recoverd_process);
 		return;
 
@@ -2710,7 +2709,7 @@
 		}
 
 		invalidate_inodes(sdp->sd_vfs);
-		yield();
+		schedule_timeout_interruptible(HZ / 10);
 	}
 }
 
--- cluster/gfs-kernel/src/gfs/incore.h	2006/10/23 20:15:28	1.30
+++ cluster/gfs-kernel/src/gfs/incore.h	2006/12/21 20:55:24	1.30.2.1
@@ -930,14 +930,6 @@
 #define SDF_JOURNAL_LIVE        (0)  /* Journaling is active (journal is writeable)*/
 #define SDF_SHUTDOWN            (1)  /* FS abnormaly shutdown */
 
-/* Run (1) / stop (0) flags for various daemons */
-#define SDF_SCAND_RUN           (2)  /* Put unused glocks on reclaim queue */
-#define SDF_GLOCKD_RUN          (3)  /* Reclaim (dealloc) unused glocks */
-#define SDF_RECOVERD_RUN        (4)  /* Recover journal of a crashed node */
-#define SDF_LOGD_RUN            (5)  /* Update log tail after AIL flushed */
-#define SDF_QUOTAD_RUN          (6)  /* Sync quota changes to file, cleanup */
-#define SDF_INODED_RUN          (7)  /* Deallocate unlinked inodes */
-
 /* (Re)mount options from Linux VFS */
 #define SDF_NOATIME             (8)  /* Don't change access time */
 #define SDF_ROFS                (9)  /* Read-only mode */
@@ -1077,10 +1069,6 @@
 	/* Clean up unused inode structures */
 	struct task_struct *sd_inoded_process;
 
-	/* Support for starting/stopping daemons */
-	struct semaphore sd_thread_lock;
-	struct completion sd_thread_completion;
-
 	/*  Log stuff  */
 
 	/* Transaction lock protects the following from one another:
--- cluster/gfs-kernel/src/gfs/ops_fstype.c	2006/12/19 20:07:25	1.28.2.1
+++ cluster/gfs-kernel/src/gfs/ops_fstype.c	2006/12/21 20:55:24	1.28.2.2
@@ -86,9 +86,6 @@
 
 	init_MUTEX(&sdp->sd_freeze_lock);
 
-	init_MUTEX(&sdp->sd_thread_lock);
-	init_completion(&sdp->sd_thread_completion);
-
 	spin_lock_init(&sdp->sd_log_seg_lock);
 	INIT_LIST_HEAD(&sdp->sd_log_seg_list);
 	init_waitqueue_head(&sdp->sd_log_seg_wait);
@@ -279,11 +276,10 @@
 	struct super_block *sb = sdp->sd_vfs;
 	struct gfs_holder sb_gh;
 	int error = 0;
-	int super = TRUE;
+	struct inode *inode;
 
-	if (undo) {
-		return 0;
-	}
+	if (undo)
+		goto fail_dput;
 
 	/*  Read the SuperBlock from disk, get enough info to enable us
 	    to read-in the journal index and replay all journals. */
@@ -312,13 +308,13 @@
 	if (sdp->sd_sb.sb_bsize < bdev_hardsect_size(sb->s_bdev)) {
 		printk("GFS: fsid=%s: FS block size (%u) is too small for device block size (%u)\n",
 		       sdp->sd_fsname, sdp->sd_sb.sb_bsize, bdev_hardsect_size(sb->s_bdev));
-		goto out;
+		goto fail;
 	}
 	if (sdp->sd_sb.sb_bsize > PAGE_SIZE) {
 		printk("GFS: fsid=%s: FS block size (%u) is too big for machine page size (%u)\n",
 		       sdp->sd_fsname, sdp->sd_sb.sb_bsize,
 		       (unsigned int)PAGE_SIZE);
-		goto out;
+		goto fail;
 	}
 
 	/*  Get rid of buffers from the original block size  */
@@ -333,7 +329,7 @@
 	if (error) {
 		printk("GFS: fsid=%s: can't get resource index inode: %d\n",
 		       sdp->sd_fsname, error);
-		goto out;
+		goto fail;
 	}
 
 	/*  Get the root inode  */
@@ -341,12 +337,22 @@
 	if (error) {
 		printk("GFS: fsid=%s: can't read in root inode: %d\n",
 		       sdp->sd_fsname, error);
-		goto out;
+		goto fail_ri_free;
+	}
+	/*  Get the root inode/dentry  */
+
+	inode = gfs_iget(sdp->sd_rooti, CREATE);
+	if (!inode) {
+		printk("GFS: fsid=%s: can't get root inode\n", sdp->sd_fsname);
+		error = -ENOMEM;
+		goto fail_ri_free;
 	}
-	sb->s_root = d_alloc_root(gfs_iget(sdp->sd_rooti, TRUE));
+	sb->s_root = d_alloc_root(inode);
 	if (!sb->s_root) {
-		printk("GFS: can't get root dentry\n");
+		iput(inode);
+		printk("GFS: fsid=%s: can't get root dentry\n", sdp->sd_fsname);
 		error = -ENOMEM;
+		goto fail_root_free;
 	}
 	sb->s_root->d_op = &gfs_dops;
 
@@ -355,13 +361,28 @@
 	if (error) {
 		printk("GFS: fsid=%s: can't get quota file inode: %d\n",
 		       sdp->sd_fsname, error);
-		goto out;
+		goto fail_root_free;
 	}
 
 	/*  We're through with the superblock lock  */
 out:
 	gfs_glock_dq_uninit(&sb_gh);
-	super = FALSE;
+	return error;
+
+fail_dput:
+	if (sb->s_root) {
+		dput(sb->s_root);
+		sb->s_root = NULL;
+	}
+	gfs_inode_put(sdp->sd_qinode);
+fail_root_free:
+	gfs_inode_put(sdp->sd_rooti);
+fail_ri_free:
+	gfs_inode_put(sdp->sd_riinode);
+	gfs_clear_rgrpd(sdp);
+fail:
+	if (!undo)
+		gfs_glock_dq_uninit(&sb_gh);
 	return error;
 }
 
@@ -386,7 +407,7 @@
 	error = gfs_glock_get(sdp, GFS_TRANS_LOCK, &gfs_trans_glops,
 			      CREATE, &sdp->sd_trans_gl);
 	if (error)
-		goto fail;
+		return error;
 	set_bit(GLF_STICKY, &sdp->sd_trans_gl->gl_flags);
 
 	/*  Load in the journal index special file */
@@ -395,7 +416,7 @@
 	if (error) {
 		printk("GFS: fsid=%s: can't read journal index: %d\n",
 		       sdp->sd_fsname, error);
-		goto fail_jindex;
+		goto fail_jhold;
 	}
 
 	if (sdp->sd_args.ar_spectator) {
@@ -469,7 +490,7 @@
 		if (error) {
 			printk("GFS: fsid=%s: can't make file system RW: %d\n",
 			       sdp->sd_fsname, error);
-			goto fail;
+			goto fail_journal_gh;
 		}
 	}
 
@@ -497,7 +518,9 @@
 fail_jindex:
 	if (jindex)
 		gfs_glock_dq_uninit(&ji_gh);
-fail:
+
+fail_jhold:
+	gfs_glock_put(sdp->sd_trans_gl);
 	return error;
 }
 
@@ -533,7 +556,7 @@
 
 	/*  Start up the inoded thread  */
 
-	error = kernel_thread(gfs_inoded, sdp, 0);
+	p = kthread_run(gfs_inoded, sdp, "gfs_inoded");
 	if (error < 0) {
 		printk("GFS: fsid=%s: can't start inoded thread: %d\n",
 		       sdp->sd_fsname, error);
@@ -543,7 +566,7 @@
 	return 0;
 
 fail_logd:
-	kthread_stop(sdp->sd_logd_process);
+	kthread_stop(sdp->sd_inoded_process);
 fail_inoded:
 	kthread_stop(sdp->sd_quotad_process);
 fail_quotad:
@@ -663,7 +686,7 @@
 	if (error) {
 		printk("GFS: fsid=%s: can't get journal index inode: %d\n",
 		       sdp->sd_fsname, error);
-		goto fail_sb;
+		goto fail_jiinode;
 	}
 
 	error = init_journal(sdp, DO);
@@ -689,13 +712,18 @@
 	init_journal(sdp, UNDO);
 
 fail_sb:
+	gfs_inode_put(sdp->sd_jiinode);
+
+fail_jiinode:
 	init_sb(sdp, 0, UNDO);
 
 fail_locking:
 	init_locking(sdp, &mount_gh, UNDO);
 
 fail_lm:
+	gfs_gl_hash_clear(sdp, TRUE);
 	gfs_lm_unmount(sdp);
+	gfs_clear_dirty_j(sdp);
 	while (invalidate_inodes(sb))
 		yield();
 
--- cluster/gfs-kernel/src/gfs/ops_super.c	2006/12/05 22:30:50	1.24.2.2
+++ cluster/gfs-kernel/src/gfs/ops_super.c	2006/12/21 20:55:24	1.24.2.3
@@ -11,12 +11,12 @@
 *******************************************************************************
 ******************************************************************************/
 
+#include <linux/kthread.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/smp_lock.h>
 #include <linux/spinlock.h>
 #include <asm/semaphore.h>
-#include <linux/completion.h>
 #include <linux/buffer_head.h>
 #include <linux/vmalloc.h>
 #include <linux/statfs.h>
@@ -112,45 +112,23 @@
 	up(&sdp->sd_freeze_lock);
 
 	/*  Kill off the inode thread  */
-	down(&sdp->sd_thread_lock);
-	clear_bit(SDF_INODED_RUN, &sdp->sd_flags);
-	wake_up_process(sdp->sd_inoded_process);
-	up(&sdp->sd_thread_lock);
-	wait_for_completion(&sdp->sd_thread_completion);
+	kthread_stop(sdp->sd_inoded_process);
 
 	/*  Kill off the quota thread  */
-	down(&sdp->sd_thread_lock);
-	clear_bit(SDF_QUOTAD_RUN, &sdp->sd_flags);
-	wake_up_process(sdp->sd_quotad_process);
-	up(&sdp->sd_thread_lock);
-	wait_for_completion(&sdp->sd_thread_completion);
+	kthread_stop(sdp->sd_quotad_process);
 
 	/*  Kill off the log thread  */
-	down(&sdp->sd_thread_lock);
-	clear_bit(SDF_LOGD_RUN, &sdp->sd_flags);
-	wake_up_process(sdp->sd_logd_process);
-	up(&sdp->sd_thread_lock);
-	wait_for_completion(&sdp->sd_thread_completion);
+	kthread_stop(sdp->sd_logd_process);
 
 	/*  Kill off the recoverd thread  */
-	down(&sdp->sd_thread_lock);
-	clear_bit(SDF_RECOVERD_RUN, &sdp->sd_flags);
-	wake_up_process(sdp->sd_recoverd_process);
-	up(&sdp->sd_thread_lock);
-	wait_for_completion(&sdp->sd_thread_completion);
+	kthread_stop(sdp->sd_recoverd_process);
 
 	/*  Kill off the glockd threads  */
-	clear_bit(SDF_GLOCKD_RUN, &sdp->sd_flags);
-	wake_up(&sdp->sd_reclaim_wchan);
 	while (sdp->sd_glockd_num--)
-		wait_for_completion(&sdp->sd_thread_completion);
+		kthread_stop(sdp->sd_glockd_process[sdp->sd_glockd_num]);
 
 	/*  Kill off the scand thread  */
-	down(&sdp->sd_thread_lock);
-	clear_bit(SDF_SCAND_RUN, &sdp->sd_flags);
-	wake_up_process(sdp->sd_scand_process);
-	up(&sdp->sd_thread_lock);
-	wait_for_completion(&sdp->sd_thread_completion);
+	kthread_stop(sdp->sd_scand_process);
 
 	if (!test_bit(SDF_ROFS, &sdp->sd_flags)) {
 		error = gfs_make_fs_ro(sdp);
--- cluster/gfs-kernel/src/gfs/unlinked.c	2006/07/10 23:22:34	1.8
+++ cluster/gfs-kernel/src/gfs/unlinked.c	2006/12/21 20:55:24	1.8.2.1
@@ -11,6 +11,7 @@
 *******************************************************************************
 ******************************************************************************/
 
+#include <linux/kthread.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/smp_lock.h>
@@ -429,7 +430,7 @@
 				goto out;
 		}
 
-		if (!hits || !test_bit(SDF_INODED_RUN, &sdp->sd_flags))
+		if (!hits || kthread_should_stop())
 			break;
 
 		cond_resched();




More information about the Cluster-devel mailing list