Skip site navigation (1)Skip section navigation (2)
Date:      Wed,  2 Apr 2003 21:54:53 +1000 (EST)
From:      Tim Robbins <tim@robbins.dropbear.id.au>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   kern/50541: raidframe does not work
Message-ID:  <20030402115453.0C1C4B4CD@dilbert.robbins.dropbear.id.au>
Resent-Message-ID: <200304021200.h32C0RVm050688@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         50541
>Category:       kern
>Synopsis:       raidframe does not work
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Apr 02 04:00:26 PST 2003
>Closed-Date:
>Last-Modified:
>Originator:     Tim Robbins
>Release:        FreeBSD 5.0-CURRENT
>Organization:
The FreeBSD Project
>Environment:
System: FreeBSD 5.0-CURRENT dated April 2, 2003

>Description:

RAIDframe does not work in FreeBSD 5.0-CURRENT: attempts to initialise an
array cause a kernel panic.

Mounting root from ufs:/dev/ad0s1a
RAIDFRAME: protectedSectors is 64
Waiting for DAG engine to start
Warning: p_fd fields not set
panic: lockmgr: thread 0xc0a08390, not exclusive lock holder 0xc1239ab0 unlocking
panic: from debugger
Uptime: 5m42s

This is easily reproduceable, and seems to be occurring when raidlookup() calls
vn_open().


In addition to this problem, there seems to be a misunderstanding between
threads and processes in rf_threadstuff.h, specifically RF_CREATE_THREAD.
It tries to return a struct proc * from kthread_create() into the caller's
struct thread *. A patch is attached for this problem, but not for the
lockmgr panic.

>How-To-Repeat:

cat <<EOF >mirror
START array
# numRow numCol numSpare
1 2 0

START disks
/dev/md0c
/dev/md1c

START layout
# sectPerSU SUsPerParityUnit SUsPerReconUnit RAID_level_0
128 1 1 1

START queue
fifo 100
EOF

mdconfig -a -t swap -s 32m
disklabel -r -w md0 auto
mdconfig -a -t swap -s 32m
disklabel -r -w md1 auto
raidctl -C mirror

>Fix:

Fix for thread/proc mixup:

Index: rf_threadstuff.h
===================================================================
RCS file: /home/ncvs/src/sys/dev/raidframe/rf_threadstuff.h,v
retrieving revision 1.2
diff -u -r1.2 rf_threadstuff.h
--- rf_threadstuff.h	20 Mar 2003 21:17:39 -0000	1.2
+++ rf_threadstuff.h	2 Apr 2003 07:41:41 -0000
@@ -125,9 +125,21 @@
 	kthread_exit(ret)
 #elif defined(__FreeBSD__)
 #if __FreeBSD_version > 500005
+static __inline int
+rf_create_thread(struct thread **_handle, void (*_func)(void *), void *_arg,
+   const char *_name)
+{
+	struct proc *p;
+	int ret;
+	
+	ret = kthread_create(_func, _arg, &p, 0, 4, _name);
+	if (ret == 0)
+		*_handle = FIRST_THREAD_IN_PROC(p);
+	return (ret);
+}
 #define RF_CREATE_THREAD(_handle_, _func_, _arg_, _name_) \
-	kthread_create((void (*)(void *))(_func_), (void *)(_arg_), \
-	    (struct proc **)&(_handle_), 0, 4, _name_)
+	rf_create_thread(&(_handle_), (void (*)(void *))(_func_), _arg_, \
+	    _name_)
 #define RF_THREAD_EXIT(ret)	\
 	kthread_exit(ret)
 #else
>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030402115453.0C1C4B4CD>