Hello community,
here is the log from the commit of package kernel-source
checked in at Tue Apr 18 19:14:01 CEST 2006.
--------
--- kernel-source/kernel-bigsmp.changes 2006-04-13 15:27:51.000000000 +0200
+++ STABLE/kernel-source/kernel-bigsmp.changes 2006-04-18 18:32:16.000000000 +0200
@@ -1,0 +2,58 @@
+Tue Apr 18 16:26:24 CEST 2006 - gregkh@suse.de
+
+- Update to 2.6.16.7 (lots of security fixes and other bug stuff)
+- patches.arch/x86_64-execve-cleanup: Delete.
+- patches.arch/x86_64-force-iret: Delete.
+- patches.arch/ppc-iseries-slb_initialize.patch: Delete.
+- patches.arch/ppc-SA_ONSTACK-fix.patch: Delete.
+- patches.drivers/cciss-softirq-oops: Delete.
+- patches.fixes/RLIMIT_CPU-fix-handling-of-a-zero-limit.patch:
+ Delete.
+- patches.fixes/ptrace-suspend: Delete.
+- patches.kernel.org/patch-2.6.16.4: Delete.
+- patches.kernel.org/patch-2.6.16.7: Linux 2.6.16.7.
+
+-------------------------------------------------------------------
+Tue Apr 18 17:08:19 CEST 2006 - lmb@suse.de
+
+- patches.fixes/ptrace-suspend: Fix suspend/resume of straced tasks
+ (161743).
+
+-------------------------------------------------------------------
+Tue Apr 18 16:38:45 CEST 2006 - schwab@suse.de
+
+- show-mem: Make show_mem() skip holes in a pgdat [#166284].
+
+-------------------------------------------------------------------
+Tue Apr 18 15:09:43 CEST 2006 - olh@suse.de
+
+- update patches.arch/ppc-kdump-soft-reset.patch
+ fix compile on ppc32
+
+-------------------------------------------------------------------
+Thu Apr 13 22:26:19 CEST 2006 - jeffm@suse.de
+
+- patches.suse/ocfs2-update-2006-04-11.diff: OCFS2 Code Update
+ for SLES 10 - 2006-04-11.
+
+-------------------------------------------------------------------
+Thu Apr 13 22:23:47 CEST 2006 - jeffm@suse.de
+
+- Fixes for bug #163243
+- patches.fixes/idr_replace.diff: idr: add idr_replace method
+ for replacing pointers.
+- patches.fixes/dm-use-idr_replace.diff: dm: use idr_replace
+ for minor_idr.
+- patches.fixes/dm-idr_pre_get-ordering.diff: dm: fix
+ idr_pre_get lock ordering.
+- patches.fixes/dm-use-spinlock.diff: dm: use spinlock for
+ _minor_lock.
+- patches.fixes/dm-DMF_FREEING.diff: dm: add DMF_FREEING flag
+ to indicate that a mapped_device is no longer legal to use.
+- patches.fixes/dm-proper-refcounting.diff: dm: fix refcounting.
+- patches.fixes/dm-module-refcount.diff: dm: proper module
+ reference counting.
+- patches.fixes/dm-initialize-ordering.diff: dm: fix ordering of
+ initialization in alloc_dev().
+
+-------------------------------------------------------------------
kernel-debug.changes: same change
kernel-default.changes: same change
kernel-dummy.changes: same change
kernel-iseries64.changes: same change
kernel-kdump.changes: same change
kernel-ppc64.changes: same change
kernel-s390.changes: same change
kernel-smp.changes: same change
kernel-source.changes: same change
kernel-syms.changes: same change
kernel-um.changes: same change
kernel-xen.changes: same change
kernel-xenpae.changes: same change
New:
----
needed_space_in_mb
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ kernel-bigsmp.spec ++++++
--- /var/tmp/diff_new_pack.aHPy8u/_old 2006-04-18 19:09:56.000000000 +0200
+++ /var/tmp/diff_new_pack.aHPy8u/_new 2006-04-18 19:09:56.000000000 +0200
@@ -1,5 +1,5 @@
#
-# spec file for package kernel-bigsmp (Version 2.6.16.4)
+# spec file for package kernel-bigsmp (Version 2.6.16)
#
# Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@@ -20,8 +20,8 @@
# arch/ia64/scripts/unwcheck.py
BuildRequires: python
%endif
-Version: 2.6.16.4
-Release: 1
+Version: 2.6.16
+Release: 21
Summary: Kernel with Multiprocessor Support and PAE
License: GPL
Group: System/Kernel
@@ -29,7 +29,7 @@
#Conflicts: kernel
%else
%if !%build_xen
-Provides: kernel = 2.6.16.4-%release
+Provides: kernel = 2.6.16-%release
%endif
%endif
Provides: kernel-bigsmp-nongpl
@@ -115,12 +115,12 @@
-Source Timestamp: 2006-04-13 13:26:39 +0000
+Source Timestamp: 2006/04/18 15:59:05 UTC
%prep
if ! [ -e %_sourcedir/linux-2.6.16.tar.bz2 ]; then
- echo "The kernel-bigsmp-2.6.16.4.nosrc.rpm package does not contain the" \
- "complete sources. Please install kernel-source-2.6.16.4.src.rpm."
+ echo "The kernel-bigsmp-2.6.16.nosrc.rpm package does not contain the" \
+ "complete sources. Please install kernel-source-2.6.16.src.rpm."
exit 1
fi
symbols=$(
@@ -441,6 +441,46 @@
%files -f kernel.files
%changelog -n kernel-bigsmp
+* Tue Apr 18 2006 - lmb@suse.de
+- patches.fixes/ptrace-suspend: Fix suspend/resume of straced tasks
+ (161743).
+* Tue Apr 18 2006 - schwab@suse.de
+- show-mem: Make show_mem() skip holes in a pgdat [#166284].
+* Tue Apr 18 2006 - gregkh@suse.de
+- Update to 2.6.16.7 (lots of security fixes and other bug stuff)
+- patches.arch/x86_64-execve-cleanup: Delete.
+- patches.arch/x86_64-force-iret: Delete.
+- patches.arch/ppc-iseries-slb_initialize.patch: Delete.
+- patches.arch/ppc-SA_ONSTACK-fix.patch: Delete.
+- patches.drivers/cciss-softirq-oops: Delete.
+- patches.fixes/RLIMIT_CPU-fix-handling-of-a-zero-limit.patch:
+ Delete.
+- patches.fixes/ptrace-suspend: Delete.
+- patches.kernel.org/patch-2.6.16.4: Delete.
+- patches.kernel.org/patch-2.6.16.7: Linux 2.6.16.7.
+* Tue Apr 18 2006 - olh@suse.de
+- update patches.arch/ppc-kdump-soft-reset.patch
+ fix compile on ppc32
+* Thu Apr 13 2006 - jeffm@suse.de
+- patches.suse/ocfs2-update-2006-04-11.diff: OCFS2 Code Update
+ for SLES 10 - 2006-04-11.
+* Thu Apr 13 2006 - jeffm@suse.de
+- Fixes for bug #163243
+- patches.fixes/idr_replace.diff: idr: add idr_replace method
+ for replacing pointers.
+- patches.fixes/dm-use-idr_replace.diff: dm: use idr_replace
+ for minor_idr.
+- patches.fixes/dm-idr_pre_get-ordering.diff: dm: fix
+ idr_pre_get lock ordering.
+- patches.fixes/dm-use-spinlock.diff: dm: use spinlock for
+ _minor_lock.
+- patches.fixes/dm-DMF_FREEING.diff: dm: add DMF_FREEING flag
+ to indicate that a mapped_device is no longer legal to use.
+- patches.fixes/dm-proper-refcounting.diff: dm: fix refcounting.
+- patches.fixes/dm-module-refcount.diff: dm: proper module
+ reference counting.
+- patches.fixes/dm-initialize-ordering.diff: dm: fix ordering of
+ initialization in alloc_dev().
* Thu Apr 13 2006 - olh@suse.de
- add patches.fixes/file-lookup-without-ref.patch
fix possible NULL dentry (165361 - LTC21992)
kernel-debug.spec: same change
kernel-default.spec: same change
++++++ kernel-dummy.spec ++++++
--- /var/tmp/diff_new_pack.aHPy8u/_old 2006-04-18 19:09:56.000000000 +0200
+++ /var/tmp/diff_new_pack.aHPy8u/_new 2006-04-18 19:09:56.000000000 +0200
@@ -1,5 +1,5 @@
#
-# spec file for package kernel-dummy (Version 2.6.16.4)
+# spec file for package kernel-dummy (Version 2.6.16)
#
# Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@@ -16,8 +16,8 @@
Autoreqprov: off
Summary: Internal dummy package for synchronizing release numbers
Group: System/Kernel
-Version: 2.6.16.4
-Release: 1
+Version: 2.6.16
+Release: 21
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description
@@ -27,7 +27,7 @@
--------
Andreas Gruenbacher
-Source Timestamp: 2006-04-13 13:26:39 +0000
+Source Timestamp: 2006/04/18 15:59:05 UTC
%install
@@ -40,6 +40,46 @@
/etc/dummy
%changelog -n kernel-dummy
+* Tue Apr 18 2006 - lmb@suse.de
+- patches.fixes/ptrace-suspend: Fix suspend/resume of straced tasks
+ (161743).
+* Tue Apr 18 2006 - schwab@suse.de
+- show-mem: Make show_mem() skip holes in a pgdat [#166284].
+* Tue Apr 18 2006 - gregkh@suse.de
+- Update to 2.6.16.7 (lots of security fixes and other bug stuff)
+- patches.arch/x86_64-execve-cleanup: Delete.
+- patches.arch/x86_64-force-iret: Delete.
+- patches.arch/ppc-iseries-slb_initialize.patch: Delete.
+- patches.arch/ppc-SA_ONSTACK-fix.patch: Delete.
+- patches.drivers/cciss-softirq-oops: Delete.
+- patches.fixes/RLIMIT_CPU-fix-handling-of-a-zero-limit.patch:
+ Delete.
+- patches.fixes/ptrace-suspend: Delete.
+- patches.kernel.org/patch-2.6.16.4: Delete.
+- patches.kernel.org/patch-2.6.16.7: Linux 2.6.16.7.
+* Tue Apr 18 2006 - olh@suse.de
+- update patches.arch/ppc-kdump-soft-reset.patch
+ fix compile on ppc32
+* Thu Apr 13 2006 - jeffm@suse.de
+- patches.suse/ocfs2-update-2006-04-11.diff: OCFS2 Code Update
+ for SLES 10 - 2006-04-11.
+* Thu Apr 13 2006 - jeffm@suse.de
+- Fixes for bug #163243
+- patches.fixes/idr_replace.diff: idr: add idr_replace method
+ for replacing pointers.
+- patches.fixes/dm-use-idr_replace.diff: dm: use idr_replace
+ for minor_idr.
+- patches.fixes/dm-idr_pre_get-ordering.diff: dm: fix
+ idr_pre_get lock ordering.
+- patches.fixes/dm-use-spinlock.diff: dm: use spinlock for
+ _minor_lock.
+- patches.fixes/dm-DMF_FREEING.diff: dm: add DMF_FREEING flag
+ to indicate that a mapped_device is no longer legal to use.
+- patches.fixes/dm-proper-refcounting.diff: dm: fix refcounting.
+- patches.fixes/dm-module-refcount.diff: dm: proper module
+ reference counting.
+- patches.fixes/dm-initialize-ordering.diff: dm: fix ordering of
+ initialization in alloc_dev().
* Thu Apr 13 2006 - olh@suse.de
- add patches.fixes/file-lookup-without-ref.patch
fix possible NULL dentry (165361 - LTC21992)
++++++ kernel-iseries64.spec ++++++
--- /var/tmp/diff_new_pack.aHPy8u/_old 2006-04-18 19:09:56.000000000 +0200
+++ /var/tmp/diff_new_pack.aHPy8u/_new 2006-04-18 19:09:56.000000000 +0200
@@ -1,5 +1,5 @@
#
-# spec file for package kernel-iseries64 (Version 2.6.16.4)
+# spec file for package kernel-iseries64 (Version 2.6.16)
#
# Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@@ -20,8 +20,8 @@
# arch/ia64/scripts/unwcheck.py
BuildRequires: python
%endif
-Version: 2.6.16.4
-Release: 1
+Version: 2.6.16
+Release: 19
Summary: 64-Bit Kernel for iSeries
License: GPL
Group: System/Kernel
@@ -29,7 +29,7 @@
#Conflicts: kernel
%else
%if !%build_xen
-Provides: kernel = 2.6.16.4-%release
+Provides: kernel = 2.6.16-%release
%endif
%endif
Provides: kernel-iseries64-nongpl
@@ -116,12 +116,12 @@
-Source Timestamp: 2006-04-13 13:26:39 +0000
+Source Timestamp: 2006/04/18 15:59:05 UTC
%prep
if ! [ -e %_sourcedir/linux-2.6.16.tar.bz2 ]; then
- echo "The kernel-iseries64-2.6.16.4.nosrc.rpm package does not contain the" \
- "complete sources. Please install kernel-source-2.6.16.4.src.rpm."
+ echo "The kernel-iseries64-2.6.16.nosrc.rpm package does not contain the" \
+ "complete sources. Please install kernel-source-2.6.16.src.rpm."
exit 1
fi
symbols=$(
@@ -442,6 +442,46 @@
%files -f kernel.files
%changelog -n kernel-iseries64
+* Tue Apr 18 2006 - lmb@suse.de
+- patches.fixes/ptrace-suspend: Fix suspend/resume of straced tasks
+ (161743).
+* Tue Apr 18 2006 - schwab@suse.de
+- show-mem: Make show_mem() skip holes in a pgdat [#166284].
+* Tue Apr 18 2006 - gregkh@suse.de
+- Update to 2.6.16.7 (lots of security fixes and other bug stuff)
+- patches.arch/x86_64-execve-cleanup: Delete.
+- patches.arch/x86_64-force-iret: Delete.
+- patches.arch/ppc-iseries-slb_initialize.patch: Delete.
+- patches.arch/ppc-SA_ONSTACK-fix.patch: Delete.
+- patches.drivers/cciss-softirq-oops: Delete.
+- patches.fixes/RLIMIT_CPU-fix-handling-of-a-zero-limit.patch:
+ Delete.
+- patches.fixes/ptrace-suspend: Delete.
+- patches.kernel.org/patch-2.6.16.4: Delete.
+- patches.kernel.org/patch-2.6.16.7: Linux 2.6.16.7.
+* Tue Apr 18 2006 - olh@suse.de
+- update patches.arch/ppc-kdump-soft-reset.patch
+ fix compile on ppc32
+* Thu Apr 13 2006 - jeffm@suse.de
+- patches.suse/ocfs2-update-2006-04-11.diff: OCFS2 Code Update
+ for SLES 10 - 2006-04-11.
+* Thu Apr 13 2006 - jeffm@suse.de
+- Fixes for bug #163243
+- patches.fixes/idr_replace.diff: idr: add idr_replace method
+ for replacing pointers.
+- patches.fixes/dm-use-idr_replace.diff: dm: use idr_replace
+ for minor_idr.
+- patches.fixes/dm-idr_pre_get-ordering.diff: dm: fix
+ idr_pre_get lock ordering.
+- patches.fixes/dm-use-spinlock.diff: dm: use spinlock for
+ _minor_lock.
+- patches.fixes/dm-DMF_FREEING.diff: dm: add DMF_FREEING flag
+ to indicate that a mapped_device is no longer legal to use.
+- patches.fixes/dm-proper-refcounting.diff: dm: fix refcounting.
+- patches.fixes/dm-module-refcount.diff: dm: proper module
+ reference counting.
+- patches.fixes/dm-initialize-ordering.diff: dm: fix ordering of
+ initialization in alloc_dev().
* Thu Apr 13 2006 - olh@suse.de
- add patches.fixes/file-lookup-without-ref.patch
fix possible NULL dentry (165361 - LTC21992)
++++++ kernel-kdump.spec ++++++
--- /var/tmp/diff_new_pack.aHPy8u/_old 2006-04-18 19:09:56.000000000 +0200
+++ /var/tmp/diff_new_pack.aHPy8u/_new 2006-04-18 19:09:56.000000000 +0200
@@ -1,5 +1,5 @@
#
-# spec file for package kernel-kdump (Version 2.6.16.4)
+# spec file for package kernel-kdump (Version 2.6.16)
#
# Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@@ -20,8 +20,8 @@
# arch/ia64/scripts/unwcheck.py
BuildRequires: python
%endif
-Version: 2.6.16.4
-Release: 1
+Version: 2.6.16
+Release: 21
Summary: kernel for kdump
License: GPL
Group: System/Kernel
@@ -29,7 +29,7 @@
#Conflicts: kernel
%else
%if !%build_xen
-Provides: kernel = 2.6.16.4-%release
+Provides: kernel = 2.6.16-%release
%endif
%endif
Provides: kernel-kdump-nongpl
@@ -125,12 +125,12 @@
-Source Timestamp: 2006-04-13 13:26:39 +0000
+Source Timestamp: 2006/04/18 15:59:05 UTC
%prep
if ! [ -e %_sourcedir/linux-2.6.16.tar.bz2 ]; then
- echo "The kernel-kdump-2.6.16.4.nosrc.rpm package does not contain the" \
- "complete sources. Please install kernel-source-2.6.16.4.src.rpm."
+ echo "The kernel-kdump-2.6.16.nosrc.rpm package does not contain the" \
+ "complete sources. Please install kernel-source-2.6.16.src.rpm."
exit 1
fi
symbols=$(
@@ -451,6 +451,46 @@
%files -f kernel.files
%changelog -n kernel-kdump
+* Tue Apr 18 2006 - lmb@suse.de
+- patches.fixes/ptrace-suspend: Fix suspend/resume of straced tasks
+ (161743).
+* Tue Apr 18 2006 - schwab@suse.de
+- show-mem: Make show_mem() skip holes in a pgdat [#166284].
+* Tue Apr 18 2006 - gregkh@suse.de
+- Update to 2.6.16.7 (lots of security fixes and other bug stuff)
+- patches.arch/x86_64-execve-cleanup: Delete.
+- patches.arch/x86_64-force-iret: Delete.
+- patches.arch/ppc-iseries-slb_initialize.patch: Delete.
+- patches.arch/ppc-SA_ONSTACK-fix.patch: Delete.
+- patches.drivers/cciss-softirq-oops: Delete.
+- patches.fixes/RLIMIT_CPU-fix-handling-of-a-zero-limit.patch:
+ Delete.
+- patches.fixes/ptrace-suspend: Delete.
+- patches.kernel.org/patch-2.6.16.4: Delete.
+- patches.kernel.org/patch-2.6.16.7: Linux 2.6.16.7.
+* Tue Apr 18 2006 - olh@suse.de
+- update patches.arch/ppc-kdump-soft-reset.patch
+ fix compile on ppc32
+* Thu Apr 13 2006 - jeffm@suse.de
+- patches.suse/ocfs2-update-2006-04-11.diff: OCFS2 Code Update
+ for SLES 10 - 2006-04-11.
+* Thu Apr 13 2006 - jeffm@suse.de
+- Fixes for bug #163243
+- patches.fixes/idr_replace.diff: idr: add idr_replace method
+ for replacing pointers.
+- patches.fixes/dm-use-idr_replace.diff: dm: use idr_replace
+ for minor_idr.
+- patches.fixes/dm-idr_pre_get-ordering.diff: dm: fix
+ idr_pre_get lock ordering.
+- patches.fixes/dm-use-spinlock.diff: dm: use spinlock for
+ _minor_lock.
+- patches.fixes/dm-DMF_FREEING.diff: dm: add DMF_FREEING flag
+ to indicate that a mapped_device is no longer legal to use.
+- patches.fixes/dm-proper-refcounting.diff: dm: fix refcounting.
+- patches.fixes/dm-module-refcount.diff: dm: proper module
+ reference counting.
+- patches.fixes/dm-initialize-ordering.diff: dm: fix ordering of
+ initialization in alloc_dev().
* Thu Apr 13 2006 - olh@suse.de
- add patches.fixes/file-lookup-without-ref.patch
fix possible NULL dentry (165361 - LTC21992)
++++++ kernel-ppc64.spec ++++++
--- /var/tmp/diff_new_pack.aHPy8u/_old 2006-04-18 19:09:56.000000000 +0200
+++ /var/tmp/diff_new_pack.aHPy8u/_new 2006-04-18 19:09:56.000000000 +0200
@@ -1,5 +1,5 @@
#
-# spec file for package kernel-ppc64 (Version 2.6.16.4)
+# spec file for package kernel-ppc64 (Version 2.6.16)
#
# Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@@ -19,8 +19,8 @@
# arch/ia64/scripts/unwcheck.py
BuildRequires: python
%endif
-Version: 2.6.16.4
-Release: 1
+Version: 2.6.16
+Release: 19
Summary: Kernel for ppc64 Systems
License: GPL, LGPL
Group: System/Kernel
@@ -28,7 +28,7 @@
#Conflicts: kernel
%else
%if !%build_xen
-Provides: kernel = 2.6.16.4-%release
+Provides: kernel = 2.6.16-%release
%endif
%endif
Provides: kernel-ppc64-nongpl
@@ -130,12 +130,12 @@
Tom Gall
see /usr/src/linux-pmac-benh/CREDITS for more details.
-Source Timestamp: 2006-04-13 13:26:39 +0000
+Source Timestamp: 2006/04/18 15:59:05 UTC
%prep
if ! [ -e %_sourcedir/linux-2.6.16.tar.bz2 ]; then
- echo "The kernel-ppc64-2.6.16.4.nosrc.rpm package does not contain the" \
- "complete sources. Please install kernel-source-2.6.16.4.src.rpm."
+ echo "The kernel-ppc64-2.6.16.nosrc.rpm package does not contain the" \
+ "complete sources. Please install kernel-source-2.6.16.src.rpm."
exit 1
fi
symbols=$(
@@ -456,6 +456,46 @@
%files -f kernel.files
%changelog -n kernel-ppc64
+* Tue Apr 18 2006 - lmb@suse.de
+- patches.fixes/ptrace-suspend: Fix suspend/resume of straced tasks
+ (161743).
+* Tue Apr 18 2006 - schwab@suse.de
+- show-mem: Make show_mem() skip holes in a pgdat [#166284].
+* Tue Apr 18 2006 - gregkh@suse.de
+- Update to 2.6.16.7 (lots of security fixes and other bug stuff)
+- patches.arch/x86_64-execve-cleanup: Delete.
+- patches.arch/x86_64-force-iret: Delete.
+- patches.arch/ppc-iseries-slb_initialize.patch: Delete.
+- patches.arch/ppc-SA_ONSTACK-fix.patch: Delete.
+- patches.drivers/cciss-softirq-oops: Delete.
+- patches.fixes/RLIMIT_CPU-fix-handling-of-a-zero-limit.patch:
+ Delete.
+- patches.fixes/ptrace-suspend: Delete.
+- patches.kernel.org/patch-2.6.16.4: Delete.
+- patches.kernel.org/patch-2.6.16.7: Linux 2.6.16.7.
+* Tue Apr 18 2006 - olh@suse.de
+- update patches.arch/ppc-kdump-soft-reset.patch
+ fix compile on ppc32
+* Thu Apr 13 2006 - jeffm@suse.de
+- patches.suse/ocfs2-update-2006-04-11.diff: OCFS2 Code Update
+ for SLES 10 - 2006-04-11.
+* Thu Apr 13 2006 - jeffm@suse.de
+- Fixes for bug #163243
+- patches.fixes/idr_replace.diff: idr: add idr_replace method
+ for replacing pointers.
+- patches.fixes/dm-use-idr_replace.diff: dm: use idr_replace
+ for minor_idr.
+- patches.fixes/dm-idr_pre_get-ordering.diff: dm: fix
+ idr_pre_get lock ordering.
+- patches.fixes/dm-use-spinlock.diff: dm: use spinlock for
+ _minor_lock.
+- patches.fixes/dm-DMF_FREEING.diff: dm: add DMF_FREEING flag
+ to indicate that a mapped_device is no longer legal to use.
+- patches.fixes/dm-proper-refcounting.diff: dm: fix refcounting.
+- patches.fixes/dm-module-refcount.diff: dm: proper module
+ reference counting.
+- patches.fixes/dm-initialize-ordering.diff: dm: fix ordering of
+ initialization in alloc_dev().
* Thu Apr 13 2006 - olh@suse.de
- add patches.fixes/file-lookup-without-ref.patch
fix possible NULL dentry (165361 - LTC21992)
++++++ kernel-s390.spec ++++++
--- /var/tmp/diff_new_pack.aHPy8u/_old 2006-04-18 19:09:57.000000000 +0200
+++ /var/tmp/diff_new_pack.aHPy8u/_new 2006-04-18 19:09:57.000000000 +0200
@@ -1,5 +1,5 @@
#
-# spec file for package kernel-s390 (Version 2.6.16.4)
+# spec file for package kernel-s390 (Version 2.6.16)
#
# Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@@ -20,8 +20,8 @@
# arch/ia64/scripts/unwcheck.py
BuildRequires: python
%endif
-Version: 2.6.16.4
-Release: 1
+Version: 2.6.16
+Release: 19
Summary: The Standard Kernel
License: GPL
Group: System/Kernel
@@ -29,7 +29,7 @@
#Conflicts: kernel
%else
%if !%build_xen
-Provides: kernel = 2.6.16.4-%release
+Provides: kernel = 2.6.16-%release
%endif
%endif
Provides: kernel-s390-nongpl
@@ -113,12 +113,12 @@
-Source Timestamp: 2006-04-13 13:26:39 +0000
+Source Timestamp: 2006/04/18 15:59:05 UTC
%prep
if ! [ -e %_sourcedir/linux-2.6.16.tar.bz2 ]; then
- echo "The kernel-s390-2.6.16.4.nosrc.rpm package does not contain the" \
- "complete sources. Please install kernel-source-2.6.16.4.src.rpm."
+ echo "The kernel-s390-2.6.16.nosrc.rpm package does not contain the" \
+ "complete sources. Please install kernel-source-2.6.16.src.rpm."
exit 1
fi
symbols=$(
@@ -439,6 +439,46 @@
%files -f kernel.files
%changelog -n kernel-s390
+* Tue Apr 18 2006 - lmb@suse.de
+- patches.fixes/ptrace-suspend: Fix suspend/resume of straced tasks
+ (161743).
+* Tue Apr 18 2006 - schwab@suse.de
+- show-mem: Make show_mem() skip holes in a pgdat [#166284].
+* Tue Apr 18 2006 - gregkh@suse.de
+- Update to 2.6.16.7 (lots of security fixes and other bug stuff)
+- patches.arch/x86_64-execve-cleanup: Delete.
+- patches.arch/x86_64-force-iret: Delete.
+- patches.arch/ppc-iseries-slb_initialize.patch: Delete.
+- patches.arch/ppc-SA_ONSTACK-fix.patch: Delete.
+- patches.drivers/cciss-softirq-oops: Delete.
+- patches.fixes/RLIMIT_CPU-fix-handling-of-a-zero-limit.patch:
+ Delete.
+- patches.fixes/ptrace-suspend: Delete.
+- patches.kernel.org/patch-2.6.16.4: Delete.
+- patches.kernel.org/patch-2.6.16.7: Linux 2.6.16.7.
+* Tue Apr 18 2006 - olh@suse.de
+- update patches.arch/ppc-kdump-soft-reset.patch
+ fix compile on ppc32
+* Thu Apr 13 2006 - jeffm@suse.de
+- patches.suse/ocfs2-update-2006-04-11.diff: OCFS2 Code Update
+ for SLES 10 - 2006-04-11.
+* Thu Apr 13 2006 - jeffm@suse.de
+- Fixes for bug #163243
+- patches.fixes/idr_replace.diff: idr: add idr_replace method
+ for replacing pointers.
+- patches.fixes/dm-use-idr_replace.diff: dm: use idr_replace
+ for minor_idr.
+- patches.fixes/dm-idr_pre_get-ordering.diff: dm: fix
+ idr_pre_get lock ordering.
+- patches.fixes/dm-use-spinlock.diff: dm: use spinlock for
+ _minor_lock.
+- patches.fixes/dm-DMF_FREEING.diff: dm: add DMF_FREEING flag
+ to indicate that a mapped_device is no longer legal to use.
+- patches.fixes/dm-proper-refcounting.diff: dm: fix refcounting.
+- patches.fixes/dm-module-refcount.diff: dm: proper module
+ reference counting.
+- patches.fixes/dm-initialize-ordering.diff: dm: fix ordering of
+ initialization in alloc_dev().
* Thu Apr 13 2006 - olh@suse.de
- add patches.fixes/file-lookup-without-ref.patch
fix possible NULL dentry (165361 - LTC21992)
++++++ kernel-smp.spec ++++++
--- /var/tmp/diff_new_pack.aHPy8u/_old 2006-04-18 19:09:57.000000000 +0200
+++ /var/tmp/diff_new_pack.aHPy8u/_new 2006-04-18 19:09:57.000000000 +0200
@@ -1,5 +1,5 @@
#
-# spec file for package kernel-smp (Version 2.6.16.4)
+# spec file for package kernel-smp (Version 2.6.16)
#
# Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@@ -20,8 +20,8 @@
# arch/ia64/scripts/unwcheck.py
BuildRequires: python
%endif
-Version: 2.6.16.4
-Release: 1
+Version: 2.6.16
+Release: 21
Summary: Kernel with Multiprocessor Support
License: GPL
Group: System/Kernel
@@ -29,7 +29,7 @@
#Conflicts: kernel
%else
%if !%build_xen
-Provides: kernel = 2.6.16.4-%release
+Provides: kernel = 2.6.16-%release
%endif
%endif
Provides: kernel-smp-nongpl
@@ -124,12 +124,12 @@
-Source Timestamp: 2006-04-13 13:26:39 +0000
+Source Timestamp: 2006/04/18 15:59:05 UTC
%prep
if ! [ -e %_sourcedir/linux-2.6.16.tar.bz2 ]; then
- echo "The kernel-smp-2.6.16.4.nosrc.rpm package does not contain the" \
- "complete sources. Please install kernel-source-2.6.16.4.src.rpm."
+ echo "The kernel-smp-2.6.16.nosrc.rpm package does not contain the" \
+ "complete sources. Please install kernel-source-2.6.16.src.rpm."
exit 1
fi
symbols=$(
@@ -450,6 +450,46 @@
%files -f kernel.files
%changelog -n kernel-smp
+* Tue Apr 18 2006 - lmb@suse.de
+- patches.fixes/ptrace-suspend: Fix suspend/resume of straced tasks
+ (161743).
+* Tue Apr 18 2006 - schwab@suse.de
+- show-mem: Make show_mem() skip holes in a pgdat [#166284].
+* Tue Apr 18 2006 - gregkh@suse.de
+- Update to 2.6.16.7 (lots of security fixes and other bug stuff)
+- patches.arch/x86_64-execve-cleanup: Delete.
+- patches.arch/x86_64-force-iret: Delete.
+- patches.arch/ppc-iseries-slb_initialize.patch: Delete.
+- patches.arch/ppc-SA_ONSTACK-fix.patch: Delete.
+- patches.drivers/cciss-softirq-oops: Delete.
+- patches.fixes/RLIMIT_CPU-fix-handling-of-a-zero-limit.patch:
+ Delete.
+- patches.fixes/ptrace-suspend: Delete.
+- patches.kernel.org/patch-2.6.16.4: Delete.
+- patches.kernel.org/patch-2.6.16.7: Linux 2.6.16.7.
+* Tue Apr 18 2006 - olh@suse.de
+- update patches.arch/ppc-kdump-soft-reset.patch
+ fix compile on ppc32
+* Thu Apr 13 2006 - jeffm@suse.de
+- patches.suse/ocfs2-update-2006-04-11.diff: OCFS2 Code Update
+ for SLES 10 - 2006-04-11.
+* Thu Apr 13 2006 - jeffm@suse.de
+- Fixes for bug #163243
+- patches.fixes/idr_replace.diff: idr: add idr_replace method
+ for replacing pointers.
+- patches.fixes/dm-use-idr_replace.diff: dm: use idr_replace
+ for minor_idr.
+- patches.fixes/dm-idr_pre_get-ordering.diff: dm: fix
+ idr_pre_get lock ordering.
+- patches.fixes/dm-use-spinlock.diff: dm: use spinlock for
+ _minor_lock.
+- patches.fixes/dm-DMF_FREEING.diff: dm: add DMF_FREEING flag
+ to indicate that a mapped_device is no longer legal to use.
+- patches.fixes/dm-proper-refcounting.diff: dm: fix refcounting.
+- patches.fixes/dm-module-refcount.diff: dm: proper module
+ reference counting.
+- patches.fixes/dm-initialize-ordering.diff: dm: fix ordering of
+ initialization in alloc_dev().
* Thu Apr 13 2006 - olh@suse.de
- add patches.fixes/file-lookup-without-ref.patch
fix possible NULL dentry (165361 - LTC21992)
++++++ kernel-source.spec ++++++
--- /var/tmp/diff_new_pack.aHPy8u/_old 2006-04-18 19:09:57.000000000 +0200
+++ /var/tmp/diff_new_pack.aHPy8u/_new 2006-04-18 19:09:57.000000000 +0200
@@ -1,5 +1,5 @@
#
-# spec file for package kernel-source (Version 2.6.16.4)
+# spec file for package kernel-source (Version 2.6.16)
#
# Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@@ -24,8 +24,8 @@
Obsoletes: linux lx-gdt lx-hack lx-suse lx1162_1 lx1162_2 lx1212_1 lx1212_2 lx1213_1 lx1213_2 lx121_1 lx121_2 lx126_1 lx126_2 lx129_1 lx129_2 lx_large kernel_headers lx_suse lx_sus22 lx_sus24
%endif
PreReq: /sbin/insserv /usr/bin/grep /bin/sed /bin/uname /bin/mkdir /bin/cat /bin/ln /bin/rm /etc/rc.status
-Version: 2.6.16.4
-Release: 1
+Version: 2.6.16
+Release: 21
Source0: http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.16.tar.bz2
Source1: functions.sh
Source2: source-post.sh
@@ -93,7 +93,7 @@
see /usr/src/linux/CREDITS for more details.
-Source Timestamp: 2006-04-13 13:26:39 +0000
+Source Timestamp: 2006/04/18 15:59:05 UTC
%prep
if ! [ -e %_sourcedir/linux-2.6.16.tar.bz2 ]; then
@@ -116,16 +116,16 @@
# Apply the patches needed for this architecture.
%_sourcedir/guards %symbols < %_sourcedir/series.conf \
- > %_builddir/kernel-source-2.6.16.4/kernel-source.patches
-for patch in $(< %_builddir/kernel-source-2.6.16.4/kernel-source.patches); do
- if ! patch -s -E -p1 --no-backup-if-mismatch -i %_builddir/kernel-source-2.6.16.4/$patch; then
+ > %_builddir/kernel-source-2.6.16/kernel-source.patches
+for patch in $(< %_builddir/kernel-source-2.6.16/kernel-source.patches); do
+ if ! patch -s -E -p1 --no-backup-if-mismatch -i %_builddir/kernel-source-2.6.16/$patch; then
echo "*** Patch $patch failed ***"
exit 1
fi
done
-%_sourcedir/install-configs %_sourcedir %_builddir/kernel-source-2.6.16.4 %release
-KERNELRELEASE=2.6.16.4-%release
+%_sourcedir/install-configs %_sourcedir %_builddir/kernel-source-2.6.16 %release
+KERNELRELEASE=2.6.16-%release
cat > %_builddir/%{name}-%{version}/.rpm-defs < %_builddir/kernel-source-2.6.16.4/kernel-$flavor.patches
- diff -q %_builddir/kernel-source-2.6.16.4/kernel-{source,$flavor}.patches \
+ > %_builddir/kernel-source-2.6.16/kernel-$flavor.patches
+ diff -q %_builddir/kernel-source-2.6.16/kernel-{source,$flavor}.patches \
|| continue
o=$RPM_BUILD_ROOT/usr/src/linux-$KERNELRELEASE-obj/$arch/$flavor
mkdir -p $o
@@ -273,6 +273,46 @@
%files -f kernel-source.files
%changelog -n kernel-source
+* Tue Apr 18 2006 - lmb@suse.de
+- patches.fixes/ptrace-suspend: Fix suspend/resume of straced tasks
+ (161743).
+* Tue Apr 18 2006 - schwab@suse.de
+- show-mem: Make show_mem() skip holes in a pgdat [#166284].
+* Tue Apr 18 2006 - gregkh@suse.de
+- Update to 2.6.16.7 (lots of security fixes and other bug stuff)
+- patches.arch/x86_64-execve-cleanup: Delete.
+- patches.arch/x86_64-force-iret: Delete.
+- patches.arch/ppc-iseries-slb_initialize.patch: Delete.
+- patches.arch/ppc-SA_ONSTACK-fix.patch: Delete.
+- patches.drivers/cciss-softirq-oops: Delete.
+- patches.fixes/RLIMIT_CPU-fix-handling-of-a-zero-limit.patch:
+ Delete.
+- patches.fixes/ptrace-suspend: Delete.
+- patches.kernel.org/patch-2.6.16.4: Delete.
+- patches.kernel.org/patch-2.6.16.7: Linux 2.6.16.7.
+* Tue Apr 18 2006 - olh@suse.de
+- update patches.arch/ppc-kdump-soft-reset.patch
+ fix compile on ppc32
+* Thu Apr 13 2006 - jeffm@suse.de
+- patches.suse/ocfs2-update-2006-04-11.diff: OCFS2 Code Update
+ for SLES 10 - 2006-04-11.
+* Thu Apr 13 2006 - jeffm@suse.de
+- Fixes for bug #163243
+- patches.fixes/idr_replace.diff: idr: add idr_replace method
+ for replacing pointers.
+- patches.fixes/dm-use-idr_replace.diff: dm: use idr_replace
+ for minor_idr.
+- patches.fixes/dm-idr_pre_get-ordering.diff: dm: fix
+ idr_pre_get lock ordering.
+- patches.fixes/dm-use-spinlock.diff: dm: use spinlock for
+ _minor_lock.
+- patches.fixes/dm-DMF_FREEING.diff: dm: add DMF_FREEING flag
+ to indicate that a mapped_device is no longer legal to use.
+- patches.fixes/dm-proper-refcounting.diff: dm: fix refcounting.
+- patches.fixes/dm-module-refcount.diff: dm: proper module
+ reference counting.
+- patches.fixes/dm-initialize-ordering.diff: dm: fix ordering of
+ initialization in alloc_dev().
* Thu Apr 13 2006 - olh@suse.de
- add patches.fixes/file-lookup-without-ref.patch
fix possible NULL dentry (165361 - LTC21992)
++++++ kernel-syms.spec ++++++
--- /var/tmp/diff_new_pack.aHPy8u/_old 2006-04-18 19:09:57.000000000 +0200
+++ /var/tmp/diff_new_pack.aHPy8u/_new 2006-04-18 19:09:57.000000000 +0200
@@ -1,5 +1,5 @@
#
-# spec file for package kernel-syms (Version 2.6.16.4)
+# spec file for package kernel-syms (Version 2.6.16)
#
# Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@@ -48,10 +48,10 @@
Autoreqprov: off
Summary: Kernel Symbol Versions (modversions)
Group: Development/Sources
-Version: 2.6.16.4
-Release: 1
+Version: 2.6.16
+Release: 21
Requires: linux
-Requires: kernel-source = 2.6.16.4-%release
+Requires: kernel-source = 2.6.16-%release
Source11: arch-symbols
Source12: guards
Source21: config.conf
@@ -84,7 +84,7 @@
see /usr/src/linux/CREDITS for more details.
-Source Timestamp: 2006-04-13 13:26:39 +0000
+Source Timestamp: 2006/04/18 15:59:05 UTC
%install
@@ -127,6 +127,46 @@
/boot/symsets-*-*.tar.gz
%changelog -n kernel-syms
+* Tue Apr 18 2006 - lmb@suse.de
+- patches.fixes/ptrace-suspend: Fix suspend/resume of straced tasks
+ (161743).
+* Tue Apr 18 2006 - schwab@suse.de
+- show-mem: Make show_mem() skip holes in a pgdat [#166284].
+* Tue Apr 18 2006 - gregkh@suse.de
+- Update to 2.6.16.7 (lots of security fixes and other bug stuff)
+- patches.arch/x86_64-execve-cleanup: Delete.
+- patches.arch/x86_64-force-iret: Delete.
+- patches.arch/ppc-iseries-slb_initialize.patch: Delete.
+- patches.arch/ppc-SA_ONSTACK-fix.patch: Delete.
+- patches.drivers/cciss-softirq-oops: Delete.
+- patches.fixes/RLIMIT_CPU-fix-handling-of-a-zero-limit.patch:
+ Delete.
+- patches.fixes/ptrace-suspend: Delete.
+- patches.kernel.org/patch-2.6.16.4: Delete.
+- patches.kernel.org/patch-2.6.16.7: Linux 2.6.16.7.
+* Tue Apr 18 2006 - olh@suse.de
+- update patches.arch/ppc-kdump-soft-reset.patch
+ fix compile on ppc32
+* Thu Apr 13 2006 - jeffm@suse.de
+- patches.suse/ocfs2-update-2006-04-11.diff: OCFS2 Code Update
+ for SLES 10 - 2006-04-11.
+* Thu Apr 13 2006 - jeffm@suse.de
+- Fixes for bug #163243
+- patches.fixes/idr_replace.diff: idr: add idr_replace method
+ for replacing pointers.
+- patches.fixes/dm-use-idr_replace.diff: dm: use idr_replace
+ for minor_idr.
+- patches.fixes/dm-idr_pre_get-ordering.diff: dm: fix
+ idr_pre_get lock ordering.
+- patches.fixes/dm-use-spinlock.diff: dm: use spinlock for
+ _minor_lock.
+- patches.fixes/dm-DMF_FREEING.diff: dm: add DMF_FREEING flag
+ to indicate that a mapped_device is no longer legal to use.
+- patches.fixes/dm-proper-refcounting.diff: dm: fix refcounting.
+- patches.fixes/dm-module-refcount.diff: dm: proper module
+ reference counting.
+- patches.fixes/dm-initialize-ordering.diff: dm: fix ordering of
+ initialization in alloc_dev().
* Thu Apr 13 2006 - olh@suse.de
- add patches.fixes/file-lookup-without-ref.patch
fix possible NULL dentry (165361 - LTC21992)
++++++ kernel-um.spec ++++++
--- /var/tmp/diff_new_pack.aHPy8u/_old 2006-04-18 19:09:57.000000000 +0200
+++ /var/tmp/diff_new_pack.aHPy8u/_new 2006-04-18 19:09:57.000000000 +0200
@@ -1,5 +1,5 @@
#
-# spec file for package kernel-um (Version 2.6.16.4)
+# spec file for package kernel-um (Version 2.6.16)
#
# Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@@ -20,8 +20,8 @@
# arch/ia64/scripts/unwcheck.py
BuildRequires: python
%endif
-Version: 2.6.16.4
-Release: 1
+Version: 2.6.16
+Release: 21
Summary: The User Mode Linux kernel.
License: GPL
Group: System/Kernel
@@ -29,7 +29,7 @@
#Conflicts: kernel
%else
%if !%build_xen
-Provides: kernel = 2.6.16.4-%release
+Provides: kernel = 2.6.16-%release
%endif
%endif
Provides: kernel-um-nongpl
@@ -116,12 +116,12 @@
-Source Timestamp: 2006-04-13 13:26:39 +0000
+Source Timestamp: 2006/04/18 15:59:05 UTC
%prep
if ! [ -e %_sourcedir/linux-2.6.16.tar.bz2 ]; then
- echo "The kernel-um-2.6.16.4.nosrc.rpm package does not contain the" \
- "complete sources. Please install kernel-source-2.6.16.4.src.rpm."
+ echo "The kernel-um-2.6.16.nosrc.rpm package does not contain the" \
+ "complete sources. Please install kernel-source-2.6.16.src.rpm."
exit 1
fi
symbols=$(
@@ -442,6 +442,46 @@
%files -f kernel.files
%changelog -n kernel-um
+* Tue Apr 18 2006 - lmb@suse.de
+- patches.fixes/ptrace-suspend: Fix suspend/resume of straced tasks
+ (161743).
+* Tue Apr 18 2006 - schwab@suse.de
+- show-mem: Make show_mem() skip holes in a pgdat [#166284].
+* Tue Apr 18 2006 - gregkh@suse.de
+- Update to 2.6.16.7 (lots of security fixes and other bug stuff)
+- patches.arch/x86_64-execve-cleanup: Delete.
+- patches.arch/x86_64-force-iret: Delete.
+- patches.arch/ppc-iseries-slb_initialize.patch: Delete.
+- patches.arch/ppc-SA_ONSTACK-fix.patch: Delete.
+- patches.drivers/cciss-softirq-oops: Delete.
+- patches.fixes/RLIMIT_CPU-fix-handling-of-a-zero-limit.patch:
+ Delete.
+- patches.fixes/ptrace-suspend: Delete.
+- patches.kernel.org/patch-2.6.16.4: Delete.
+- patches.kernel.org/patch-2.6.16.7: Linux 2.6.16.7.
+* Tue Apr 18 2006 - olh@suse.de
+- update patches.arch/ppc-kdump-soft-reset.patch
+ fix compile on ppc32
+* Thu Apr 13 2006 - jeffm@suse.de
+- patches.suse/ocfs2-update-2006-04-11.diff: OCFS2 Code Update
+ for SLES 10 - 2006-04-11.
+* Thu Apr 13 2006 - jeffm@suse.de
+- Fixes for bug #163243
+- patches.fixes/idr_replace.diff: idr: add idr_replace method
+ for replacing pointers.
+- patches.fixes/dm-use-idr_replace.diff: dm: use idr_replace
+ for minor_idr.
+- patches.fixes/dm-idr_pre_get-ordering.diff: dm: fix
+ idr_pre_get lock ordering.
+- patches.fixes/dm-use-spinlock.diff: dm: use spinlock for
+ _minor_lock.
+- patches.fixes/dm-DMF_FREEING.diff: dm: add DMF_FREEING flag
+ to indicate that a mapped_device is no longer legal to use.
+- patches.fixes/dm-proper-refcounting.diff: dm: fix refcounting.
+- patches.fixes/dm-module-refcount.diff: dm: proper module
+ reference counting.
+- patches.fixes/dm-initialize-ordering.diff: dm: fix ordering of
+ initialization in alloc_dev().
* Thu Apr 13 2006 - olh@suse.de
- add patches.fixes/file-lookup-without-ref.patch
fix possible NULL dentry (165361 - LTC21992)
kernel-xen.spec: same change
kernel-xenpae.spec: same change
++++++ build-source-timestamp ++++++
--- kernel-source/build-source-timestamp 2006-04-13 15:27:42.000000000 +0200
+++ STABLE/kernel-source/build-source-timestamp 2006-04-18 18:32:12.000000000 +0200
@@ -1 +1 @@
-2006-04-13 13:26:39 +0000
+2006/04/18 15:59:05 UTC
++++++ config.tar.bz2 ++++++
++++++ kabi.tar.bz2 ++++++
++++++ minmem ++++++
--- kernel-source/minmem 2006-04-13 17:43:12.000000000 +0200
+++ STABLE/kernel-source/minmem 2006-04-18 18:32:34.000000000 +0200
@@ -1 +1 @@
-514000
+1048576
++++++ novell-kmp.tar.bz2 ++++++
++++++ patches.arch.tar.bz2 ++++++
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/patches.arch/ppc-SA_ONSTACK-fix.patch new/patches.arch/ppc-SA_ONSTACK-fix.patch
--- old/patches.arch/ppc-SA_ONSTACK-fix.patch 2006-03-30 14:34:10.000000000 +0200
+++ new/patches.arch/ppc-SA_ONSTACK-fix.patch 1970-01-01 01:00:00.000000000 +0100
@@ -1,39 +0,0 @@
-From: Laurent MEYER Mon, 27 Mar 2006 11:37:41 +0200
-Subject: [PATCH] powerpc: fix incorrect SA_ONSTACK behaviour for 64-bit processes
-X-Git-Commit: 11089f08d9dd8b89cd07d6f126ccb4849e3c61a3
-Patch-mainline: 2.6.17-rc1
-
-*) When setting a sighandler using sigaction() call, if the flag
-SA_ONSTACK is set and no alternate stack is provided via sigaltstack(),
-the kernel still try to install the alternate stack. This behavior is
-the opposite of the one which is documented in Single Unix
-Specifications V3.
-
-*) Also when setting an alternate stack using sigaltstack() with the
-flag SS_DISABLE, the kernel try to install the alternate stack on
-signal delivery.
-
-These two use cases makes the process crash at signal delivery.
-
-This fixes it.
-
-Signed-off-by: Laurent Meyer
-Signed-off-by: Paul Mackerras
-Signed-off-by: Olaf Hering
-
- arch/powerpc/kernel/signal_64.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-Index: linux-2.6.16/arch/powerpc/kernel/signal_64.c
-===================================================================
---- linux-2.6.16.orig/arch/powerpc/kernel/signal_64.c
-+++ linux-2.6.16/arch/powerpc/kernel/signal_64.c
-@@ -213,7 +213,7 @@ static inline void __user * get_sigframe
- /* Default to using normal stack */
- newsp = regs->gpr[1];
-
-- if (ka->sa.sa_flags & SA_ONSTACK) {
-+ if ((ka->sa.sa_flags & SA_ONSTACK) && current->sas_ss_size) {
- if (! on_sig_stack(regs->gpr[1]))
- newsp = (current->sas_ss_sp + current->sas_ss_size);
- }
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/patches.arch/ppc-iseries-slb_initialize.patch new/patches.arch/ppc-iseries-slb_initialize.patch
--- old/patches.arch/ppc-iseries-slb_initialize.patch 2006-04-13 15:26:09.000000000 +0200
+++ new/patches.arch/ppc-iseries-slb_initialize.patch 1970-01-01 01:00:00.000000000 +0100
@@ -1,44 +0,0 @@
-From: Stephen Rothwell
-Subject: [PATCH] powerpc: iSeries needs slb_initialize to be called
-X-Git-Commit: 856d08ec46c5ecf3df13827c492fb6998fdc8322
-Patch-mainline: 2.6.17-rc1
-
-Bug 154542 - LTC22125-Beta 6 ISERIES64 requires multiple cpu's to boot
-
-Since the powerpc 64k pages patch went in, systems that have SLBs
-(like Power4 iSeries) needed to have slb_initialize called to set up
-some variables for the SLB miss handler. This was not being called
-on the boot processor on iSeries, so on single cpu iSeries machines,
-we would get apparent memory curruption as soon as we entered user mode.
-
-This patch fixes that by calling slb_initialize on the boot cpu if the
-processor has an SLB.
-
-Signed-off-by: Stephen Rothwell
-Signed-off-by: Olaf Hering
----
-
- arch/powerpc/kernel/setup_64.c | 10 ++++------
- 1 file changed, 4 insertions(+), 6 deletions(-)
-
-Index: linux-2.6.16-olh-kdump/arch/powerpc/kernel/setup_64.c
-===================================================================
---- linux-2.6.16-olh-kdump.orig/arch/powerpc/kernel/setup_64.c
-+++ linux-2.6.16-olh-kdump/arch/powerpc/kernel/setup_64.c
-@@ -256,12 +256,10 @@ void __init early_setup(unsigned long dt
- /*
- * Initialize stab / SLB management except on iSeries
- */
-- if (!firmware_has_feature(FW_FEATURE_ISERIES)) {
-- if (cpu_has_feature(CPU_FTR_SLB))
-- slb_initialize();
-- else
-- stab_initialize(lpaca->stab_real);
-- }
-+ if (cpu_has_feature(CPU_FTR_SLB))
-+ slb_initialize();
-+ else if (!firmware_has_feature(FW_FEATURE_ISERIES))
-+ stab_initialize(lpaca->stab_real);
-
- DBG(" <- early_setup()\n");
- }
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/patches.arch/ppc-kdump-soft-reset.patch new/patches.arch/ppc-kdump-soft-reset.patch
--- old/patches.arch/ppc-kdump-soft-reset.patch 2006-04-13 15:26:09.000000000 +0200
+++ new/patches.arch/ppc-kdump-soft-reset.patch 2006-04-18 15:10:17.000000000 +0200
@@ -40,8 +40,8 @@
---
arch/powerpc/kernel/crash.c | 148 +++++++++++++++++++++++++++++++++++---------
arch/powerpc/kernel/traps.c | 26 +++----
- include/asm-powerpc/kexec.h | 4 -
- 3 files changed, 134 insertions(+), 44 deletions(-)
+ include/asm-powerpc/kexec.h | 9 +-
+ 3 files changed, 136 insertions(+), 47 deletions(-)
Index: linux-2.6.16-olh-kdump/arch/powerpc/kernel/crash.c
===================================================================
@@ -338,15 +338,27 @@
===================================================================
--- linux-2.6.16-olh-kdump.orig/include/asm-powerpc/kexec.h
+++ linux-2.6.16-olh-kdump/include/asm-powerpc/kexec.h
-@@ -123,8 +123,10 @@ extern int default_machine_kexec_prepare
+@@ -31,9 +31,8 @@
+ #define KEXEC_ARCH KEXEC_ARCH_PPC
+ #endif
+
+-#ifdef CONFIG_KEXEC
+-
+ #ifndef __ASSEMBLY__
++#ifdef CONFIG_KEXEC
+ #ifdef __powerpc64__
+ /*
+ * This function is responsible for capturing register states if coming
+@@ -123,8 +122,10 @@ extern int default_machine_kexec_prepare
extern void default_machine_crash_shutdown(struct pt_regs *regs);
extern void machine_kexec_simple(struct kimage *image);
-
+-#endif /* ! __ASSEMBLY__ */
+extern void crash_kexec_secondary(struct pt_regs *regs);
- #endif /* ! __ASSEMBLY__ */
+#else
+static inline void crash_kexec_secondary(struct pt_regs *regs) { }
#endif /* CONFIG_KEXEC */
++#endif /* ! __ASSEMBLY__ */
#endif /* __KERNEL__ */
#endif /* _ASM_POWERPC_KEXEC_H */
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/patches.arch/x86_64-execve-cleanup new/patches.arch/x86_64-execve-cleanup
--- old/patches.arch/x86_64-execve-cleanup 2006-04-12 18:31:47.000000000 +0200
+++ new/patches.arch/x86_64-execve-cleanup 1970-01-01 01:00:00.000000000 +0100
@@ -1,45 +0,0 @@
-Subject: Clean up execve path (for next patch)
-From: ak@suse.de
-References: 156580
-Patch-mainline: 2.6.17
-
-Just call IRET always, no need for any special cases.
-
-Needed for the next bug fix.
-
-Signed-off-by: Andi Kleen
-
----
- arch/x86_64/kernel/entry.S | 16 ----------------
- 1 files changed, 16 deletions(-)
-
-Index: linux/arch/x86_64/kernel/entry.S
-===================================================================
---- linux.orig/arch/x86_64/kernel/entry.S
-+++ linux/arch/x86_64/kernel/entry.S
-@@ -408,25 +408,9 @@ ENTRY(stub_execve)
- CFI_ADJUST_CFA_OFFSET -8
- CFI_REGISTER rip, r11
- SAVE_REST
-- movq %r11, %r15
-- CFI_REGISTER rip, r15
- FIXUP_TOP_OF_STACK %r11
- call sys_execve
-- GET_THREAD_INFO(%rcx)
-- bt $TIF_IA32,threadinfo_flags(%rcx)
-- CFI_REMEMBER_STATE
-- jc exec_32bit
- RESTORE_TOP_OF_STACK %r11
-- movq %r15, %r11
-- CFI_REGISTER rip, r11
-- RESTORE_REST
-- pushq %r11
-- CFI_ADJUST_CFA_OFFSET 8
-- CFI_REL_OFFSET rip, 0
-- ret
--
--exec_32bit:
-- CFI_RESTORE_STATE
- movq %rax,RAX(%rsp)
- RESTORE_REST
- jmp int_ret_from_sys_call
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/patches.arch/x86_64-force-iret new/patches.arch/x86_64-force-iret
--- old/patches.arch/x86_64-force-iret 2006-04-12 18:31:47.000000000 +0200
+++ new/patches.arch/x86_64-force-iret 1970-01-01 01:00:00.000000000 +0100
@@ -1,64 +0,0 @@
-Subject: When user could have changed RIP always force IRET [CVE-2006-0744]
-From: ak@suse.de
-References: 156580
-Patch-mainline: 2.6.17
-
-Intel EM64T CPUs handle uncanonical return addresses differently
-from AMD CPUs.
-
-The exception is reported in the SYSRET, not the next instruction.
-This leads to the kernel exception handler running on the user stack
-with the wrong GS because the kernel didn't expect exceptions
-on this instruction.
-
-This version of the patch has the teething problems that plagued an earlier
-version fixed.
-
-This is CVE-2006-0744
-
-Thanks to Ernie Petrides and Asit B. Mallick for analysis and initial
-patches.
-
-Signed-off-by: Andi Kleen
-
----
- arch/x86_64/kernel/entry.S | 12 ++++++++++--
- 1 files changed, 10 insertions(+), 2 deletions(-)
-
-Index: linux/arch/x86_64/kernel/entry.S
-===================================================================
---- linux.orig/arch/x86_64/kernel/entry.S
-+++ linux/arch/x86_64/kernel/entry.S
-@@ -180,6 +180,10 @@ rff_trace:
- *
- * XXX if we had a free scratch register we could save the RSP into the stack frame
- * and report it properly in ps. Unfortunately we haven't.
-+ *
-+ * When user can change the frames always force IRET. That is because
-+ * it deals with uncanonical addresses better. SYSRET has trouble
-+ * with them due to bugs in both AMD and Intel CPUs.
- */
-
- ENTRY(system_call)
-@@ -254,7 +258,10 @@ sysret_signal:
- xorl %esi,%esi # oldset -> arg2
- call ptregscall_common
- 1: movl $_TIF_NEED_RESCHED,%edi
-- jmp sysret_check
-+ /* Use IRET because user could have changed frame. This
-+ works because ptregscall_common has called FIXUP_TOP_OF_STACK. */
-+ cli
-+ jmp int_with_check
-
- badsys:
- movq $-ENOSYS,RAX-ARGOFFSET(%rsp)
-@@ -280,7 +287,8 @@ tracesys:
- call syscall_trace_leave
- RESTORE_TOP_OF_STACK %rbx
- RESTORE_REST
-- jmp ret_from_sys_call
-+ /* Use IRET because user could have changed frame */
-+ jmp int_ret_from_sys_call
- CFI_ENDPROC
-
- /*
++++++ patches.drivers.tar.bz2 ++++++
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/patches.drivers/cciss-softirq-oops new/patches.drivers/cciss-softirq-oops
--- old/patches.drivers/cciss-softirq-oops 2006-04-11 19:53:26.000000000 +0200
+++ new/patches.drivers/cciss-softirq-oops 1970-01-01 01:00:00.000000000 +0100
@@ -1,150 +0,0 @@
-From: Mike Miller
-Subject: Fix oops running hpacucli
-Patch-mainline:
-References:
-
-PATCH 1/1
-
-This patch fixes a crash when running hpacucli with multiple logical volumes
-on a cciss controller. We were not properly initializing the disk->queue
-and causing a fault.
-Thanks to Hasso Tepper for reporting the problem. Thanks to Steve Cameron
-for root causing the problem.
-Most of the patch just moves things around. The fix is a one-liner.
-
-Signed-off-by: Mike Miller
-Signed-off-by: Stephen Cameron
-Acked-by: Jens Axboe
-
---------------------------------------------------------------------------------
- cciss.c | 96 ++++++++++++++++++++++++++++++++--------------------------------
- 1 files changed, 49 insertions(+), 47 deletions(-)
-
-diff -burNp linux-2.6.16.2.orig/drivers/block/cciss.c linux-2.6.16.2/drivers/block/cciss.c
---- linux-2.6.16.2.orig/drivers/block/cciss.c 2006-04-10 10:28:38.000000000 -0500
-+++ linux-2.6.16.2/drivers/block/cciss.c 2006-04-10 15:07:12.000000000 -0500
-@@ -1181,6 +1181,53 @@ static int revalidate_allvol(ctlr_info_t
- return 0;
- }
-
-+static inline void complete_buffers(struct bio *bio, int status)
-+{
-+ while (bio) {
-+ struct bio *xbh = bio->bi_next;
-+ int nr_sectors = bio_sectors(bio);
-+
-+ bio->bi_next = NULL;
-+ blk_finished_io(len);
-+ bio_endio(bio, nr_sectors << 9, status ? 0 : -EIO);
-+ bio = xbh;
-+ }
-+
-+}
-+
-+static void cciss_softirq_done(struct request *rq)
-+{
-+ CommandList_struct *cmd = rq->completion_data;
-+ ctlr_info_t *h = hba[cmd->ctlr];
-+ unsigned long flags;
-+ u64bit temp64;
-+ int i, ddir;
-+
-+ if (cmd->Request.Type.Direction == XFER_READ)
-+ ddir = PCI_DMA_FROMDEVICE;
-+ else
-+ ddir = PCI_DMA_TODEVICE;
-+
-+ /* command did not need to be retried */
-+ /* unmap the DMA mapping for all the scatter gather elements */
-+ for(i=0; i<cmd->Header.SGList; i++) {
-+ temp64.val32.lower = cmd->SG[i].Addr.lower;
-+ temp64.val32.upper = cmd->SG[i].Addr.upper;
-+ pci_unmap_page(h->pdev, temp64.val, cmd->SG[i].Len, ddir);
-+ }
-+
-+ complete_buffers(rq->bio, rq->errors);
-+
-+#ifdef CCISS_DEBUG
-+ printk("Done with %p\n", rq);
-+#endif /* CCISS_DEBUG */
-+
-+ spin_lock_irqsave(&h->lock, flags);
-+ end_that_request_last(rq, rq->errors);
-+ cmd_free(h, cmd,1);
-+ spin_unlock_irqrestore(&h->lock, flags);
-+}
-+
- /* This function will check the usage_count of the drive to be updated/added.
- * If the usage_count is zero then the drive information will be updated and
- * the disk will be re-registered with the kernel. If not then it will be
-@@ -1249,6 +1296,8 @@ static void cciss_update_drive_info(int
-
- blk_queue_max_sectors(disk->queue, 512);
-
-+ blk_queue_softirq_done(disk->queue, cciss_softirq_done);
-+
- disk->queue->queuedata = hba[ctlr];
-
- blk_queue_hardsect_size(disk->queue,
-@@ -2148,20 +2197,6 @@ static void start_io( ctlr_info_t *h)
- addQ (&(h->cmpQ), c);
- }
- }
--
--static inline void complete_buffers(struct bio *bio, int status)
--{
-- while (bio) {
-- struct bio *xbh = bio->bi_next;
-- int nr_sectors = bio_sectors(bio);
--
-- bio->bi_next = NULL;
-- blk_finished_io(len);
-- bio_endio(bio, nr_sectors << 9, status ? 0 : -EIO);
-- bio = xbh;
-- }
--
--}
- /* Assumes that CCISS_LOCK(h->ctlr) is held. */
- /* Zeros out the error record and then resends the command back */
- /* to the controller */
-@@ -2179,39 +2214,6 @@ static inline void resend_cciss_cmd( ctl
- start_io(h);
- }
-
--static void cciss_softirq_done(struct request *rq)
--{
-- CommandList_struct *cmd = rq->completion_data;
-- ctlr_info_t *h = hba[cmd->ctlr];
-- unsigned long flags;
-- u64bit temp64;
-- int i, ddir;
--
-- if (cmd->Request.Type.Direction == XFER_READ)
-- ddir = PCI_DMA_FROMDEVICE;
-- else
-- ddir = PCI_DMA_TODEVICE;
--
-- /* command did not need to be retried */
-- /* unmap the DMA mapping for all the scatter gather elements */
-- for(i=0; i<cmd->Header.SGList; i++) {
-- temp64.val32.lower = cmd->SG[i].Addr.lower;
-- temp64.val32.upper = cmd->SG[i].Addr.upper;
-- pci_unmap_page(h->pdev, temp64.val, cmd->SG[i].Len, ddir);
-- }
--
-- complete_buffers(rq->bio, rq->errors);
--
--#ifdef CCISS_DEBUG
-- printk("Done with %p\n", rq);
--#endif /* CCISS_DEBUG */
--
-- spin_lock_irqsave(&h->lock, flags);
-- end_that_request_last(rq, rq->errors);
-- cmd_free(h, cmd,1);
-- spin_unlock_irqrestore(&h->lock, flags);
--}
--
- /* checks the status of the job and calls complete buffers to mark all
- * buffers for the completed job. Note that this function does not need
- * to hold the hba/queue lock.
-
++++++ patches.fixes.tar.bz2 ++++++
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/patches.fixes/RLIMIT_CPU-fix-handling-of-a-zero-limit.patch new/patches.fixes/RLIMIT_CPU-fix-handling-of-a-zero-limit.patch
--- old/patches.fixes/RLIMIT_CPU-fix-handling-of-a-zero-limit.patch 2006-04-12 20:02:34.000000000 +0200
+++ new/patches.fixes/RLIMIT_CPU-fix-handling-of-a-zero-limit.patch 1970-01-01 01:00:00.000000000 +0100
@@ -1,51 +0,0 @@
-From nobody Mon Sep 17 00:00:00 2001
-From: Andrew Morton
-Date: Fri Mar 24 03:18:35 2006 -0800
-Subject: [PATCH] RLIMIT_CPU: fix handling of a zero limit (#163796)
-Patch-mainline: 2.6.17-rc1
-
-At present the kernel doesn't honour an attempt to set RLIMIT_CPU to zero
-seconds. But the spec says it should, and that's what 2.4.x does.
-
-Fixing this for real would involve some complexity (such as adding a new
-it-has-been-set flag to the task_struct, and testing that everwhere, instead
-of overloading the value of it_prof_expires).
-
-Given that a 2.4 kernel won't actually send the signal until one second has
-expired anyway, let's just handle this case by treating the caller's
-zero-seconds as one second.
-
-Cc: Martin Schwidefsky
-Cc: Ulrich Weigand
-Cc: Cliff Wickman
-Acked-by: Ingo Molnar
-Signed-off-by: Andrew Morton
-Signed-off-by: Linus Torvalds
-Signed-off-by: Greg Kroah-Hartman
-
- kernel/sys.c | 14 +++++++++++++-
- 1 files changed, 13 insertions(+), 1 deletion(-)
-
---- linux-2.6.16.orig/kernel/sys.c
-+++ linux-2.6.16/kernel/sys.c
-@@ -1657,7 +1657,19 @@ asmlinkage long sys_setrlimit(unsigned i
- (cputime_eq(current->signal->it_prof_expires, cputime_zero) ||
- new_rlim.rlim_cur <= cputime_to_secs(
- current->signal->it_prof_expires))) {
-- cputime_t cputime = secs_to_cputime(new_rlim.rlim_cur);
-+ unsigned long rlim_cur = new_rlim.rlim_cur;
-+ cputime_t cputime;
-+
-+ if (rlim_cur == 0) {
-+ /*
-+ * The caller is asking for an immediate RLIMIT_CPU
-+ * expiry. But we use the zero value to mean "it was
-+ * never set". So let's cheat and make it one second
-+ * instead
-+ */
-+ rlim_cur = 1;
-+ }
-+ cputime = secs_to_cputime(rlim_cur);
- read_lock(&tasklist_lock);
- spin_lock_irq(¤t->sighand->siglock);
- set_process_cpu_timer(current, CPUCLOCK_PROF,
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/patches.fixes/dm-DMF_FREEING.diff new/patches.fixes/dm-DMF_FREEING.diff
--- old/patches.fixes/dm-DMF_FREEING.diff 1970-01-01 01:00:00.000000000 +0100
+++ new/patches.fixes/dm-DMF_FREEING.diff 2006-04-13 22:26:02.000000000 +0200
@@ -0,0 +1,90 @@
+From: Jeff Mahoney
+Subject: [PATCH 05/08] dm: add DMF_FREEING flag to indicate that a mapped_device is no longer legal to use
+SUSE-Bugzilla: 163243
+
+ The previous patch serialized reference counting with respect to users with
+ valid references, but there is a chicken-egg problem between the block layer
+ and dm that causes the gendisk associated with a mapping to keep a reference-
+ less pointer to the mapped_device.
+
+ Without major reconstruction, the pointer must be referenceless or we run
+ into a chicken-egg problem with freeing the disk or the mapped_device. When
+ the block layer is actually using the mapped_device, a reference is taken.
+
+ This patch adds a flag to indicate that the mapped_device is no longer valid.
+ In free_dev(), we reset the ->private_data pointer, but prior to that, the
+ block layer can still attempt to open the device. The flag is used to
+ check the validity of the pointer, and return -ENXIO if it is invalid.
+ Otherwise, an appropriate reference is taken.
+
+Signed-off-by: Jeff Mahoney
+--
+ drivers/md/dm.c | 25 +++++++++++++++++++++++--
+ 1 files changed, 23 insertions(+), 2 deletions(-)
+
+diff -ruNpX ../dontdiff linux-2.6.16-staging1/drivers/md/dm.c linux-2.6.16-staging2/drivers/md/dm.c
+--- linux-2.6.16-staging1/drivers/md/dm.c 2006-04-13 16:18:20.000000000 -0400
++++ linux-2.6.16-staging2/drivers/md/dm.c 2006-04-13 16:18:20.000000000 -0400
+@@ -60,6 +60,7 @@ union map_info *dm_get_mapinfo(struct bi
+ #define DMF_BLOCK_IO 0
+ #define DMF_SUSPENDED 1
+ #define DMF_FROZEN 2
++#define DMF_FREEING 3
+
+ struct mapped_device {
+ struct rw_semaphore io_lock;
+@@ -216,9 +217,16 @@ static int dm_blk_open(struct inode *ino
+ {
+ struct mapped_device *md;
+
++ spin_lock(&_minor_lock);
+ md = inode->i_bdev->bd_disk->private_data;
+- dm_get(md);
+- return 0;
++ if (md) {
++ if (test_bit(DMF_FREEING, &md->flags) == 0)
++ dm_get(md);
++ else
++ md = NULL;
++ }
++ spin_unlock(&_minor_lock);
++ return md ? 0 : -ENXIO;
+ }
+
+ static int dm_blk_close(struct inode *inode, struct file *file)
+@@ -870,6 +878,11 @@ static void free_dev(struct mapped_devic
+ mempool_destroy(md->io_pool);
+ del_gendisk(md->disk);
+ free_minor(minor);
++
++ spin_lock(&_minor_lock);
++ md->disk->private_data = NULL;
++ spin_unlock(&_minor_lock);
++
+ put_disk(md->disk);
+ blk_put_queue(md->queue);
+ kfree(md);
+@@ -970,6 +983,11 @@ static struct mapped_device *dm_find_md(
+ if (md && (md == MINOR_ALLOCED || (dm_disk(md)->first_minor != minor)))
+ md = NULL;
+
++ if (md) {
++ if (test_bit(DMF_FREEING, &md->flags))
++ md = NULL;
++ }
++
+ spin_unlock(&_minor_lock);
+
+ return md;
+@@ -1010,8 +1028,11 @@ void dm_put(struct mapped_device *md)
+ {
+ struct dm_table *map = dm_get_table(md);
+
++ BUG_ON(test_bit(DMF_FREEING, &md->flags));
++
+ if (atomic_dec_and_lock(&md->holders, &_minor_lock)) {
+ idr_replace(&_minor_idr, MINOR_ALLOCED, md->disk->first_minor);
++ set_bit(DMF_FREEING, &md->flags);
+ spin_unlock(&_minor_lock);
+ if (!dm_suspended(md)) {
+ dm_table_presuspend_targets(map);
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/patches.fixes/dm-idr_pre_get-ordering.diff new/patches.fixes/dm-idr_pre_get-ordering.diff
--- old/patches.fixes/dm-idr_pre_get-ordering.diff 1970-01-01 01:00:00.000000000 +0100
+++ new/patches.fixes/dm-idr_pre_get-ordering.diff 2006-04-13 22:26:02.000000000 +0200
@@ -0,0 +1,58 @@
+From: Jeff Mahoney
+Subject: [PATCH 03/08] dm: fix idr_pre_get lock ordering
+SUSE-Bugzilla: 163243
+
+ idr_pre_get() can sleep while allocating memory for the worst-case scenario.
+ This isn't a huge deal with the current code, but the next patch will
+ switch _minor_lock to a spinlock.
+
+Signed-off-by: Jeff Mahoney
+--
+ drivers/md/dm.c | 20 ++++++++------------
+ 1 files changed, 8 insertions(+), 12 deletions(-)
+
+diff -ruNpX ../dontdiff linux-2.6.16-staging1/drivers/md/dm.c linux-2.6.16-staging2/drivers/md/dm.c
+--- linux-2.6.16-staging1/drivers/md/dm.c 2006-04-13 16:18:17.000000000 -0400
++++ linux-2.6.16-staging2/drivers/md/dm.c 2006-04-13 16:18:17.000000000 -0400
+@@ -717,6 +717,10 @@ static int specific_minor(struct mapped_
+ if (minor >= (1 << MINORBITS))
+ return -EINVAL;
+
++ r = idr_pre_get(&_minor_idr, GFP_KERNEL);
++ if (!r)
++ return -ENOMEM;
++
+ down(&_minor_lock);
+
+ if (idr_find(&_minor_idr, minor)) {
+@@ -724,12 +728,6 @@ static int specific_minor(struct mapped_
+ goto out;
+ }
+
+- r = idr_pre_get(&_minor_idr, GFP_KERNEL);
+- if (!r) {
+- r = -ENOMEM;
+- goto out;
+- }
+-
+ r = idr_get_new_above(&_minor_idr, MINOR_ALLOCED, minor, &m);
+ if (r) {
+ goto out;
+@@ -751,13 +749,11 @@ static int next_free_minor(struct mapped
+ int r;
+ unsigned int m;
+
+- down(&_minor_lock);
+-
+ r = idr_pre_get(&_minor_idr, GFP_KERNEL);
+- if (!r) {
+- r = -ENOMEM;
+- goto out;
+- }
++ if (!r)
++ return -ENOMEM;
++
++ down(&_minor_lock);
+
+ r = idr_get_new(&_minor_idr, MINOR_ALLOCED, &m);
+ if (r) {
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/patches.fixes/dm-initialize-ordering.diff new/patches.fixes/dm-initialize-ordering.diff
--- old/patches.fixes/dm-initialize-ordering.diff 1970-01-01 01:00:00.000000000 +0100
+++ new/patches.fixes/dm-initialize-ordering.diff 2006-04-13 22:26:02.000000000 +0200
@@ -0,0 +1,43 @@
+From: Jeff Mahoney
+Subject: [PATCH 08/08] dm: fix ordering of initialization in alloc_dev()
+SUSE-Bugzilla: 163243
+
+ In alloc_dev(), we register the device with the block layer and then
+ continue to initialize the device. register_disk() will have already
+ made the device available to userspace, and a potential race exists
+ with the device being opened for use and the completion of the
+ initialization.
+
+ This patch moves the final bits of the initialization above the disk
+ registration.
+
+Signed-off-by: Jeff Mahoney
+--
+ drivers/md/dm.c | 8 ++++----
+ 1 files changed, 4 insertions(+), 4 deletions(-)
+
+diff -ruNpX ../dontdiff linux-2.6.16-staging1/drivers/md/dm.c linux-2.6.16-staging2/drivers/md/dm.c
+--- linux-2.6.16-staging1/drivers/md/dm.c 2006-04-13 16:18:24.000000000 -0400
++++ linux-2.6.16-staging2/drivers/md/dm.c 2006-04-13 16:18:24.000000000 -0400
+@@ -837,6 +837,10 @@ static struct mapped_device *alloc_dev(u
+ if (!md->disk)
+ goto bad4;
+
++ atomic_set(&md->pending, 0);
++ init_waitqueue_head(&md->wait);
++ init_waitqueue_head(&md->eventq);
++
+ md->disk->major = _major;
+ md->disk->first_minor = minor;
+ md->disk->fops = &dm_blk_dops;
+@@ -845,10 +849,6 @@ static struct mapped_device *alloc_dev(u
+ sprintf(md->disk->disk_name, "dm-%d", minor);
+ add_disk(md->disk);
+
+- atomic_set(&md->pending, 0);
+- init_waitqueue_head(&md->wait);
+- init_waitqueue_head(&md->eventq);
+-
+ /* Populate the mapping, nobody knows we exist yet */
+ spin_lock(&_minor_lock);
+ r = idr_replace(&_minor_idr, md, minor);
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/patches.fixes/dm-module-refcount.diff new/patches.fixes/dm-module-refcount.diff
--- old/patches.fixes/dm-module-refcount.diff 1970-01-01 01:00:00.000000000 +0100
+++ new/patches.fixes/dm-module-refcount.diff 2006-04-13 22:26:02.000000000 +0200
@@ -0,0 +1,49 @@
+From: Jeff Mahoney
+Subject: [PATCH 07/08] dm: proper module reference counting
+SUSE-Bugzilla: 163243
+
+ Module reference counting appropriately occurs when the block device is
+ opened, but dm devices exist outside of the device actually being opened.
+
+ Currently, in certain situations, unloading the dm-mod module will result
+ in an oops. This patch claims a reference to the module when a device
+ is created, and drops it when the device is freed.
+
+ This is one possible implementation. Another could be to do an internal
+ "dmsetup remove_all" when the module is unloaded. Comments welcome.
+
+Signed-off-by: Jeff Mahoney
+--
+ drivers/md/dm.c | 6 ++++++
+ 1 files changed, 6 insertions(+)
+
+diff -ruNpX ../dontdiff linux-2.6.16-staging1/drivers/md/dm.c linux-2.6.16-staging2/drivers/md/dm.c
+--- linux-2.6.16-staging1/drivers/md/dm.c 2006-04-13 16:18:23.000000000 -0400
++++ linux-2.6.16-staging2/drivers/md/dm.c 2006-04-13 16:18:23.000000000 -0400
+@@ -796,6 +796,9 @@ static struct mapped_device *alloc_dev(u
+ return NULL;
+ }
+
++ if (!try_module_get(THIS_MODULE))
++ goto bad0;
++
+ /* get a minor number for the dev */
+ r = persistent ? specific_minor(md, minor) : next_free_minor(md, &minor);
+ if (r < 0)
+@@ -862,6 +865,8 @@ static struct mapped_device *alloc_dev(u
+ blk_put_queue(md->queue);
+ free_minor(minor);
+ bad1:
++ module_put(THIS_MODULE);
++ bad0:
+ kfree(md);
+ return NULL;
+ }
+@@ -885,6 +890,7 @@ static void free_dev(struct mapped_devic
+
+ put_disk(md->disk);
+ blk_put_queue(md->queue);
++ module_put(THIS_MODULE);
+ kfree(md);
+ }
+
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/patches.fixes/dm-proper-refcounting.diff new/patches.fixes/dm-proper-refcounting.diff
--- old/patches.fixes/dm-proper-refcounting.diff 1970-01-01 01:00:00.000000000 +0100
+++ new/patches.fixes/dm-proper-refcounting.diff 2006-04-13 22:26:02.000000000 +0200
@@ -0,0 +1,157 @@
+From: Jeff Mahoney
+Subject: [PATCH 06/08] dm: fix refcounting
+SUSE-Bugzilla: 163243
+
+ For the most part, reference counting in the dm code is ok, but it must be
+ taken under the _minor_lock. There are paths where a mapped_device pointer
+ is returned and then a reference is taken - and taking the reference may be
+ too late.
+
+ This patch fixes a number of paths so that the reference is always taken
+ under the lock.
+
+Signed-off-by: Jeff Mahoney
+--
+ drivers/md/dm-ioctl.c | 20 ++++++++++++++++----
+ drivers/md/dm.c | 16 ++++------------
+ 2 files changed, 20 insertions(+), 16 deletions(-)
+
+diff -ruNpX ../dontdiff linux-2.6.16-staging1/drivers/md/dm.c linux-2.6.16-staging2/drivers/md/dm.c
+--- linux-2.6.16-staging1/drivers/md/dm.c 2006-04-13 16:18:22.000000000 -0400
++++ linux-2.6.16-staging2/drivers/md/dm.c 2006-04-13 16:18:22.000000000 -0400
+@@ -969,7 +969,7 @@ int dm_create_with_minor(unsigned int mi
+ return create_aux(minor, 1, result);
+ }
+
+-static struct mapped_device *dm_find_md(dev_t dev)
++struct mapped_device *dm_get_md(dev_t dev)
+ {
+ struct mapped_device *md;
+ unsigned minor = MINOR(dev);
+@@ -986,6 +986,8 @@ static struct mapped_device *dm_find_md(
+ if (md) {
+ if (test_bit(DMF_FREEING, &md->flags))
+ md = NULL;
++ else
++ dm_get(md);
+ }
+
+ spin_unlock(&_minor_lock);
+@@ -993,22 +995,12 @@ static struct mapped_device *dm_find_md(
+ return md;
+ }
+
+-struct mapped_device *dm_get_md(dev_t dev)
+-{
+- struct mapped_device *md = dm_find_md(dev);
+-
+- if (md)
+- dm_get(md);
+-
+- return md;
+-}
+-
+ void *dm_get_mdptr(dev_t dev)
+ {
+ struct mapped_device *md;
+ void *mdptr = NULL;
+
+- md = dm_find_md(dev);
++ md = dm_get_md(dev);
+ if (md)
+ mdptr = md->interface_ptr;
+ return mdptr;
+diff -ruNpX ../dontdiff linux-2.6.16-staging1/drivers/md/dm-ioctl.c linux-2.6.16-staging2/drivers/md/dm-ioctl.c
+--- linux-2.6.16-staging1/drivers/md/dm-ioctl.c 2006-04-05 14:02:34.000000000 -0400
++++ linux-2.6.16-staging2/drivers/md/dm-ioctl.c 2006-04-13 16:18:22.000000000 -0400
+@@ -600,12 +600,16 @@ static int dev_create(struct dm_ioctl *p
+ */
+ static struct hash_cell *__find_device_hash_cell(struct dm_ioctl *param)
+ {
++ struct hash_cell *hc;
+ if (*param->uuid)
+- return __get_uuid_cell(param->uuid);
++ hc = __get_uuid_cell(param->uuid);
+ else if (*param->name)
+- return __get_name_cell(param->name);
++ hc = __get_name_cell(param->name);
+ else
+ return dm_get_mdptr(huge_decode_dev(param->dev));
++ if (hc)
++ dm_get(hc->md);
++ return hc;
+ }
+
+ static struct mapped_device *find_device(struct dm_ioctl *param)
+@@ -617,7 +621,6 @@ static struct mapped_device *find_device
+ hc = __find_device_hash_cell(param);
+ if (hc) {
+ md = hc->md;
+- dm_get(md);
+
+ /*
+ * Sneakily write in both the name and the uuid
+@@ -642,6 +645,7 @@ static struct mapped_device *find_device
+ static int dev_remove(struct dm_ioctl *param, size_t param_size)
+ {
+ struct hash_cell *hc;
++ struct mapped_device *md;
+
+ down_write(&_hash_lock);
+ hc = __find_device_hash_cell(param);
+@@ -652,8 +656,11 @@ static int dev_remove(struct dm_ioctl *p
+ return -ENXIO;
+ }
+
++ md = hc->md;
++
+ __hash_remove(hc);
+ up_write(&_hash_lock);
++ dm_put(md);
+ param->data_size = 0;
+ return 0;
+ }
+@@ -731,7 +738,6 @@ static int do_resume(struct dm_ioctl *pa
+ }
+
+ md = hc->md;
+- dm_get(md);
+
+ new_map = hc->new_map;
+ hc->new_map = NULL;
+@@ -975,6 +981,7 @@ static int table_load(struct dm_ioctl *p
+ int r;
+ struct hash_cell *hc;
+ struct dm_table *t;
++ struct mapped_device *md;
+
+ r = dm_table_create(&t, get_mode(param), param->target_count);
+ if (r)
+@@ -1001,7 +1008,9 @@ static int table_load(struct dm_ioctl *p
+ param->flags |= DM_INACTIVE_PRESENT_FLAG;
+
+ r = __dev_status(hc->md, param);
++ md = hc->md;
+ up_write(&_hash_lock);
++ dm_put(md);
+ return r;
+ }
+
+@@ -1009,6 +1018,7 @@ static int table_clear(struct dm_ioctl *
+ {
+ int r;
+ struct hash_cell *hc;
++ struct mapped_device *md;
+
+ down_write(&_hash_lock);
+
+@@ -1027,7 +1037,9 @@ static int table_clear(struct dm_ioctl *
+ param->flags &= ~DM_INACTIVE_PRESENT_FLAG;
+
+ r = __dev_status(hc->md, param);
++ md = hc->md;
+ up_write(&_hash_lock);
++ dm_put(md);
+ return r;
+ }
+
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/patches.fixes/dm-use-idr_replace.diff new/patches.fixes/dm-use-idr_replace.diff
--- old/patches.fixes/dm-use-idr_replace.diff 1970-01-01 01:00:00.000000000 +0100
+++ new/patches.fixes/dm-use-idr_replace.diff 2006-04-13 22:26:02.000000000 +0200
@@ -0,0 +1,95 @@
+From: Jeff Mahoney
+Subject: [PATCH 02/08] dm: use idr_replace for minor_idr
+SUSE-Bugzilla: 163243
+
+ A patch was submitted in August 2004 to replace the old bitmap minor
+ allocation tracking with an IDR to both track allocation and provide
+ a mapping.
+
+ This works pretty well in execution, but the author overlooked a pretty
+ important detail. With the old bitmap, it was enough to just mark the
+ minor as allocated and return it. With the IDR code, the mapped_device
+ is used to mark the minor as in use. The problem with that approach is
+ that the mapped_device isn't done initializing, and is placed on a
+ subsystem-wide data structure, which is then unlocked. Even if the
+ assignment was delayed or the lock was held until initialization
+ completed, there would still be a race when we register the disk with
+ the block subsystem since we'd need a minor to register, but we'd need
+ to be done registering before making the device available.
+
+ This patch uses a place holder value, MINOR_ALLOCED, to mark the minor
+ as allocated but in a state where it can't be used, such as
+ mid-allocation or mid-free. At the end of the initialization, we
+ replace the place holder with the pointer to the mapped_device, making
+ it available to the rest of the dm subsystem.
+
+ During the free process, we again use the place holder value in the
+ IDR to indicate the minor is allocated but unavailable for use.
+
+Signed-off-by: Jeff Mahoney
+--
+ drivers/md/dm.c | 17 ++++++++++++++---
+ 1 files changed, 14 insertions(+), 3 deletions(-)
+
+diff -ruNpX ../dontdiff linux-2.6.16-staging1/drivers/md/dm.c linux-2.6.16-staging2/drivers/md/dm.c
+--- linux-2.6.16-staging1/drivers/md/dm.c 2006-04-11 13:57:50.000000000 -0400
++++ linux-2.6.16-staging2/drivers/md/dm.c 2006-04-13 16:18:16.000000000 -0400
+@@ -51,6 +51,8 @@ union map_info *dm_get_mapinfo(struct bi
+ return NULL;
+ }
+
++#define MINOR_ALLOCED ((void *)-1)
++
+ /*
+ * Bits for the md->flags field.
+ */
+@@ -728,7 +730,7 @@ static int specific_minor(struct mapped_
+ goto out;
+ }
+
+- r = idr_get_new_above(&_minor_idr, md, minor, &m);
++ r = idr_get_new_above(&_minor_idr, MINOR_ALLOCED, minor, &m);
+ if (r) {
+ goto out;
+ }
+@@ -757,7 +759,7 @@ static int next_free_minor(struct mapped
+ goto out;
+ }
+
+- r = idr_get_new(&_minor_idr, md, &m);
++ r = idr_get_new(&_minor_idr, MINOR_ALLOCED, &m);
+ if (r) {
+ goto out;
+ }
+@@ -840,6 +842,12 @@ static struct mapped_device *alloc_dev(u
+ init_waitqueue_head(&md->wait);
+ init_waitqueue_head(&md->eventq);
+
++ /* Populate the mapping, nobody knows we exist yet */
++ down(&_minor_lock);
++ r = idr_replace(&_minor_idr, md, minor);
++ up(&_minor_lock);
++ BUG_ON(r < 0);
++
+ return md;
+
+ bad4:
+@@ -963,7 +971,7 @@ static struct mapped_device *dm_find_md(
+ down(&_minor_lock);
+
+ md = idr_find(&_minor_idr, minor);
+- if (!md || (dm_disk(md)->first_minor != minor))
++ if (md && (md == MINOR_ALLOCED || (dm_disk(md)->first_minor != minor)))
+ md = NULL;
+
+ up(&_minor_lock);
+@@ -1007,6 +1015,9 @@ void dm_put(struct mapped_device *md)
+ struct dm_table *map = dm_get_table(md);
+
+ if (atomic_dec_and_test(&md->holders)) {
++ down(&_minor_lock);
++ idr_replace(&_minor_idr, MINOR_ALLOCED, md->disk->first_minor);
++ up(&_minor_lock);
+ if (!dm_suspended(md)) {
+ dm_table_presuspend_targets(map);
+ dm_table_postsuspend_targets(map);
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/patches.fixes/dm-use-spinlock.diff new/patches.fixes/dm-use-spinlock.diff
--- old/patches.fixes/dm-use-spinlock.diff 1970-01-01 01:00:00.000000000 +0100
+++ new/patches.fixes/dm-use-spinlock.diff 2006-04-13 22:26:02.000000000 +0200
@@ -0,0 +1,121 @@
+From: Jeff Mahoney
+Subject: [PATCH 04/08] dm: use spinlock for _minor_lock
+SUSE-Bugzilla: 163243
+
+ In order to truly serialize reference counting and properly handle the final
+ dm_put, we need to use atomic_dec_and_lock, since another thread of execution
+ can attempt to "resurrect" a potentially dead mapped_device.
+
+ This patch replaces the _minor_lock mutex with a spinlock, and leverages
+ atomic_dec_and_lock to properly serialize reference counting.
+
+Signed-off-by: Jeff Mahoney
+--
+ drivers/md/dm.c | 27 +++++++++++++--------------
+ 1 files changed, 13 insertions(+), 14 deletions(-)
+
+diff -ruNpX ../dontdiff linux-2.6.16-staging1/drivers/md/dm.c linux-2.6.16-staging2/drivers/md/dm.c
+--- linux-2.6.16-staging1/drivers/md/dm.c 2006-04-13 16:18:19.000000000 -0400
++++ linux-2.6.16-staging2/drivers/md/dm.c 2006-04-13 16:18:19.000000000 -0400
+@@ -23,6 +23,7 @@ static const char *_name = DM_NAME;
+ static unsigned int major = 0;
+ static unsigned int _major = 0;
+
++static DEFINE_SPINLOCK(_minor_lock);
+ /*
+ * One of these is allocated per bio.
+ */
+@@ -697,14 +698,13 @@ static int dm_any_congested(void *conges
+ /*-----------------------------------------------------------------
+ * An IDR is used to keep track of allocated minor numbers.
+ *---------------------------------------------------------------*/
+-static DECLARE_MUTEX(_minor_lock);
+ static DEFINE_IDR(_minor_idr);
+
+ static void free_minor(unsigned int minor)
+ {
+- down(&_minor_lock);
++ spin_lock(&_minor_lock);
+ idr_remove(&_minor_idr, minor);
+- up(&_minor_lock);
++ spin_unlock(&_minor_lock);
+ }
+
+ /*
+@@ -721,7 +721,7 @@ static int specific_minor(struct mapped_
+ if (!r)
+ return -ENOMEM;
+
+- down(&_minor_lock);
++ spin_lock(&_minor_lock);
+
+ if (idr_find(&_minor_idr, minor)) {
+ r = -EBUSY;
+@@ -740,7 +740,7 @@ static int specific_minor(struct mapped_
+ }
+
+ out:
+- up(&_minor_lock);
++ spin_unlock(&_minor_lock);
+ return r;
+ }
+
+@@ -753,7 +753,7 @@ static int next_free_minor(struct mapped
+ if (!r)
+ return -ENOMEM;
+
+- down(&_minor_lock);
++ spin_lock(&_minor_lock);
+
+ r = idr_get_new(&_minor_idr, MINOR_ALLOCED, &m);
+ if (r) {
+@@ -769,7 +769,7 @@ static int next_free_minor(struct mapped
+ *minor = m;
+
+ out:
+- up(&_minor_lock);
++ spin_unlock(&_minor_lock);
+ return r;
+ }
+
+@@ -839,9 +839,9 @@ static struct mapped_device *alloc_dev(u
+ init_waitqueue_head(&md->eventq);
+
+ /* Populate the mapping, nobody knows we exist yet */
+- down(&_minor_lock);
++ spin_lock(&_minor_lock);
+ r = idr_replace(&_minor_idr, md, minor);
+- up(&_minor_lock);
++ spin_unlock(&_minor_lock);
+ BUG_ON(r < 0);
+
+ return md;
+@@ -964,13 +964,13 @@ static struct mapped_device *dm_find_md(
+ if (MAJOR(dev) != _major || minor >= (1 << MINORBITS))
+ return NULL;
+
+- down(&_minor_lock);
++ spin_lock(&_minor_lock);
+
+ md = idr_find(&_minor_idr, minor);
+ if (md && (md == MINOR_ALLOCED || (dm_disk(md)->first_minor != minor)))
+ md = NULL;
+
+- up(&_minor_lock);
++ spin_unlock(&_minor_lock);
+
+ return md;
+ }
+@@ -1010,10 +1010,9 @@ void dm_put(struct mapped_device *md)
+ {
+ struct dm_table *map = dm_get_table(md);
+
+- if (atomic_dec_and_test(&md->holders)) {
+- down(&_minor_lock);
++ if (atomic_dec_and_lock(&md->holders, &_minor_lock)) {
+ idr_replace(&_minor_idr, MINOR_ALLOCED, md->disk->first_minor);
+- up(&_minor_lock);
++ spin_unlock(&_minor_lock);
+ if (!dm_suspended(md)) {
+ dm_table_presuspend_targets(map);
+ dm_table_postsuspend_targets(map);
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/patches.fixes/idr_replace.diff new/patches.fixes/idr_replace.diff
--- old/patches.fixes/idr_replace.diff 1970-01-01 01:00:00.000000000 +0100
+++ new/patches.fixes/idr_replace.diff 2006-04-13 22:26:02.000000000 +0200
@@ -0,0 +1,72 @@
+From: Jeff Mahoney
+Subject: [PATCH 01/08] idr: add idr_replace method for replacing pointers
+SUSE-Bugzilla: 163243
+
+ This patch adds an idr_replace() method to the IDR library for replacing
+ a pointer already present in the IDR. Rather than do a remove/add pair, this
+ function simply updates the pointer for an ID.
+
+Signed-off-by: Jeff Mahoney
+--
+ include/linux/idr.h | 1 +
+ lib/idr.c | 37 +++++++++++++++++++++++++++++++++++++
+ 2 files changed, 38 insertions(+)
+
+diff -ruNpX ../dontdiff linux-2.6.16-staging1/include/linux/idr.h linux-2.6.16-staging2/include/linux/idr.h
+--- linux-2.6.16-staging1/include/linux/idr.h 2006-01-02 22:21:10.000000000 -0500
++++ linux-2.6.16-staging2/include/linux/idr.h 2006-04-13 16:18:14.000000000 -0400
+@@ -78,6 +78,7 @@ void *idr_find(struct idr *idp, int id);
+ int idr_pre_get(struct idr *idp, gfp_t gfp_mask);
+ int idr_get_new(struct idr *idp, void *ptr, int *id);
+ int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int *id);
++int idr_replace(struct idr *idp, void *ptr, int id);
+ void idr_remove(struct idr *idp, int id);
+ void idr_destroy(struct idr *idp);
+ void idr_init(struct idr *idp);
+diff -ruNpX ../dontdiff linux-2.6.16-staging1/lib/idr.c linux-2.6.16-staging2/lib/idr.c
+--- linux-2.6.16-staging1/lib/idr.c 2006-01-02 22:21:10.000000000 -0500
++++ linux-2.6.16-staging2/lib/idr.c 2006-04-13 16:18:14.000000000 -0400
+@@ -390,6 +390,43 @@ void *idr_find(struct idr *idp, int id)
+ }
+ EXPORT_SYMBOL(idr_find);
+
++/**
++ * idr_update - update pointer for given id
++ * @idp: idr handle
++ * @ptr: pointer you want associated with the ide
++ * @id: lookup key
++ *
++ * Update the pointer registered with the id. A -ENOENT
++ * return indicates that @id is not valid.
++ *
++ * The caller must serialize vs idr_find(), idr_get_new(), and idr_remove().
++ */
++int idr_replace(struct idr *idp, void *ptr, int id)
++{
++ int n;
++ struct idr_layer *p;
++ int shift = (idp->layers - 1) * IDR_BITS;
++
++ n = idp->layers * IDR_BITS;
++ p = idp->top;
++
++ id &= MAX_ID_MASK;
++
++ while ((shift > 0) && p) {
++ n = (id >> shift) & IDR_MASK;
++ p = p->ary[n];
++ shift -= IDR_BITS;
++ }
++
++ n = id & IDR_MASK;
++ if (unlikely(p == NULL || !test_bit(n, &p->bitmap)))
++ return -ENOENT;
++
++ p->ary[n] = ptr;
++ return 0;
++}
++EXPORT_SYMBOL(idr_replace);
++
+ static void idr_cache_ctor(void * idr_layer, kmem_cache_t *idr_layer_cache,
+ unsigned long flags)
+ {
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/patches.fixes/show-mem new/patches.fixes/show-mem
--- old/patches.fixes/show-mem 1970-01-01 01:00:00.000000000 +0100
+++ new/patches.fixes/show-mem 2006-04-18 16:39:52.000000000 +0200
@@ -0,0 +1,113 @@
+Subject: Make show_mem() skip holes in a pgdat
+References: 166284
+From: Robin Holt
+Acked-by: schwab@suse.de
+Patch-mainline: ace1d816a13ff42d4f41989862552032f9c19853
+
+This patch modifies ia64's show_mem() to walk the vmem_map page tables and
+rapidly skip forward across regions where the page tables are missing.
+This prevents the pfn_valid() check from causing numerous unnecessary
+page faults.
+
+Without this patch on a 512 node 512 cpu system where every node has four
+memory holes, the show_mem() call takes 1 hour 18 minutes. With this
+patch, it takes less than 3 seconds.
+
+Signed-off-by: Robin Holt
+Signed-off-by: Tony Luck
+
+---
+commit ace1d816a13ff42d4f41989862552032f9c19853
+tree 084277670a76f9a50449e82b308ecc7b881fd5ac
+parent 356a5c1c6fdfb8eed6dbb3979d90c7cc7060017a
+author Robin Holt Thu, 13 Apr 2006 15:34:45 -0700
+committer Tony Luck Thu, 13 Apr 2006 15:34:45 -0700
+
+ arch/ia64/mm/discontig.c | 66 +++++++++++++++++++++++++++++++++++++++++++++-
+ 1 files changed, 65 insertions(+), 1 deletions(-)
+
+diff --git a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c
+index ec9eeb8..b6bcc9f 100644
+--- a/arch/ia64/mm/discontig.c
++++ b/arch/ia64/mm/discontig.c
+@@ -519,6 +519,68 @@ void __cpuinit *per_cpu_init(void)
+ }
+ #endif /* CONFIG_SMP */
+
++#ifdef CONFIG_VIRTUAL_MEM_MAP
++static inline int find_next_valid_pfn_for_pgdat(pg_data_t *pgdat, int i)
++{
++ unsigned long end_address, hole_next_pfn;
++ unsigned long stop_address;
++
++ end_address = (unsigned long) &vmem_map[pgdat->node_start_pfn + i];
++ end_address = PAGE_ALIGN(end_address);
++
++ stop_address = (unsigned long) &vmem_map[
++ pgdat->node_start_pfn + pgdat->node_spanned_pages];
++
++ do {
++ pgd_t *pgd;
++ pud_t *pud;
++ pmd_t *pmd;
++ pte_t *pte;
++
++ pgd = pgd_offset_k(end_address);
++ if (pgd_none(*pgd)) {
++ end_address += PGDIR_SIZE;
++ continue;
++ }
++
++ pud = pud_offset(pgd, end_address);
++ if (pud_none(*pud)) {
++ end_address += PUD_SIZE;
++ continue;
++ }
++
++ pmd = pmd_offset(pud, end_address);
++ if (pmd_none(*pmd)) {
++ end_address += PMD_SIZE;
++ continue;
++ }
++
++ pte = pte_offset_kernel(pmd, end_address);
++retry_pte:
++ if (pte_none(*pte)) {
++ end_address += PAGE_SIZE;
++ pte++;
++ if ((end_address < stop_address) &&
++ (end_address != ALIGN(end_address, 1UL << PMD_SHIFT)))
++ goto retry_pte;
++ continue;
++ }
++ /* Found next valid vmem_map page */
++ break;
++ } while (end_address < stop_address);
++
++ end_address = min(end_address, stop_address);
++ end_address = end_address - (unsigned long) vmem_map + sizeof(struct page) - 1;
++ hole_next_pfn = end_address / sizeof(struct page);
++ return hole_next_pfn - pgdat->node_start_pfn;
++}
++#else
++static inline int find_next_valid_pfn_for_pgdat(pg_data_t *pgdat, int i)
++{
++ return i + 1;
++}
++#endif
++
+ /**
+ * show_mem - give short summary of memory stats
+ *
+@@ -547,8 +609,10 @@ void show_mem(void)
+ struct page *page;
+ if (pfn_valid(pgdat->node_start_pfn + i))
+ page = pfn_to_page(pgdat->node_start_pfn + i);
+- else
++ else {
++ i = find_next_valid_pfn_for_pgdat(pgdat, i) - 1;
+ continue;
++ }
+ if (PageReserved(page))
+ reserved++;
+ else if (PageSwapCache(page))
++++++ patches.kernel.org.tar.bz2 ++++++
++++ 4006 lines of diff (skipped)
++++++ patches.rpmify.tar.bz2 ++++++
++++++ patches.suse.tar.bz2 ++++++
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/patches.suse/ocfs2-update-2006-04-11.diff new/patches.suse/ocfs2-update-2006-04-11.diff
--- old/patches.suse/ocfs2-update-2006-04-11.diff 1970-01-01 01:00:00.000000000 +0100
+++ new/patches.suse/ocfs2-update-2006-04-11.diff 2006-04-13 22:27:56.000000000 +0200
@@ -0,0 +1,1363 @@
+From: Mark Fasheh
+Subject: [oracle-dev] OCFS2 Code Update for SLES 10 - 2006-04-11
+
+This patch is against kernel-source-2.6.16-20060408024659. It includes the
+following patches from svn:
+
+r2778: added source addr to bind() in o2net_start_connect()
+r2779: mlog_errno() in extent_map.c
+r2780: respond to on-disk corruption in the extent map code.
+r2781: orphan recovery deadlock fix
+r2782: dlm mastery fixes
+r2783: dlm mastery fixes
+r2784: remove all instances of MLFu64 in dlm
+r2785: use hlists for lockres hash
+r2787: multi node truncate fix
+r2799: userdlm fixes
+
+--
+Mark Fasheh
+Senior Software Developer, Oracle
+mark.fasheh@oracle.com
+
+Acked-by: Jeff Mahoney
+
+diff --exclude='*.orig' --exclude='*~' -pruN linux-2.6.16-20060408024659.orig/fs/ocfs2/cluster/tcp.c linux-2.6.16-20060408024659/fs/ocfs2/cluster/tcp.c
+--- linux-2.6.16-20060408024659.orig/fs/ocfs2/cluster/tcp.c 2006-04-10 18:23:52.000000000 -0700
++++ linux-2.6.16-20060408024659/fs/ocfs2/cluster/tcp.c 2006-04-10 18:13:59.000000000 -0700
+@@ -1342,7 +1342,7 @@ static void o2net_start_connect(void *ar
+ {
+ struct o2net_node *nn = arg;
+ struct o2net_sock_container *sc = NULL;
+- struct o2nm_node *node = NULL;
++ struct o2nm_node *node = NULL, *mynode = NULL;
+ struct socket *sock = NULL;
+ struct sockaddr_in myaddr = {0, }, remoteaddr = {0, };
+ int ret = 0;
+@@ -1358,6 +1358,12 @@ static void o2net_start_connect(void *ar
+ goto out;
+ }
+
++ mynode = o2nm_get_node_by_num(o2nm_this_node());
++ if (mynode == NULL) {
++ ret = 0;
++ goto out;
++ }
++
+ spin_lock(&nn->nn_lock);
+ /* see if we already have one pending or have given up */
+ if (nn->nn_sc || nn->nn_persistent_error)
+@@ -1385,12 +1391,14 @@ static void o2net_start_connect(void *ar
+ sock->sk->sk_allocation = GFP_ATOMIC;
+
+ myaddr.sin_family = AF_INET;
++ myaddr.sin_addr.s_addr = (__force u32)mynode->nd_ipv4_address;
+ myaddr.sin_port = (__force u16)htons(0); /* any port */
+
+ ret = sock->ops->bind(sock, (struct sockaddr *)&myaddr,
+ sizeof(myaddr));
+ if (ret) {
+- mlog(0, "bind failed: %d\n", ret);
++ mlog(ML_ERROR, "bind failed with %d at address %u.%u.%u.%u\n",
++ ret, NIPQUAD(mynode->nd_ipv4_address));
+ goto out;
+ }
+
+@@ -1431,6 +1439,8 @@ out:
+ sc_put(sc);
+ if (node)
+ o2nm_node_put(node);
++ if (mynode)
++ o2nm_node_put(mynode);
+
+ return;
+ }
+diff --exclude='*.orig' --exclude='*~' -pruN linux-2.6.16-20060408024659.orig/fs/ocfs2/cluster/ver.c linux-2.6.16-20060408024659/fs/ocfs2/cluster/ver.c
+--- linux-2.6.16-20060408024659.orig/fs/ocfs2/cluster/ver.c 2006-04-10 18:23:52.000000000 -0700
++++ linux-2.6.16-20060408024659/fs/ocfs2/cluster/ver.c 2006-04-11 14:45:48.000000000 -0700
+@@ -28,8 +28,8 @@
+
+ #include "ver.h"
+
+-#define CLUSTER_BUILD_VERSION "1.2.0-SLES"
+-#define CLUSTER_BUILD_DATE "Tue Feb 21 14:36:13 PST 2006"
++#define CLUSTER_BUILD_VERSION "1.2.1-SLES"
++#define CLUSTER_BUILD_DATE "Tue Apr 11 14:45:04 PDT 2006"
+ #define CLUSTER_BUILD_MD5 "sles"
+
+ #define VERSION_STR "OCFS2 Node Manager " \
+diff --exclude='*.orig' --exclude='*~' -pruN linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/dlmast.c linux-2.6.16-20060408024659/fs/ocfs2/dlm/dlmast.c
+--- linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/dlmast.c 2006-04-10 18:23:52.000000000 -0700
++++ linux-2.6.16-20060408024659/fs/ocfs2/dlm/dlmast.c 2006-04-10 18:19:33.000000000 -0700
+@@ -307,8 +307,11 @@ int dlm_proxy_ast_handler(struct o2net_m
+
+ if (past->type != DLM_AST &&
+ past->type != DLM_BAST) {
+- mlog(ML_ERROR, "Unknown ast type! %d, cookie=%"MLFu64", "
+- "name=%.*s\n", past->type, cookie, locklen, name);
++ mlog(ML_ERROR, "Unknown ast type! %d, cookie=%u:%llu"
++ "name=%.*s\n", past->type,
++ dlm_get_lock_cookie_node(cookie),
++ dlm_get_lock_cookie_seq(cookie),
++ locklen, name);
+ ret = DLM_IVLOCKID;
+ goto leave;
+ }
+@@ -316,9 +319,11 @@ int dlm_proxy_ast_handler(struct o2net_m
+ res = dlm_lookup_lockres(dlm, name, locklen);
+ if (!res) {
+ mlog(ML_ERROR, "got %sast for unknown lockres! "
+- "cookie=%"MLFu64", name=%.*s, namelen=%u\n",
++ "cookie=%u:%llu, name=%.*s, namelen=%u\n",
+ past->type == DLM_AST ? "" : "b",
+- cookie, locklen, name, locklen);
++ dlm_get_lock_cookie_node(cookie),
++ dlm_get_lock_cookie_seq(cookie),
++ locklen, name, locklen);
+ ret = DLM_IVLOCKID;
+ goto leave;
+ }
+@@ -360,9 +365,12 @@ int dlm_proxy_ast_handler(struct o2net_m
+ goto do_ast;
+ }
+
+- mlog(ML_ERROR, "got %sast for unknown lock! cookie=%"MLFu64", "
+- "name=%.*s, namelen=%u\n",
+- past->type == DLM_AST ? "" : "b", cookie, locklen, name, locklen);
++ mlog(ML_ERROR, "got %sast for unknown lock! cookie=%u:%llu, "
++ "name=%.*s, namelen=%u\n",
++ past->type == DLM_AST ? "" : "b",
++ dlm_get_lock_cookie_node(cookie),
++ dlm_get_lock_cookie_seq(cookie),
++ locklen, name, locklen);
+
+ ret = DLM_NORMAL;
+ unlock_out:
+diff --exclude='*.orig' --exclude='*~' -pruN linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/dlmcommon.h linux-2.6.16-20060408024659/fs/ocfs2/dlm/dlmcommon.h
+--- linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/dlmcommon.h 2006-04-10 18:23:52.000000000 -0700
++++ linux-2.6.16-20060408024659/fs/ocfs2/dlm/dlmcommon.h 2006-04-10 18:20:21.000000000 -0700
+@@ -37,9 +37,7 @@
+ #define DLM_THREAD_SHUFFLE_INTERVAL 5 // flush everything every 5 passes
+ #define DLM_THREAD_MS 200 // flush at least every 200 ms
+
+-#define DLM_HASH_BITS 7
+-#define DLM_HASH_SIZE (1 << DLM_HASH_BITS)
+-#define DLM_HASH_MASK (DLM_HASH_SIZE - 1)
++#define DLM_HASH_BUCKETS (PAGE_SIZE / sizeof(struct hlist_head))
+
+ enum dlm_ast_type {
+ DLM_AST = 0,
+@@ -87,7 +85,7 @@ enum dlm_ctxt_state {
+ struct dlm_ctxt
+ {
+ struct list_head list;
+- struct list_head *resources;
++ struct hlist_head *lockres_hash;
+ struct list_head dirty_list;
+ struct list_head purge_list;
+ struct list_head pending_asts;
+@@ -217,7 +215,7 @@ struct dlm_lock_resource
+ {
+ /* WARNING: Please see the comment in dlm_init_lockres before
+ * adding fields here. */
+- struct list_head list;
++ struct hlist_node hash_node;
+ struct kref refs;
+
+ /* please keep these next 3 in this order
+@@ -632,6 +630,21 @@ __dlm_lockres_state_to_status(struct dlm
+ return status;
+ }
+
++static inline u8 dlm_get_lock_cookie_node(u64 cookie)
++{
++ u8 ret;
++ cookie >>= 56;
++ ret = (u8)(cookie & 0xffULL);
++ return ret;
++}
++
++static inline unsigned long long dlm_get_lock_cookie_seq(u64 cookie)
++{
++ unsigned long long ret;
++ ret = ((unsigned long long)cookie) & 0x00ffffffffffffffULL;
++ return ret;
++}
++
+ struct dlm_lock * dlm_new_lock(int type, u8 node, u64 cookie,
+ struct dlm_lockstatus *lksb);
+ void dlm_lock_get(struct dlm_lock *lock);
+diff --exclude='*.orig' --exclude='*~' -pruN linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/dlmconvert.c linux-2.6.16-20060408024659/fs/ocfs2/dlm/dlmconvert.c
+--- linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/dlmconvert.c 2006-04-10 18:23:52.000000000 -0700
++++ linux-2.6.16-20060408024659/fs/ocfs2/dlm/dlmconvert.c 2006-04-10 18:19:33.000000000 -0700
+@@ -284,8 +284,10 @@ enum dlm_status dlmconvert_remote(struct
+ if (lock->ml.convert_type != LKM_IVMODE) {
+ __dlm_print_one_lock_resource(res);
+ mlog(ML_ERROR, "converting a remote lock that is already "
+- "converting! (cookie=%"MLFu64", conv=%d)\n",
+- lock->ml.cookie, lock->ml.convert_type);
++ "converting! (cookie=%u:%llu, conv=%d)\n",
++ dlm_get_lock_cookie_node(lock->ml.cookie),
++ dlm_get_lock_cookie_seq(lock->ml.cookie),
++ lock->ml.convert_type);
+ status = DLM_DENIED;
+ goto bail;
+ }
+@@ -513,8 +515,9 @@ int dlm_convert_lock_handler(struct o2ne
+ leave:
+ if (!lock)
+ mlog(ML_ERROR, "did not find lock to convert on grant queue! "
+- "cookie=%"MLFu64"\n",
+- cnv->cookie);
++ "cookie=%u:%llu\n",
++ dlm_get_lock_cookie_node(cnv->cookie),
++ dlm_get_lock_cookie_seq(cnv->cookie));
+ else
+ dlm_lock_put(lock);
+
+diff --exclude='*.orig' --exclude='*~' -pruN linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/dlmdebug.c linux-2.6.16-20060408024659/fs/ocfs2/dlm/dlmdebug.c
+--- linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/dlmdebug.c 2006-04-10 18:23:52.000000000 -0700
++++ linux-2.6.16-20060408024659/fs/ocfs2/dlm/dlmdebug.c 2006-04-10 18:20:21.000000000 -0700
+@@ -243,8 +243,10 @@ void __dlm_print_one_lock_resource(struc
+ lock = list_entry(iter2, struct dlm_lock, list);
+ spin_lock(&lock->spinlock);
+ mlog(ML_NOTICE, " type=%d, conv=%d, node=%u, "
+- "cookie=%"MLFu64", ast=(empty=%c,pend=%c), bast=(empty=%c,pend=%c)\n",
+- lock->ml.type, lock->ml.convert_type, lock->ml.node, lock->ml.cookie,
++ "cookie=%u:%llu, ast=(empty=%c,pend=%c), bast=(empty=%c,pend=%c)\n",
++ lock->ml.type, lock->ml.convert_type, lock->ml.node,
++ dlm_get_lock_cookie_node(lock->ml.cookie),
++ dlm_get_lock_cookie_seq(lock->ml.cookie),
+ list_empty(&lock->ast_list) ? 'y' : 'n',
+ lock->ast_pending ? 'y' : 'n',
+ list_empty(&lock->bast_list) ? 'y' : 'n',
+@@ -256,8 +258,10 @@ void __dlm_print_one_lock_resource(struc
+ lock = list_entry(iter2, struct dlm_lock, list);
+ spin_lock(&lock->spinlock);
+ mlog(ML_NOTICE, " type=%d, conv=%d, node=%u, "
+- "cookie=%"MLFu64", ast=(empty=%c,pend=%c), bast=(empty=%c,pend=%c)\n",
+- lock->ml.type, lock->ml.convert_type, lock->ml.node, lock->ml.cookie,
++ "cookie=%u:%llu, ast=(empty=%c,pend=%c), bast=(empty=%c,pend=%c)\n",
++ lock->ml.type, lock->ml.convert_type, lock->ml.node,
++ dlm_get_lock_cookie_node(lock->ml.cookie),
++ dlm_get_lock_cookie_seq(lock->ml.cookie),
+ list_empty(&lock->ast_list) ? 'y' : 'n',
+ lock->ast_pending ? 'y' : 'n',
+ list_empty(&lock->bast_list) ? 'y' : 'n',
+@@ -269,8 +273,10 @@ void __dlm_print_one_lock_resource(struc
+ lock = list_entry(iter2, struct dlm_lock, list);
+ spin_lock(&lock->spinlock);
+ mlog(ML_NOTICE, " type=%d, conv=%d, node=%u, "
+- "cookie=%"MLFu64", ast=(empty=%c,pend=%c), bast=(empty=%c,pend=%c)\n",
+- lock->ml.type, lock->ml.convert_type, lock->ml.node, lock->ml.cookie,
++ "cookie=%u:%llu, ast=(empty=%c,pend=%c), bast=(empty=%c,pend=%c)\n",
++ lock->ml.type, lock->ml.convert_type, lock->ml.node,
++ dlm_get_lock_cookie_node(lock->ml.cookie),
++ dlm_get_lock_cookie_seq(lock->ml.cookie),
+ list_empty(&lock->ast_list) ? 'y' : 'n',
+ lock->ast_pending ? 'y' : 'n',
+ list_empty(&lock->bast_list) ? 'y' : 'n',
+@@ -289,8 +295,8 @@ EXPORT_SYMBOL_GPL(dlm_print_one_lock);
+ void dlm_dump_lock_resources(struct dlm_ctxt *dlm)
+ {
+ struct dlm_lock_resource *res;
+- struct list_head *iter;
+- struct list_head *bucket;
++ struct hlist_node *iter;
++ struct hlist_head *bucket;
+ int i;
+
+ mlog(ML_NOTICE, "struct dlm_ctxt: %s, node=%u, key=%u\n",
+@@ -301,12 +307,10 @@ void dlm_dump_lock_resources(struct dlm_
+ }
+
+ spin_lock(&dlm->spinlock);
+- for (i=0; iresources[i]);
+- list_for_each(iter, bucket) {
+- res = list_entry(iter, struct dlm_lock_resource, list);
++ for (i=0; ilockres_hash[i]);
++ hlist_for_each_entry(res, iter, bucket, hash_node)
+ dlm_print_one_lock_resource(res);
+- }
+ }
+ spin_unlock(&dlm->spinlock);
+ }
+diff --exclude='*.orig' --exclude='*~' -pruN linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/dlmdomain.c linux-2.6.16-20060408024659/fs/ocfs2/dlm/dlmdomain.c
+--- linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/dlmdomain.c 2006-04-10 18:23:52.000000000 -0700
++++ linux-2.6.16-20060408024659/fs/ocfs2/dlm/dlmdomain.c 2006-04-10 18:20:21.000000000 -0700
+@@ -77,26 +77,26 @@ static void dlm_unregister_domain_handle
+
+ void __dlm_unhash_lockres(struct dlm_lock_resource *lockres)
+ {
+- list_del_init(&lockres->list);
++ hlist_del_init(&lockres->hash_node);
+ dlm_lockres_put(lockres);
+ }
+
+ void __dlm_insert_lockres(struct dlm_ctxt *dlm,
+ struct dlm_lock_resource *res)
+ {
+- struct list_head *bucket;
++ struct hlist_head *bucket;
+ struct qstr *q;
+
+ assert_spin_locked(&dlm->spinlock);
+
+ q = &res->lockname;
+ q->hash = full_name_hash(q->name, q->len);
+- bucket = &(dlm->resources[q->hash & DLM_HASH_MASK]);
++ bucket = &(dlm->lockres_hash[q->hash % DLM_HASH_BUCKETS]);
+
+ /* get a reference for our hashtable */
+ dlm_lockres_get(res);
+
+- list_add_tail(&res->list, bucket);
++ hlist_add_head(&res->hash_node, bucket);
+ }
+
+ struct dlm_lock_resource * __dlm_lookup_lockres(struct dlm_ctxt *dlm,
+@@ -104,9 +104,9 @@ struct dlm_lock_resource * __dlm_lookup_
+ unsigned int len)
+ {
+ unsigned int hash;
+- struct list_head *iter;
++ struct hlist_node *iter;
+ struct dlm_lock_resource *tmpres=NULL;
+- struct list_head *bucket;
++ struct hlist_head *bucket;
+
+ mlog_entry("%.*s\n", len, name);
+
+@@ -114,11 +114,11 @@ struct dlm_lock_resource * __dlm_lookup_
+
+ hash = full_name_hash(name, len);
+
+- bucket = &(dlm->resources[hash & DLM_HASH_MASK]);
++ bucket = &(dlm->lockres_hash[hash % DLM_HASH_BUCKETS]);
+
+ /* check for pre-existing lock */
+- list_for_each(iter, bucket) {
+- tmpres = list_entry(iter, struct dlm_lock_resource, list);
++ hlist_for_each(iter, bucket) {
++ tmpres = hlist_entry(iter, struct dlm_lock_resource, hash_node);
+ if (tmpres->lockname.len == len &&
+ memcmp(tmpres->lockname.name, name, len) == 0) {
+ dlm_lockres_get(tmpres);
+@@ -193,8 +193,8 @@ static int dlm_wait_on_domain_helper(con
+
+ static void dlm_free_ctxt_mem(struct dlm_ctxt *dlm)
+ {
+- if (dlm->resources)
+- free_page((unsigned long) dlm->resources);
++ if (dlm->lockres_hash)
++ free_page((unsigned long) dlm->lockres_hash);
+
+ if (dlm->name)
+ kfree(dlm->name);
+@@ -310,10 +310,10 @@ static void dlm_migrate_all_locks(struct
+ mlog(0, "Migrating locks from domain %s\n", dlm->name);
+ restart:
+ spin_lock(&dlm->spinlock);
+- for (i=0; iresources[i])) {
+- res = list_entry(dlm->resources[i].next,
+- struct dlm_lock_resource, list);
++ for (i = 0; i < DLM_HASH_BUCKETS; i++) {
++ while (!hlist_empty(&dlm->lockres_hash[i])) {
++ res = hlist_entry(dlm->lockres_hash[i].first,
++ struct dlm_lock_resource, hash_node);
+ /* need reference when manually grabbing lockres */
+ dlm_lockres_get(res);
+ /* this should unhash the lockres
+@@ -1200,18 +1200,17 @@ static struct dlm_ctxt *dlm_alloc_ctxt(c
+ goto leave;
+ }
+
+- dlm->resources = (struct list_head *) __get_free_page(GFP_KERNEL);
+- if (!dlm->resources) {
++ dlm->lockres_hash = (struct hlist_head *) __get_free_page(GFP_KERNEL);
++ if (!dlm->lockres_hash) {
+ mlog_errno(-ENOMEM);
+ kfree(dlm->name);
+ kfree(dlm);
+ dlm = NULL;
+ goto leave;
+ }
+- memset(dlm->resources, 0, PAGE_SIZE);
+
+- for (i=0; iresources[i]);
++ for (i=0; ilockres_hash[i]);
+
+ strcpy(dlm->name, domain);
+ dlm->key = key;
+diff --exclude='*.orig' --exclude='*~' -pruN linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/dlmfsver.c linux-2.6.16-20060408024659/fs/ocfs2/dlm/dlmfsver.c
+--- linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/dlmfsver.c 2006-04-10 18:23:52.000000000 -0700
++++ linux-2.6.16-20060408024659/fs/ocfs2/dlm/dlmfsver.c 2006-04-11 14:46:12.000000000 -0700
+@@ -28,8 +28,8 @@
+
+ #include "dlmfsver.h"
+
+-#define DLM_BUILD_VERSION "1.2.0-SLES"
+-#define DLM_BUILD_DATE "Tue Feb 21 14:36:13 PST 2006"
++#define DLM_BUILD_VERSION "1.2.1-SLES"
++#define DLM_BUILD_DATE "Tue Apr 11 14:45:04 PDT 2006"
+ #define DLM_BUILD_MD5 "sles"
+
+ #define VERSION_STR "OCFS2 DLMFS " \
+diff --exclude='*.orig' --exclude='*~' -pruN linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/dlmmaster.c linux-2.6.16-20060408024659/fs/ocfs2/dlm/dlmmaster.c
+--- linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/dlmmaster.c 2006-04-10 18:23:52.000000000 -0700
++++ linux-2.6.16-20060408024659/fs/ocfs2/dlm/dlmmaster.c 2006-04-10 18:20:21.000000000 -0700
+@@ -561,7 +561,7 @@ static void dlm_lockres_release(struct k
+
+ /* By the time we're ready to blow this guy away, we shouldn't
+ * be on any lists. */
+- BUG_ON(!list_empty(&res->list));
++ BUG_ON(!hlist_unhashed(&res->hash_node));
+ BUG_ON(!list_empty(&res->granted));
+ BUG_ON(!list_empty(&res->converting));
+ BUG_ON(!list_empty(&res->blocked));
+@@ -601,7 +601,7 @@ void dlm_init_lockres(struct dlm_ctxt *d
+
+ init_waitqueue_head(&res->wq);
+ spin_lock_init(&res->spinlock);
+- INIT_LIST_HEAD(&res->list);
++ INIT_HLIST_NODE(&res->hash_node);
+ INIT_LIST_HEAD(&res->granted);
+ INIT_LIST_HEAD(&res->converting);
+ INIT_LIST_HEAD(&res->blocked);
+diff --exclude='*.orig' --exclude='*~' -pruN linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/dlmrecovery.c linux-2.6.16-20060408024659/fs/ocfs2/dlm/dlmrecovery.c
+--- linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/dlmrecovery.c 2006-04-10 18:23:52.000000000 -0700
++++ linux-2.6.16-20060408024659/fs/ocfs2/dlm/dlmrecovery.c 2006-04-10 18:20:21.000000000 -0700
+@@ -743,10 +743,12 @@ static void dlm_request_all_locks_worker
+ dlm->name, dlm->reco.dead_node, dlm->reco.new_master,
+ dead_node, reco_master);
+ mlog(ML_ERROR, "%s: name=%.*s master=%u locks=%u/%u flags=%u "
+- "entry[0]={c=%"MLFu64",l=%u,f=%u,t=%d,ct=%d,hb=%d,n=%u}\n",
++ "entry[0]={c=%u:%llu,l=%u,f=%u,t=%d,ct=%d,hb=%d,n=%u}\n",
+ dlm->name, mres->lockname_len, mres->lockname, mres->master,
+ mres->num_locks, mres->total_locks, mres->flags,
+- mres->ml[0].cookie, mres->ml[0].list, mres->ml[0].flags,
++ dlm_get_lock_cookie_node(mres->ml[0].cookie),
++ dlm_get_lock_cookie_seq(mres->ml[0].cookie),
++ mres->ml[0].list, mres->ml[0].flags,
+ mres->ml[0].type, mres->ml[0].convert_type,
+ mres->ml[0].highest_blocked, mres->ml[0].node);
+ BUG();
+@@ -1512,9 +1514,11 @@ static int dlm_process_recovery_data(str
+ /* lock is always created locally first, and
+ * destroyed locally last. it must be on the list */
+ if (!lock) {
++ u64 c = ml->cookie;
+ mlog(ML_ERROR, "could not find local lock "
+- "with cookie %"MLFu64"!\n",
+- ml->cookie);
++ "with cookie %u:%llu!\n",
++ dlm_get_lock_cookie_node(c),
++ dlm_get_lock_cookie_seq(c));
+ BUG();
+ }
+ BUG_ON(lock->ml.node != ml->node);
+@@ -1686,7 +1690,10 @@ static void dlm_finish_local_lockres_rec
+ u8 dead_node, u8 new_master)
+ {
+ int i;
+- struct list_head *iter, *iter2, *bucket;
++ struct list_head *iter, *iter2;
++ struct hlist_node *hash_iter;
++ struct hlist_head *bucket;
++
+ struct dlm_lock_resource *res;
+
+ mlog_entry_void();
+@@ -1710,10 +1717,9 @@ static void dlm_finish_local_lockres_rec
+ * for now we need to run the whole hash, clear
+ * the RECOVERING state and set the owner
+ * if necessary */
+- for (i=0; iresources[i]);
+- list_for_each(iter, bucket) {
+- res = list_entry (iter, struct dlm_lock_resource, list);
++ for (i = 0; i < DLM_HASH_BUCKETS; i++) {
++ bucket = &(dlm->lockres_hash[i]);
++ hlist_for_each_entry(res, hash_iter, bucket, hash_node) {
+ if (res->state & DLM_LOCK_RES_RECOVERING) {
+ if (res->owner == dead_node) {
+ mlog(0, "(this=%u) res %.*s owner=%u "
+@@ -1852,10 +1858,10 @@ static void dlm_free_dead_locks(struct d
+
+ static void dlm_do_local_recovery_cleanup(struct dlm_ctxt *dlm, u8 dead_node)
+ {
+- struct list_head *iter;
++ struct hlist_node *iter;
+ struct dlm_lock_resource *res;
+ int i;
+- struct list_head *bucket;
++ struct hlist_head *bucket;
+ struct dlm_lock *lock;
+
+
+@@ -1876,10 +1882,9 @@ static void dlm_do_local_recovery_cleanu
+ * can be kicked again to see if any ASTs or BASTs
+ * need to be fired as a result.
+ */
+- for (i=0; iresources[i]);
+- list_for_each(iter, bucket) {
+- res = list_entry (iter, struct dlm_lock_resource, list);
++ for (i = 0; i < DLM_HASH_BUCKETS; i++) {
++ bucket = &(dlm->lockres_hash[i]);
++ hlist_for_each_entry(res, iter, bucket, hash_node) {
+ /* always prune any $RECOVERY entries for dead nodes,
+ * otherwise hangs can occur during later recovery */
+ if (dlm_is_recovery_lock(res->lockname.name,
+diff --exclude='*.orig' --exclude='*~' -pruN linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/dlmunlock.c linux-2.6.16-20060408024659/fs/ocfs2/dlm/dlmunlock.c
+--- linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/dlmunlock.c 2006-04-10 18:23:52.000000000 -0700
++++ linux-2.6.16-20060408024659/fs/ocfs2/dlm/dlmunlock.c 2006-04-10 18:19:33.000000000 -0700
+@@ -244,8 +244,10 @@ leave:
+ if (actions & DLM_UNLOCK_FREE_LOCK) {
+ /* this should always be coupled with list removal */
+ BUG_ON(!(actions & DLM_UNLOCK_REMOVE_LOCK));
+- mlog(0, "lock %"MLFu64" should be gone now! refs=%d\n",
+- lock->ml.cookie, atomic_read(&lock->lock_refs.refcount)-1);
++ mlog(0, "lock %u:%llu should be gone now! refs=%d\n",
++ dlm_get_lock_cookie_node(lock->ml.cookie),
++ dlm_get_lock_cookie_seq(lock->ml.cookie),
++ atomic_read(&lock->lock_refs.refcount)-1);
+ dlm_lock_put(lock);
+ }
+ if (actions & DLM_UNLOCK_CALL_AST)
+@@ -493,8 +495,9 @@ int dlm_unlock_lock_handler(struct o2net
+ not_found:
+ if (!found)
+ mlog(ML_ERROR, "failed to find lock to unlock! "
+- "cookie=%"MLFu64"\n",
+- unlock->cookie);
++ "cookie=%u:%llu\n",
++ dlm_get_lock_cookie_node(unlock->cookie),
++ dlm_get_lock_cookie_seq(unlock->cookie));
+ else {
+ /* send the lksb->status back to the other node */
+ status = lksb->status;
+diff --exclude='*.orig' --exclude='*~' -pruN linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/dlmver.c linux-2.6.16-20060408024659/fs/ocfs2/dlm/dlmver.c
+--- linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/dlmver.c 2006-04-10 18:23:52.000000000 -0700
++++ linux-2.6.16-20060408024659/fs/ocfs2/dlm/dlmver.c 2006-04-11 14:46:26.000000000 -0700
+@@ -28,8 +28,8 @@
+
+ #include "dlmver.h"
+
+-#define DLM_BUILD_VERSION "1.2.0-SLES"
+-#define DLM_BUILD_DATE "Tue Feb 21 14:36:13 PST 2006"
++#define DLM_BUILD_VERSION "1.2.1-SLES"
++#define DLM_BUILD_DATE "Tue Apr 11 14:45:04 PDT 2006"
+ #define DLM_BUILD_MD5 "sles"
+
+ #define VERSION_STR "OCFS2 DLM " \
+diff --exclude='*.orig' --exclude='*~' -pruN linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/userdlm.c linux-2.6.16-20060408024659/fs/ocfs2/dlm/userdlm.c
+--- linux-2.6.16-20060408024659.orig/fs/ocfs2/dlm/userdlm.c 2006-04-10 18:23:52.000000000 -0700
++++ linux-2.6.16-20060408024659/fs/ocfs2/dlm/userdlm.c 2006-04-10 18:21:31.000000000 -0700
+@@ -139,6 +139,10 @@ static void user_ast(void *opaque)
+ return;
+ }
+
++ mlog_bug_on_msg(lockres->l_requested == LKM_IVMODE,
++ "Lockres %s, requested ivmode. flags 0x%x\n",
++ lockres->l_name, lockres->l_flags);
++
+ /* we're downconverting. */
+ if (lockres->l_requested < lockres->l_level) {
+ if (lockres->l_requested <=
+@@ -229,23 +233,42 @@ static void user_unlock_ast(void *opaque
+
+ mlog(0, "UNLOCK AST called on lock %s\n", lockres->l_name);
+
+- if (status != DLM_NORMAL)
++ if (status != DLM_NORMAL && status != DLM_CANCELGRANT)
+ mlog(ML_ERROR, "Dlm returns status %d\n", status);
+
+ spin_lock(&lockres->l_lock);
+- if (lockres->l_flags & USER_LOCK_IN_TEARDOWN)
++ /* The teardown flag gets set early during the unlock process,
++ * so test the cancel flag to make sure that this ast isn't
++ * for a concurrent cancel. */
++ if (lockres->l_flags & USER_LOCK_IN_TEARDOWN
++ && !(lockres->l_flags & USER_LOCK_IN_CANCEL)) {
+ lockres->l_level = LKM_IVMODE;
+- else {
++ } else if (status == DLM_CANCELGRANT) {
++ mlog(0, "Lock %s, cancel fails, flags 0x%x\n",
++ lockres->l_name, lockres->l_flags);
++ /* We tried to cancel a convert request, but it was
++ * already granted. Don't clear the busy flag - the
++ * ast should've done this already. */
++ BUG_ON(!(lockres->l_flags & USER_LOCK_IN_CANCEL));
++ lockres->l_flags &= ~USER_LOCK_IN_CANCEL;
++ goto out_noclear;
++ } else {
++ BUG_ON(!(lockres->l_flags & USER_LOCK_IN_CANCEL));
++ /* Cancel succeeded, we want to re-queue */
++ mlog(0, "Lock %s, cancel succeeds, flags 0x%x\n",
++ lockres->l_name, lockres->l_flags);
+ lockres->l_requested = LKM_IVMODE; /* cancel an
+ * upconvert
+ * request. */
+ lockres->l_flags &= ~USER_LOCK_IN_CANCEL;
+ /* we want the unblock thread to look at it again
+ * now. */
+- __user_dlm_queue_lockres(lockres);
++ if (lockres->l_flags & USER_LOCK_BLOCKED)
++ __user_dlm_queue_lockres(lockres);
+ }
+
+ lockres->l_flags &= ~USER_LOCK_BUSY;
++out_noclear:
+ spin_unlock(&lockres->l_lock);
+
+ wake_up(&lockres->l_event);
+@@ -268,13 +291,26 @@ static void user_dlm_unblock_lock(void *
+
+ spin_lock(&lockres->l_lock);
+
+- BUG_ON(!(lockres->l_flags & USER_LOCK_BLOCKED));
+- BUG_ON(!(lockres->l_flags & USER_LOCK_QUEUED));
++ mlog_bug_on_msg(!(lockres->l_flags & USER_LOCK_QUEUED),
++ "Lockres %s, flags 0x%x\n",
++ lockres->l_name, lockres->l_flags);
+
+- /* notice that we don't clear USER_LOCK_BLOCKED here. That's
+- * for user_ast to do. */
++ /* notice that we don't clear USER_LOCK_BLOCKED here. If it's
++ * set, we want user_ast clear it. */
+ lockres->l_flags &= ~USER_LOCK_QUEUED;
+
++ /* It's valid to get here and no longer be blocked - if we get
++ * several basts in a row, we might be queued by the first
++ * one, the unblock thread might run and clear the queued
++ * flag, and finally we might get another bast which re-queues
++ * us before our ast for the downconvert is called. */
++ if (!(lockres->l_flags & USER_LOCK_BLOCKED)) {
++ mlog(0, "Lockres %s, flags 0x%x: queued but not blocking\n",
++ lockres->l_name, lockres->l_flags);
++ spin_unlock(&lockres->l_lock);
++ goto drop_ref;
++ }
++
+ if (lockres->l_flags & USER_LOCK_IN_TEARDOWN) {
+ mlog(0, "lock is in teardown so we do nothing\n");
+ spin_unlock(&lockres->l_lock);
+@@ -282,7 +318,9 @@ static void user_dlm_unblock_lock(void *
+ }
+
+ if (lockres->l_flags & USER_LOCK_BUSY) {
+- mlog(0, "BUSY flag detected...\n");
++ mlog(0, "Cancel lock %s, flags 0x%x\n",
++ lockres->l_name, lockres->l_flags);
++
+ if (lockres->l_flags & USER_LOCK_IN_CANCEL) {
+ spin_unlock(&lockres->l_lock);
+ goto drop_ref;
+@@ -296,14 +334,7 @@ static void user_dlm_unblock_lock(void *
+ LKM_CANCEL,
+ user_unlock_ast,
+ lockres);
+- if (status == DLM_CANCELGRANT) {
+- /* If we got this, then the ast was fired
+- * before we could cancel. We cleanup our
+- * state, and restart the function. */
+- spin_lock(&lockres->l_lock);
+- lockres->l_flags &= ~USER_LOCK_IN_CANCEL;
+- spin_unlock(&lockres->l_lock);
+- } else if (status != DLM_NORMAL)
++ if (status != DLM_NORMAL)
+ user_log_dlm_error("dlmunlock", status, lockres);
+ goto drop_ref;
+ }
+@@ -581,6 +612,14 @@ int user_dlm_destroy_lock(struct user_lo
+ mlog(0, "asked to destroy %s\n", lockres->l_name);
+
+ spin_lock(&lockres->l_lock);
++ if (lockres->l_flags & USER_LOCK_IN_TEARDOWN) {
++ mlog(0, "Lock is already torn down\n");
++ spin_unlock(&lockres->l_lock);
++ return 0;
++ }
++
++ lockres->l_flags |= USER_LOCK_IN_TEARDOWN;
++
+ while (lockres->l_flags & USER_LOCK_BUSY) {
+ spin_unlock(&lockres->l_lock);
+
+@@ -606,7 +645,6 @@ int user_dlm_destroy_lock(struct user_lo
+
+ lockres->l_flags &= ~USER_LOCK_ATTACHED;
+ lockres->l_flags |= USER_LOCK_BUSY;
+- lockres->l_flags |= USER_LOCK_IN_TEARDOWN;
+ spin_unlock(&lockres->l_lock);
+
+ mlog(0, "unlocking lockres %s\n", lockres->l_name);
+diff --exclude='*.orig' --exclude='*~' -pruN linux-2.6.16-20060408024659.orig/fs/ocfs2/extent_map.c linux-2.6.16-20060408024659/fs/ocfs2/extent_map.c
+--- linux-2.6.16-20060408024659.orig/fs/ocfs2/extent_map.c 2006-04-10 18:23:52.000000000 -0700
++++ linux-2.6.16-20060408024659/fs/ocfs2/extent_map.c 2006-04-10 18:15:35.000000000 -0700
+@@ -176,21 +176,33 @@ static int ocfs2_extent_map_find_leaf(st
+ le32_to_cpu(rec->e_clusters));
+
+ ret = -EBADR;
+- if (rec_end > OCFS2_I(inode)->ip_clusters)
++ if (rec_end > OCFS2_I(inode)->ip_clusters) {
++ mlog_errno(ret);
++ ocfs2_error(inode->i_sb,
++ "Extent %d at e_blkno %"MLFu64" of inode %"MLFu64" goes past ip_clusters of %u\n",
++ i,
++ le64_to_cpu(rec->e_blkno),
++ OCFS2_I(inode)->ip_blkno,
++ OCFS2_I(inode)->ip_clusters);
+ goto out_free;
++ }
+
+ if (rec_end <= cpos) {
+ ret = ocfs2_extent_map_insert(inode, rec,
+ le16_to_cpu(el->l_tree_depth));
+- if (ret && (ret != -EEXIST))
++ if (ret && (ret != -EEXIST)) {
++ mlog_errno(ret);
+ goto out_free;
++ }
+ continue;
+ }
+ if ((cpos + clusters) <= le32_to_cpu(rec->e_cpos)) {
+ ret = ocfs2_extent_map_insert(inode, rec,
+ le16_to_cpu(el->l_tree_depth));
+- if (ret && (ret != -EEXIST))
++ if (ret && (ret != -EEXIST)) {
++ mlog_errno(ret);
+ goto out_free;
++ }
+ continue;
+ }
+
+@@ -204,8 +216,10 @@ static int ocfs2_extent_map_find_leaf(st
+ ret = -ESRCH;
+ if (!ocfs2_extent_rec_contains_clusters(rec,
+ cpos,
+- clusters))
++ clusters)) {
++ mlog_errno(ret);
+ goto out_free;
++ }
+
+ /*
+ * If we've already found a record, the el has
+@@ -213,8 +227,16 @@ static int ocfs2_extent_map_find_leaf(st
+ * EEEK!
+ */
+ ret = -EBADR;
+- if (blkno)
++ if (blkno) {
++ mlog_errno(ret);
++ ocfs2_error(inode->i_sb,
++ "Multiple extents for (cpos = %u, clusters = %u) on inode %"MLFu64"; e_blkno %"MLFu64" and rec %d at e_blkno %"MLFu64"\n",
++ cpos, clusters,
++ OCFS2_I(inode)->ip_blkno,
++ blkno, i,
++ le64_to_cpu(rec->e_blkno));
+ goto out_free;
++ }
+
+ blkno = le64_to_cpu(rec->e_blkno);
+ }
+@@ -224,8 +246,14 @@ static int ocfs2_extent_map_find_leaf(st
+ * in the branches, so we'd better have found someone
+ */
+ ret = -EBADR;
+- if (!blkno)
++ if (!blkno) {
++ ocfs2_error(inode->i_sb,
++ "No record found for (cpos = %u, clusters = %u) on inode %"MLFu64"\n",
++ cpos, clusters,
++ OCFS2_I(inode)->ip_blkno);
++ mlog_errno(ret);
+ goto out_free;
++ }
+
+ if (eb_bh) {
+ brelse(eb_bh);
+@@ -234,8 +262,10 @@ static int ocfs2_extent_map_find_leaf(st
+ ret = ocfs2_read_block(OCFS2_SB(inode->i_sb),
+ blkno, &eb_bh, OCFS2_BH_CACHED,
+ inode);
+- if (ret)
++ if (ret) {
++ mlog_errno(ret);
+ goto out_free;
++ }
+ eb = (struct ocfs2_extent_block *)eb_bh->b_data;
+ if (!OCFS2_IS_VALID_EXTENT_BLOCK(eb)) {
+ OCFS2_RO_ON_INVALID_EXTENT_BLOCK(inode->i_sb, eb);
+@@ -250,10 +280,26 @@ static int ocfs2_extent_map_find_leaf(st
+
+ for (i = 0; i < le16_to_cpu(el->l_next_free_rec); i++) {
+ rec = &el->l_recs[i];
++
++ if ((le32_to_cpu(rec->e_cpos) + le32_to_cpu(rec->e_clusters)) >
++ OCFS2_I(inode)->ip_clusters) {
++ ret = -EBADR;
++ mlog_errno(ret);
++ ocfs2_error(inode->i_sb,
++ "Extent %d at e_blkno %"MLFu64" of inode %"MLFu64" goes past ip_clusters of %u\n",
++ i,
++ le64_to_cpu(rec->e_blkno),
++ OCFS2_I(inode)->ip_blkno,
++ OCFS2_I(inode)->ip_clusters);
++ return ret;
++ }
++
+ ret = ocfs2_extent_map_insert(inode, rec,
+ le16_to_cpu(el->l_tree_depth));
+- if (ret)
++ if (ret) {
++ mlog_errno(ret);
+ goto out_free;
++ }
+ }
+
+ ret = 0;
+@@ -298,6 +344,7 @@ static int ocfs2_extent_map_lookup_read(
+ ret = ocfs2_read_block(OCFS2_SB(inode->i_sb), blkno, &bh,
+ OCFS2_BH_CACHED, inode);
+ if (ret) {
++ mlog_errno(ret);
+ if (bh)
+ brelse(bh);
+ return ret;
+@@ -316,6 +363,7 @@ static int ocfs2_extent_map_lookup_read(
+ OCFS2_I(inode)->ip_blkno, &bh,
+ OCFS2_BH_CACHED, inode);
+ if (ret) {
++ mlog_errno(ret);
+ if (bh)
+ brelse(bh);
+ return ret;
+@@ -331,12 +379,17 @@ static int ocfs2_extent_map_lookup_read(
+
+ ret = ocfs2_extent_map_find_leaf(inode, cpos, clusters, el);
+ brelse(bh);
+- if (ret)
++ if (ret) {
++ mlog_errno(ret);
+ return ret;
++ }
+
+ ent = ocfs2_extent_map_lookup(em, cpos, clusters, NULL, NULL);
+- if (!ent)
+- return -ESRCH;
++ if (!ent) {
++ ret = -ESRCH;
++ mlog_errno(ret);
++ return ret;
++ }
+
+ if (ent->e_tree_depth)
+ BUG(); /* FIXME: Make sure this isn't a corruption */
+@@ -489,14 +542,24 @@ int ocfs2_extent_map_insert(struct inode
+ struct ocfs2_em_insert_context ctxt = {0, };
+
+ if ((le32_to_cpu(rec->e_cpos) + le32_to_cpu(rec->e_clusters)) >
+- OCFS2_I(inode)->ip_map.em_clusters)
+- return -EBADR;
++ OCFS2_I(inode)->ip_map.em_clusters) {
++ ret = -EBADR;
++ mlog_errno(ret);
++ return ret;
++ }
+
+ /* Zero e_clusters means a truncated tail record. It better be EOF */
+ if (!rec->e_clusters) {
+ if ((le32_to_cpu(rec->e_cpos) + le32_to_cpu(rec->e_clusters)) !=
+- OCFS2_I(inode)->ip_map.em_clusters)
+- return -EBADR;
++ OCFS2_I(inode)->ip_map.em_clusters) {
++ ret = -EBADR;
++ mlog_errno(ret);
++ ocfs2_error(inode->i_sb,
++ "Zero e_clusters on non-tail extent record at e_blkno %"MLFu64" on inode %"MLFu64"\n",
++ le64_to_cpu(rec->e_blkno),
++ OCFS2_I(inode)->ip_blkno);
++ return ret;
++ }
+
+ /* Ignore the truncated tail */
+ return 0;
+@@ -505,8 +568,10 @@ int ocfs2_extent_map_insert(struct inode
+ ret = -ENOMEM;
+ ctxt.new_ent = kmem_cache_alloc(ocfs2_em_ent_cachep,
+ GFP_KERNEL);
+- if (!ctxt.new_ent)
++ if (!ctxt.new_ent) {
++ mlog_errno(ret);
+ return ret;
++ }
+
+ ctxt.new_ent->e_rec = *rec;
+ ctxt.new_ent->e_tree_depth = tree_depth;
+@@ -532,6 +597,9 @@ int ocfs2_extent_map_insert(struct inode
+ tree_depth, &ctxt);
+ } while (ret == -EAGAIN);
+
++ if (ret < 0)
++ mlog_errno(ret);
++
+ if (ctxt.left_ent)
+ kmem_cache_free(ocfs2_em_ent_cachep, ctxt.left_ent);
+ if (ctxt.right_ent)
+@@ -552,12 +620,12 @@ int ocfs2_extent_map_insert(struct inode
+ * Existing record in the extent map:
+ *
+ * cpos = 10, len = 10
+- * |---------|
++ * |---------|
+ *
+ * New Record:
+ *
+ * cpos = 10, len = 20
+- * |------------------|
++ * |------------------|
+ *
+ * The passed record is the new on-disk record. The new_clusters value
+ * is how many clusters were added to the file. If the append is a
+@@ -630,7 +698,8 @@ int ocfs2_extent_map_append(struct inode
+
+ if (ret == -ENOENT)
+ ret = ocfs2_extent_map_insert(inode, rec, 0);
+-
++ if (ret < 0)
++ mlog_errno(ret);
+ return ret;
+ }
+
+@@ -754,8 +823,11 @@ int ocfs2_extent_map_get_blocks(struct i
+ cpos = ocfs2_blocks_to_clusters(inode->i_sb, v_blkno);
+ clusters = ocfs2_blocks_to_clusters(inode->i_sb,
+ (u64)count + bpc - 1);
+- if ((cpos + clusters) > OCFS2_I(inode)->ip_clusters)
+- return -EINVAL;
++ if ((cpos + clusters) > OCFS2_I(inode)->ip_clusters) {
++ ret = -EINVAL;
++ mlog_errno(ret);
++ return ret;
++ }
+
+ if ((cpos + clusters) > em->em_clusters) {
+ /*
+@@ -768,16 +840,21 @@ int ocfs2_extent_map_get_blocks(struct i
+ }
+
+ ret = ocfs2_extent_map_lookup_read(inode, cpos, clusters, &ent);
+- if (ret)
++ if (ret) {
++ mlog_errno(ret);
+ return ret;
++ }
+
+ if (ent)
+ {
+ rec = &ent->e_rec;
+
+ /* We should never find ourselves straddling an interval */
+- if (!ocfs2_extent_rec_contains_clusters(rec, cpos, clusters))
+- return -ESRCH;
++ if (!ocfs2_extent_rec_contains_clusters(rec, cpos, clusters)) {
++ ret = -ESRCH;
++ mlog_errno(ret);
++ return ret;
++ }
+
+ boff = ocfs2_clusters_to_blocks(inode->i_sb, cpos -
+ le32_to_cpu(rec->e_cpos));
+diff --exclude='*.orig' --exclude='*~' -pruN linux-2.6.16-20060408024659.orig/fs/ocfs2/file.c linux-2.6.16-20060408024659/fs/ocfs2/file.c
+--- linux-2.6.16-20060408024659.orig/fs/ocfs2/file.c 2006-04-10 18:23:52.000000000 -0700
++++ linux-2.6.16-20060408024659/fs/ocfs2/file.c 2006-04-10 18:21:08.000000000 -0700
+@@ -510,6 +510,17 @@ static int ocfs2_truncate_file(struct oc
+ if (new_i_size == le64_to_cpu(fe->i_size))
+ goto bail;
+
++ /* This forces other nodes to sync and drop their pages. Do
++ * this even if we have a truncate without allocation change -
++ * ocfs2 cluster sizes can be much greater than page size, so
++ * we have to truncate them anyway. */
++ status = ocfs2_data_lock(inode, 1);
++ if (status < 0) {
++ mlog_errno(status);
++ goto bail;
++ }
++ ocfs2_data_unlock(inode, 1);
++
+ if (le32_to_cpu(fe->i_clusters) ==
+ ocfs2_clusters_for_bytes(osb->sb, new_i_size)) {
+ mlog(0, "fe->i_clusters = %u, so we do a simple truncate\n",
+@@ -532,14 +543,6 @@ static int ocfs2_truncate_file(struct oc
+ goto bail;
+ }
+
+- /* This forces other nodes to sync and drop their pages */
+- status = ocfs2_data_lock(inode, 1);
+- if (status < 0) {
+- mlog_errno(status);
+- goto bail;
+- }
+- ocfs2_data_unlock(inode, 1);
+-
+ /* alright, we're going to need to do a full blown alloc size
+ * change. Orphan the inode so that recovery can complete the
+ * truncate if necessary. This does the task of marking
+diff --exclude='*.orig' --exclude='*~' -pruN linux-2.6.16-20060408024659.orig/fs/ocfs2/heartbeat.c linux-2.6.16-20060408024659/fs/ocfs2/heartbeat.c
+--- linux-2.6.16-20060408024659.orig/fs/ocfs2/heartbeat.c 2006-04-10 18:23:52.000000000 -0700
++++ linux-2.6.16-20060408024659/fs/ocfs2/heartbeat.c 2006-04-10 18:17:22.000000000 -0700
+@@ -67,6 +67,7 @@ void ocfs2_init_node_maps(struct ocfs2_s
+ ocfs2_node_map_init(&osb->mounted_map);
+ ocfs2_node_map_init(&osb->recovery_map);
+ ocfs2_node_map_init(&osb->umount_map);
++ ocfs2_node_map_init(&osb->osb_recovering_orphan_dirs);
+ }
+
+ static void ocfs2_do_node_down(int node_num,
+diff --exclude='*.orig' --exclude='*~' -pruN linux-2.6.16-20060408024659.orig/fs/ocfs2/inode.c linux-2.6.16-20060408024659/fs/ocfs2/inode.c
+--- linux-2.6.16-20060408024659.orig/fs/ocfs2/inode.c 2006-04-10 18:23:52.000000000 -0700
++++ linux-2.6.16-20060408024659/fs/ocfs2/inode.c 2006-04-10 18:17:22.000000000 -0700
+@@ -41,6 +41,7 @@
+ #include "dlmglue.h"
+ #include "extent_map.h"
+ #include "file.h"
++#include "heartbeat.h"
+ #include "inode.h"
+ #include "journal.h"
+ #include "namei.h"
+@@ -543,6 +544,42 @@ bail:
+ return status;
+ }
+
++/*
++ * Serialize with orphan dir recovery. If the process doing
++ * recovery on this orphan dir does an iget() with the dir
++ * i_mutex held, we'll deadlock here. Instead we detect this
++ * and exit early - recovery will wipe this inode for us.
++ */
++static int ocfs2_check_orphan_recovery_state(struct ocfs2_super *osb,
++ int slot)
++{
++ int ret = 0;
++
++ spin_lock(&osb->osb_lock);
++ if (ocfs2_node_map_test_bit(osb, &osb->osb_recovering_orphan_dirs, slot)) {
++ mlog(0, "Recovery is happening on orphan dir %d, will skip "
++ "this inode\n", slot);
++ ret = -EDEADLK;
++ goto out;
++ }
++ /* This signals to the orphan recovery process that is should
++ * wait for us to handle the wipe. */
++ osb->osb_orphan_wipes[slot]++;
++out:
++ spin_unlock(&osb->osb_lock);
++ return ret;
++}
++
++static void ocfs2_signal_wipe_completion(struct ocfs2_super *osb,
++ int slot)
++{
++ spin_lock(&osb->osb_lock);
++ osb->osb_orphan_wipes[slot]--;
++ spin_unlock(&osb->osb_lock);
++
++ wake_up(&osb->osb_wipe_event);
++}
++
+ static int ocfs2_wipe_inode(struct inode *inode,
+ struct buffer_head *di_bh)
+ {
+@@ -554,6 +591,11 @@ static int ocfs2_wipe_inode(struct inode
+ /* We've already voted on this so it should be readonly - no
+ * spinlock needed. */
+ orphaned_slot = OCFS2_I(inode)->ip_orphaned_slot;
++
++ status = ocfs2_check_orphan_recovery_state(osb, orphaned_slot);
++ if (status)
++ return status;
++
+ orphan_dir_inode = ocfs2_get_system_file_inode(osb,
+ ORPHAN_DIR_SYSTEM_INODE,
+ orphaned_slot);
+@@ -596,6 +638,7 @@ bail_unlock_dir:
+ brelse(orphan_dir_bh);
+ bail:
+ iput(orphan_dir_inode);
++ ocfs2_signal_wipe_completion(osb, orphaned_slot);
+
+ return status;
+ }
+@@ -818,7 +861,8 @@ void ocfs2_delete_inode(struct inode *in
+
+ status = ocfs2_wipe_inode(inode, di_bh);
+ if (status < 0) {
+- mlog_errno(status);
++ if (status != -EDEADLK)
++ mlog_errno(status);
+ goto bail_unlock_inode;
+ }
+
+diff --exclude='*.orig' --exclude='*~' -pruN linux-2.6.16-20060408024659.orig/fs/ocfs2/journal.c linux-2.6.16-20060408024659/fs/ocfs2/journal.c
+--- linux-2.6.16-20060408024659.orig/fs/ocfs2/journal.c 2006-04-10 18:23:52.000000000 -0700
++++ linux-2.6.16-20060408024659/fs/ocfs2/journal.c 2006-04-10 18:17:22.000000000 -0700
+@@ -1400,21 +1400,17 @@ bail:
+ return status;
+ }
+
+-static int ocfs2_recover_orphans(struct ocfs2_super *osb,
+- int slot)
++static int ocfs2_queue_orphans(struct ocfs2_super *osb,
++ int slot,
++ struct inode **head)
+ {
+- int status = 0;
+- int have_disk_lock = 0;
+- struct inode *inode = NULL;
+- struct inode *iter;
++ int status;
+ struct inode *orphan_dir_inode = NULL;
++ struct inode *iter;
+ unsigned long offset, blk, local;
+ struct buffer_head *bh = NULL;
+ struct ocfs2_dir_entry *de;
+ struct super_block *sb = osb->sb;
+- struct ocfs2_inode_info *oi;
+-
+- mlog(0, "Recover inodes from orphan dir in slot %d\n", slot);
+
+ orphan_dir_inode = ocfs2_get_system_file_inode(osb,
+ ORPHAN_DIR_SYSTEM_INODE,
+@@ -1422,17 +1418,15 @@ static int ocfs2_recover_orphans(struct
+ if (!orphan_dir_inode) {
+ status = -ENOENT;
+ mlog_errno(status);
+- goto out;
+- }
++ return status;
++ }
+
+ mutex_lock(&orphan_dir_inode->i_mutex);
+ status = ocfs2_meta_lock(orphan_dir_inode, NULL, NULL, 0);
+ if (status < 0) {
+- mutex_unlock(&orphan_dir_inode->i_mutex);
+ mlog_errno(status);
+ goto out;
+ }
+- have_disk_lock = 1;
+
+ offset = 0;
+ iter = NULL;
+@@ -1443,11 +1437,10 @@ static int ocfs2_recover_orphans(struct
+ if (!bh)
+ status = -EINVAL;
+ if (status < 0) {
+- mutex_unlock(&orphan_dir_inode->i_mutex);
+ if (bh)
+ brelse(bh);
+ mlog_errno(status);
+- goto out;
++ goto out_unlock;
+ }
+
+ local = 0;
+@@ -1457,11 +1450,10 @@ static int ocfs2_recover_orphans(struct
+
+ if (!ocfs2_check_dir_entry(orphan_dir_inode,
+ de, bh, local)) {
+- mutex_unlock(&orphan_dir_inode->i_mutex);
+ status = -EINVAL;
+ mlog_errno(status);
+ brelse(bh);
+- goto out;
++ goto out_unlock;
+ }
+
+ local += le16_to_cpu(de->rec_len);
+@@ -1496,18 +1488,97 @@ static int ocfs2_recover_orphans(struct
+
+ mlog(0, "queue orphan %"MLFu64"\n",
+ OCFS2_I(iter)->ip_blkno);
+- OCFS2_I(iter)->ip_next_orphan = inode;
+- inode = iter;
++ /* No locking is required for the next_orphan
++ * queue as there is only ever a single
++ * process doing orphan recovery. */
++ OCFS2_I(iter)->ip_next_orphan = *head;
++ *head = iter;
+ }
+ brelse(bh);
+ }
+- mutex_unlock(&orphan_dir_inode->i_mutex);
+
++out_unlock:
+ ocfs2_meta_unlock(orphan_dir_inode, 0);
+- have_disk_lock = 0;
+-
++out:
++ mutex_unlock(&orphan_dir_inode->i_mutex);
+ iput(orphan_dir_inode);
+- orphan_dir_inode = NULL;
++ return status;
++}
++
++static int ocfs2_orphan_recovery_can_continue(struct ocfs2_super *osb,
++ int slot)
++{
++ int ret;
++
++ spin_lock(&osb->osb_lock);
++ ret = !osb->osb_orphan_wipes[slot];
++ spin_unlock(&osb->osb_lock);
++ return ret;
++}
++
++static void ocfs2_mark_recovering_orphan_dir(struct ocfs2_super *osb,
++ int slot)
++{
++ spin_lock(&osb->osb_lock);
++ /* Mark ourselves such that new processes in delete_inode()
++ * know to quit early. */
++ ocfs2_node_map_set_bit(osb, &osb->osb_recovering_orphan_dirs, slot);
++ while (osb->osb_orphan_wipes[slot]) {
++ mlog(0, "%u threads in iput from orphan dir %d, will wait\n",
++ osb->osb_orphan_wipes[slot], slot);
++ /* If any processes are already in the middle of an
++ * orphan wipe on this dir, then we need to wait for
++ * them. */
++ spin_unlock(&osb->osb_lock);
++ wait_event_interruptible(osb->osb_wipe_event,
++ ocfs2_orphan_recovery_can_continue(osb, slot));
++ spin_lock(&osb->osb_lock);
++ }
++ spin_unlock(&osb->osb_lock);
++}
++
++static void ocfs2_clear_recovering_orphan_dir(struct ocfs2_super *osb,
++ int slot)
++{
++ ocfs2_node_map_clear_bit(osb, &osb->osb_recovering_orphan_dirs, slot);
++}
++
++/*
++ * Orphan recovery. Each mounted node has its own orphan dir which we
++ * must run during recovery. Our strategy here is to build a list of
++ * the inodes in the orphan dir and iget/iput them. The VFS does
++ * (most) of the rest of the work.
++ *
++ * Orphan recovery can happen at any time, not just mount so we have a
++ * couple of extra considerations.
++ *
++ * - We grab as many inodes as we can under the orphan dir lock -
++ * doing iget() outside the orphan dir risks getting a reference on
++ * an invalid inode.
++ * - We must be sure not to deadlock with other processes on the
++ * system wanting to run delete_inode(). This can happen when they go
++ * to lock the orphan dir and the orphan recovery process attempts to
++ * iget() inside the orphan dir lock. This can be avoided by
++ * advertising our state to ocfs2_delete_inode().
++ */
++static int ocfs2_recover_orphans(struct ocfs2_super *osb,
++ int slot)
++{
++ int ret = 0;
++ struct inode *inode = NULL;
++ struct inode *iter;
++ struct ocfs2_inode_info *oi;
++
++ mlog(0, "Recover inodes from orphan dir in slot %d\n", slot);
++
++ ocfs2_mark_recovering_orphan_dir(osb, slot);
++ ret = ocfs2_queue_orphans(osb, slot, &inode);
++ ocfs2_clear_recovering_orphan_dir(osb, slot);
++
++ /* Error here should be noted, but we want to continue with as
++ * many queued inodes as we've got. */
++ if (ret)
++ mlog_errno(ret);
+
+ while (inode) {
+ oi = OCFS2_I(inode);
+@@ -1533,14 +1604,7 @@ static int ocfs2_recover_orphans(struct
+ inode = iter;
+ }
+
+-out:
+- if (have_disk_lock)
+- ocfs2_meta_unlock(orphan_dir_inode, 0);
+-
+- if (orphan_dir_inode)
+- iput(orphan_dir_inode);
+-
+- return status;
++ return ret;
+ }
+
+ static int ocfs2_wait_on_mount(struct ocfs2_super *osb)
+diff --exclude='*.orig' --exclude='*~' -pruN linux-2.6.16-20060408024659.orig/fs/ocfs2/ocfs2.h linux-2.6.16-20060408024659/fs/ocfs2/ocfs2.h
+--- linux-2.6.16-20060408024659.orig/fs/ocfs2/ocfs2.h 2006-04-10 18:23:52.000000000 -0700
++++ linux-2.6.16-20060408024659/fs/ocfs2/ocfs2.h 2006-04-10 18:17:22.000000000 -0700
+@@ -306,6 +306,10 @@ struct ocfs2_super
+ struct inode *osb_tl_inode;
+ struct buffer_head *osb_tl_bh;
+ struct work_struct osb_truncate_log_wq;
++
++ struct ocfs2_node_map osb_recovering_orphan_dirs;
++ unsigned int *osb_orphan_wipes;
++ wait_queue_head_t osb_wipe_event;
+ };
+
+ #define OCFS2_SB(sb) ((struct ocfs2_super *)(sb)->s_fs_info)
+diff --exclude='*.orig' --exclude='*~' -pruN linux-2.6.16-20060408024659.orig/fs/ocfs2/super.c linux-2.6.16-20060408024659/fs/ocfs2/super.c
+--- linux-2.6.16-20060408024659.orig/fs/ocfs2/super.c 2006-04-10 18:23:52.000000000 -0700
++++ linux-2.6.16-20060408024659/fs/ocfs2/super.c 2006-04-10 18:17:22.000000000 -0700
+@@ -1394,6 +1394,16 @@ static int ocfs2_initialize_super(struct
+ }
+ mlog(ML_NOTICE, "max_slots for this device: %u\n", osb->max_slots);
+
++ init_waitqueue_head(&osb->osb_wipe_event);
++ osb->osb_orphan_wipes = kcalloc(osb->max_slots,
++ sizeof(*osb->osb_orphan_wipes),
++ GFP_KERNEL);
++ if (!osb->osb_orphan_wipes) {
++ status = -ENOMEM;
++ mlog_errno(status);
++ goto bail;
++ }
++
+ osb->s_feature_compat =
+ le32_to_cpu(OCFS2_RAW_SB(di)->s_feature_compat);
+ osb->s_feature_ro_compat =
+@@ -1700,6 +1710,7 @@ static void ocfs2_delete_osb(struct ocfs
+ if (osb->slot_info)
+ ocfs2_free_slot_info(osb->slot_info);
+
++ kfree(osb->osb_orphan_wipes);
+ /* FIXME
+ * This belongs in journal shutdown, but because we have to
+ * allocate osb->journal at the start of ocfs2_initalize_osb(),
+diff --exclude='*.orig' --exclude='*~' -pruN linux-2.6.16-20060408024659.orig/fs/ocfs2/ver.c linux-2.6.16-20060408024659/fs/ocfs2/ver.c
+--- linux-2.6.16-20060408024659.orig/fs/ocfs2/ver.c 2006-04-10 18:23:52.000000000 -0700
++++ linux-2.6.16-20060408024659/fs/ocfs2/ver.c 2006-04-11 14:45:19.000000000 -0700
+@@ -29,8 +29,8 @@
+
+ #include "ver.h"
+
+-#define OCFS2_BUILD_VERSION "1.2.0-SLES"
+-#define OCFS2_BUILD_DATE "Tue Feb 21 14:36:13 PST 2006"
++#define OCFS2_BUILD_VERSION "1.2.1-SLES"
++#define OCFS2_BUILD_DATE "Tue Apr 11 14:45:04 PDT 2006"
+ #define OCFS2_BUILD_MD5 "sles"
+
+ #define VERSION_STR "OCFS2 " \
+
+
++++++ patches.uml.tar.bz2 ++++++
++++++ patches.xen.tar.bz2 ++++++
++++++ series.conf ++++++
--- kernel-source/series.conf 2006-04-13 15:27:43.000000000 +0200
+++ STABLE/kernel-source/series.conf 2006-04-18 18:32:17.000000000 +0200
@@ -21,7 +21,7 @@
# DO NOT MODIFY THEM!
# Send separate patches upstream if you find a problem...
- patches.kernel.org/patch-2.6.16.4
+ patches.kernel.org/patch-2.6.16.7
patches.fixes/setuid-dumpable-wrongdir
patches.fixes/git-kbuild.patch
@@ -106,8 +106,6 @@
patches.arch/x86_64-mce-nmi-watchdog
patches.arch/x86_64-hpet-drift
patches.arch/x86_64-sync-rdtsc
- patches.arch/x86_64-execve-cleanup
- patches.arch/x86_64-force-iret
# for i386/x86-64
patches.arch/tune-generic
@@ -150,7 +148,6 @@
patches.arch/ppc-cell-platform-detection.patch
patches.arch/ppc-iseries-systemid.patch
- patches.arch/ppc-iseries-slb_initialize.patch
patches.arch/ppc-iseries-irq-256max.patch
patches.arch/ppc-iseries-vio-uevent.patch
@@ -168,7 +165,6 @@
patches.arch/ppc-task-accounting.patch
patches.arch/ppc-prom_panic-trap.patch
patches.arch/ppc-hvc_console-init-race.patch
- patches.arch/ppc-SA_ONSTACK-fix.patch
patches.arch/ppc-protect-remove_proc_entry.patch
patches.arch/ppc-device-tree-dupnodes.patch
patches.arch/ppc-pseries-lparcfg-1.7.patch
@@ -793,6 +789,7 @@
patches.suse/ocfs2-11-user-heartbeat.diff
patches.suse/ocfs2-12-incorporate-disk-heartbeat.diff
patches.suse/ocfs2-update-2006-02-21.diff
+ patches.suse/ocfs2-update-2006-04-11.diff
+thoenig patches.suse/asus-lcd-fix
+ak patches.fixes/ec-enable-interrupts
@@ -960,6 +957,15 @@
patches.fixes/md-faulty-count-fix
patches.fixes/dm_check_device_area.diff
+ patches.fixes/idr_replace.diff
+ patches.fixes/dm-use-idr_replace.diff
+ patches.fixes/dm-idr_pre_get-ordering.diff
+ patches.fixes/dm-use-spinlock.diff
+ patches.fixes/dm-DMF_FREEING.diff
+ patches.fixes/dm-proper-refcounting.diff
+ patches.fixes/dm-module-refcount.diff
+ patches.fixes/dm-initialize-ordering.diff
+
patches.drivers/ixgb-consistent-dma-mask
patches.fixes/sn-hwperf-geoid-to-cnode-loop
@@ -982,13 +988,12 @@
patches.fixes/nfsd-ref-fhandle-problem
patches.fixes/invalidate_page_non_destructive
- patches.drivers/cciss-softirq-oops
# bug #161480
patches.fixes/uncached-allocator
- # bug #163796
- patches.fixes/RLIMIT_CPU-fix-handling-of-a-zero-limit.patch
+ # bug #166284
+ patches.fixes/show-mem
# PLEASE KEEP THESE PATCHES AT THE END OF series.conf
# (as all other arch specific patches should be kept at the end
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...