Hello community,
here is the log from the commit of package drbd
checked in at Fri Oct 6 17:24:53 CEST 2006.
--------
--- drbd/drbd.changes 2006-08-15 00:35:44.000000000 +0200
+++ /mounts/work_src_done/STABLE/drbd/drbd.changes 2006-10-06 14:05:13.000000000 +0200
@@ -1,0 +2,13 @@
+Fri Oct 6 14:03:21 CEST 2006 - lmb@suse.de
+
+- Update to 0.7.22:
+ - In protocol A and B, on connection loss, drbd could "forget" to set
+ certain areas out of sync.
+ - fix races between failure in drbd_send_dblock and concurrently
+ running tl_clear.
+ - fix potential access-afer-free in drbd_dio_end.
+ - fix possible list corruption respective resulting deadlock in
+ receive_DataRequest.
+ - improved the drbd_thread_stop / start code.
+
+-------------------------------------------------------------------
Old:
----
drbd-0.7.21.tar.gz
New:
----
drbd-0.7.22.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ drbd.spec ++++++
--- /var/tmp/diff_new_pack.eoYYbC/_old 2006-10-06 17:24:19.000000000 +0200
+++ /var/tmp/diff_new_pack.eoYYbC/_new 2006-10-06 17:24:19.000000000 +0200
@@ -1,5 +1,5 @@
#
-# spec file for package drbd (Version 0.7.21)
+# spec file for package drbd (Version 0.7.22)
#
# Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@@ -12,7 +12,7 @@
Name: drbd
BuildRequires: glib-devel kernel-source kernel-syms
Summary: Distributed Replicated Block Device
-Version: 0.7.21
+Version: 0.7.22
Release: 1
Source: %{name}-%{version}.tar.gz
# Source: drbd-SVN.tar.bz2
@@ -92,7 +92,7 @@
cat <<___ > $RPM_BUILD_ROOT/etc/drbd.conf
#
# please have a a look at the example configuration file in
-# %{_docdir}/drbd.conf
+# %{_docdir}/drbd/drbd.conf
#
___
mkdir -p $RPM_BUILD_ROOT/etc/modprobe.d/
@@ -139,6 +139,16 @@
%doc scripts/drbd.conf
%changelog -n drbd
+* Fri Oct 06 2006 - lmb@suse.de
+- Update to 0.7.22:
+- In protocol A and B, on connection loss, drbd could "forget" to set
+ certain areas out of sync.
+- fix races between failure in drbd_send_dblock and concurrently
+ running tl_clear.
+- fix potential access-afer-free in drbd_dio_end.
+- fix possible list corruption respective resulting deadlock in
+ receive_DataRequest.
+- improved the drbd_thread_stop / start code.
* Mon Aug 14 2006 - lmb@suse.de
- Update to 0.7.21.
* Fixed the "syncer stalled" after reconnect symptom.
++++++ drbd-0.7.21.tar.gz -> drbd-0.7.22.tar.gz ++++++
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/.filelist new/drbd-0.7.22/.filelist
--- old/drbd-0.7.21/.filelist 2006-08-10 14:19:54.000000000 +0200
+++ new/drbd-0.7.22/.filelist 2006-10-06 14:00:14.000000000 +0200
@@ -1,122 +1,122 @@
-drbd-0.7.21/upgrade_0.6.x_to_0.7.0.txt
-drbd-0.7.21/scripts/drbd.conf
-drbd-0.7.21/scripts/drbd.gentoo
-drbd-0.7.21/scripts/drbddisk
-drbd-0.7.21/scripts/adjust_drbd_config_h.sh
-drbd-0.7.21/scripts/drbd
-drbd-0.7.21/scripts/Makefile
-drbd-0.7.21/scripts/patch-kernel
-drbd-0.7.21/scripts/README
-drbd-0.7.21/ChangeLog
-drbd-0.7.21/benchmark/dm.c
-drbd-0.7.21/benchmark/report_to_html.pl
-drbd-0.7.21/benchmark/Makefile
-drbd-0.7.21/benchmark/run.sh
-drbd-0.7.21/benchmark/README
-drbd-0.7.21/README
-drbd-0.7.21/INSTALL
-drbd-0.7.21/COPYING
-drbd-0.7.21/documentation/drbd.conf.sgml
-drbd-0.7.21/documentation/drbddisk.sgml
-drbd-0.7.21/documentation/drbd.sgml
-drbd-0.7.21/documentation/drbdsetup.sgml
-drbd-0.7.21/documentation/Makefile
-drbd-0.7.21/documentation/Makefile.lang
-drbd-0.7.21/documentation/drbdadm.sgml
-drbd-0.7.21/drbd.spec.in
-drbd-0.7.21/drbd/drbd_proc.c
-drbd-0.7.21/drbd/drbd_receiver.c
-drbd-0.7.21/drbd/Makefile-2.6
-drbd-0.7.21/drbd/Kconfig
-drbd-0.7.21/drbd/drbd_fs.c
-drbd-0.7.21/drbd/drbd_actlog.c
-drbd-0.7.21/drbd/drbd_worker.c
-drbd-0.7.21/drbd/drbd_compat_wrappers.h
-drbd-0.7.21/drbd/drbd_compat_types.h
-drbd-0.7.21/drbd/drbd_bitmap.c
-drbd-0.7.21/drbd/mempool-2.4.c
-drbd-0.7.21/drbd/mempool.h
-drbd-0.7.21/drbd/linux/drbd.h
-drbd-0.7.21/drbd/linux/drbd_config.h
-drbd-0.7.21/drbd/drbd_sizeof_sanity_check.c
-drbd-0.7.21/drbd/drbd_main.c
-drbd-0.7.21/drbd/drbd_req.c
-drbd-0.7.21/drbd/lru_cache.c
-drbd-0.7.21/drbd/hlist.h
-drbd-0.7.21/drbd/drbd_int.h
-drbd-0.7.21/drbd/lru_cache.h
-drbd-0.7.21/drbd/Makefile
-drbd-0.7.21/drbd/Makefile-2.4
-drbd-0.7.21/upgrade_0.7.0_to_0.7.1.txt
-drbd-0.7.21/Makefile
-drbd-0.7.21/testing/uml-2.6.gdbinit
-drbd-0.7.21/testing/ioctl_structs_sizes.c
-drbd-0.7.21/testing/compare.pl
-drbd-0.7.21/testing/test_al.pl
-drbd-0.7.21/testing/uml_profile-USER@HOST
-drbd-0.7.21/testing/access_and_verify.c
-drbd-0.7.21/testing/show_size.c
-drbd-0.7.21/testing/uml-2.4.gdbinit
-drbd-0.7.21/testing/Makefile
-drbd-0.7.21/testing/README
-drbd-0.7.21/testing/write_gc.pl
-drbd-0.7.21/testing/CTH/T-006.sh
-drbd-0.7.21/testing/CTH/LGE_CTH.pm
-drbd-0.7.21/testing/CTH/T-007.sh
-drbd-0.7.21/testing/CTH/functions.sh
-drbd-0.7.21/testing/CTH/uml-minna.conf
-drbd-0.7.21/testing/CTH/CTH_bash.sh
-drbd-0.7.21/testing/CTH/generic_test.pl
-drbd-0.7.21/testing/CTH/tiobench/BUGS
-drbd-0.7.21/testing/CTH/tiobench/tiotest.h
-drbd-0.7.21/testing/CTH/tiobench/tiobench-0.3.3.diff
-drbd-0.7.21/testing/CTH/tiobench/crc32.h
-drbd-0.7.21/testing/CTH/tiobench/TODO
-drbd-0.7.21/testing/CTH/tiobench/tiobench.pl
-drbd-0.7.21/testing/CTH/tiobench/COPYING
-drbd-0.7.21/testing/CTH/tiobench/tiosum.pl
-drbd-0.7.21/testing/CTH/tiobench/tiotest.c
-drbd-0.7.21/testing/CTH/tiobench/crc32.c
-drbd-0.7.21/testing/CTH/tiobench/README
-drbd-0.7.21/testing/CTH/tiobench/Makefile
-drbd-0.7.21/testing/CTH/chipdale.conf
-drbd-0.7.21/testing/CTH/README
-drbd-0.7.21/testing/CTH/CTH_bash.conf
-drbd-0.7.21/testing/CTH/LGE_CTH/FileSystem.pm
-drbd-0.7.21/testing/CTH/LGE_CTH/Node.pm
-drbd-0.7.21/testing/CTH/LGE_CTH/Resource.pm
-drbd-0.7.21/testing/CTH/LGE_CTH/Disk.pm
-drbd-0.7.21/testing/CTH/LGE_CTH/GenericTest.pm
-drbd-0.7.21/testing/CTH/LGE_CTH/Link.pm
-drbd-0.7.21/testing/CTH/LGE_CTH/CRM.pm
-drbd-0.7.21/testing/CTH/LGE_CTH/Component.pm
-drbd-0.7.21/testing/CTH/LGE_CTH/DRBD_Resource.pm
-drbd-0.7.21/testing/CTH/bloodymary.conf
-drbd-0.7.21/testing/CTH/wbtest/wbtest.c
-drbd-0.7.21/testing/CTH/wbtest/README
-drbd-0.7.21/testing/CTH/T-000.sh
-drbd-0.7.21/testing/CTH/T-001.sh
-drbd-0.7.21/testing/CTH/T-002.sh
-drbd-0.7.21/testing/CTH/CTH_bash.helpers
-drbd-0.7.21/testing/CTH/T-003.sh
-drbd-0.7.21/testing/CTH/T-004.sh
-drbd-0.7.21/testing/CTH/bloodymary.sh.conf
-drbd-0.7.21/testing/CTH/T-005.sh
-drbd-0.7.21/testing/read_gc.pl
-drbd-0.7.21/testing/uml-screen-debug
-drbd-0.7.21/user/drbdadm_parser.y
-drbd-0.7.21/user/drbdadm_main.c
-drbd-0.7.21/user/drbd_limits.h
-drbd-0.7.21/user/drbdadm.h
-drbd-0.7.21/user/drbdadm_scanner.fl
-drbd-0.7.21/user/drbdadm_adjust.c
-drbd-0.7.21/user/drbdsetup.c
-drbd-0.7.21/user/Makefile
-drbd-0.7.21/documentation/drbd.8
-drbd-0.7.21/documentation/drbd.conf.5
-drbd-0.7.21/documentation/drbdsetup.8
-drbd-0.7.21/documentation/drbdadm.8
-drbd-0.7.21/documentation/drbddisk.8
-drbd-0.7.21/drbd_config.h
-drbd-0.7.21/drbd/drbd_buildtag.c
-drbd-0.7.21/.filelist
+drbd-0.7.22/upgrade_0.6.x_to_0.7.0.txt
+drbd-0.7.22/ChangeLog
+drbd-0.7.22/scripts/drbd.conf
+drbd-0.7.22/scripts/drbd.gentoo
+drbd-0.7.22/scripts/drbddisk
+drbd-0.7.22/scripts/adjust_drbd_config_h.sh
+drbd-0.7.22/scripts/drbd
+drbd-0.7.22/scripts/Makefile
+drbd-0.7.22/scripts/patch-kernel
+drbd-0.7.22/scripts/README
+drbd-0.7.22/benchmark/dm.c
+drbd-0.7.22/benchmark/report_to_html.pl
+drbd-0.7.22/benchmark/Makefile
+drbd-0.7.22/benchmark/run.sh
+drbd-0.7.22/benchmark/README
+drbd-0.7.22/README
+drbd-0.7.22/INSTALL
+drbd-0.7.22/COPYING
+drbd-0.7.22/drbd.spec.in
+drbd-0.7.22/documentation/drbd.conf.sgml
+drbd-0.7.22/documentation/drbddisk.sgml
+drbd-0.7.22/documentation/drbd.sgml
+drbd-0.7.22/documentation/drbdsetup.sgml
+drbd-0.7.22/documentation/Makefile
+drbd-0.7.22/documentation/Makefile.lang
+drbd-0.7.22/documentation/drbdadm.sgml
+drbd-0.7.22/drbd/drbd_proc.c
+drbd-0.7.22/drbd/drbd_receiver.c
+drbd-0.7.22/drbd/Makefile-2.6
+drbd-0.7.22/drbd/Kconfig
+drbd-0.7.22/drbd/drbd_fs.c
+drbd-0.7.22/drbd/drbd_actlog.c
+drbd-0.7.22/drbd/drbd_worker.c
+drbd-0.7.22/drbd/drbd_compat_wrappers.h
+drbd-0.7.22/drbd/drbd_compat_types.h
+drbd-0.7.22/drbd/drbd_bitmap.c
+drbd-0.7.22/drbd/mempool-2.4.c
+drbd-0.7.22/drbd/mempool.h
+drbd-0.7.22/drbd/linux/drbd.h
+drbd-0.7.22/drbd/linux/drbd_config.h
+drbd-0.7.22/drbd/drbd_sizeof_sanity_check.c
+drbd-0.7.22/drbd/drbd_main.c
+drbd-0.7.22/drbd/drbd_req.c
+drbd-0.7.22/drbd/lru_cache.c
+drbd-0.7.22/drbd/hlist.h
+drbd-0.7.22/drbd/drbd_int.h
+drbd-0.7.22/drbd/lru_cache.h
+drbd-0.7.22/drbd/Makefile
+drbd-0.7.22/drbd/Makefile-2.4
+drbd-0.7.22/upgrade_0.7.0_to_0.7.1.txt
+drbd-0.7.22/testing/uml-2.6.gdbinit
+drbd-0.7.22/testing/ioctl_structs_sizes.c
+drbd-0.7.22/testing/compare.pl
+drbd-0.7.22/testing/test_al.pl
+drbd-0.7.22/testing/uml_profile-USER@HOST
+drbd-0.7.22/testing/access_and_verify.c
+drbd-0.7.22/testing/show_size.c
+drbd-0.7.22/testing/uml-2.4.gdbinit
+drbd-0.7.22/testing/Makefile
+drbd-0.7.22/testing/README
+drbd-0.7.22/testing/write_gc.pl
+drbd-0.7.22/testing/CTH/T-006.sh
+drbd-0.7.22/testing/CTH/LGE_CTH.pm
+drbd-0.7.22/testing/CTH/T-007.sh
+drbd-0.7.22/testing/CTH/functions.sh
+drbd-0.7.22/testing/CTH/uml-minna.conf
+drbd-0.7.22/testing/CTH/CTH_bash.sh
+drbd-0.7.22/testing/CTH/generic_test.pl
+drbd-0.7.22/testing/CTH/tiobench/BUGS
+drbd-0.7.22/testing/CTH/tiobench/tiotest.h
+drbd-0.7.22/testing/CTH/tiobench/tiobench-0.3.3.diff
+drbd-0.7.22/testing/CTH/tiobench/crc32.h
+drbd-0.7.22/testing/CTH/tiobench/TODO
+drbd-0.7.22/testing/CTH/tiobench/tiobench.pl
+drbd-0.7.22/testing/CTH/tiobench/COPYING
+drbd-0.7.22/testing/CTH/tiobench/tiosum.pl
+drbd-0.7.22/testing/CTH/tiobench/tiotest.c
+drbd-0.7.22/testing/CTH/tiobench/crc32.c
+drbd-0.7.22/testing/CTH/tiobench/README
+drbd-0.7.22/testing/CTH/tiobench/Makefile
+drbd-0.7.22/testing/CTH/chipdale.conf
+drbd-0.7.22/testing/CTH/README
+drbd-0.7.22/testing/CTH/CTH_bash.conf
+drbd-0.7.22/testing/CTH/LGE_CTH/FileSystem.pm
+drbd-0.7.22/testing/CTH/LGE_CTH/Node.pm
+drbd-0.7.22/testing/CTH/LGE_CTH/Resource.pm
+drbd-0.7.22/testing/CTH/LGE_CTH/Disk.pm
+drbd-0.7.22/testing/CTH/LGE_CTH/GenericTest.pm
+drbd-0.7.22/testing/CTH/LGE_CTH/Link.pm
+drbd-0.7.22/testing/CTH/LGE_CTH/CRM.pm
+drbd-0.7.22/testing/CTH/LGE_CTH/Component.pm
+drbd-0.7.22/testing/CTH/LGE_CTH/DRBD_Resource.pm
+drbd-0.7.22/testing/CTH/bloodymary.conf
+drbd-0.7.22/testing/CTH/wbtest/wbtest.c
+drbd-0.7.22/testing/CTH/wbtest/README
+drbd-0.7.22/testing/CTH/T-000.sh
+drbd-0.7.22/testing/CTH/T-001.sh
+drbd-0.7.22/testing/CTH/T-002.sh
+drbd-0.7.22/testing/CTH/CTH_bash.helpers
+drbd-0.7.22/testing/CTH/T-003.sh
+drbd-0.7.22/testing/CTH/T-004.sh
+drbd-0.7.22/testing/CTH/bloodymary.sh.conf
+drbd-0.7.22/testing/CTH/T-005.sh
+drbd-0.7.22/testing/read_gc.pl
+drbd-0.7.22/testing/uml-screen-debug
+drbd-0.7.22/Makefile
+drbd-0.7.22/user/drbdadm_parser.y
+drbd-0.7.22/user/drbdadm_main.c
+drbd-0.7.22/user/drbd_limits.h
+drbd-0.7.22/user/drbdadm.h
+drbd-0.7.22/user/drbdadm_scanner.fl
+drbd-0.7.22/user/drbdadm_adjust.c
+drbd-0.7.22/user/drbdsetup.c
+drbd-0.7.22/user/Makefile
+drbd-0.7.22/documentation/drbd.8
+drbd-0.7.22/documentation/drbd.conf.5
+drbd-0.7.22/documentation/drbdsetup.8
+drbd-0.7.22/documentation/drbdadm.8
+drbd-0.7.22/documentation/drbddisk.8
+drbd-0.7.22/drbd_config.h
+drbd-0.7.22/drbd/drbd_buildtag.c
+drbd-0.7.22/.filelist
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/ChangeLog new/drbd-0.7.22/ChangeLog
--- old/drbd-0.7.21/ChangeLog 2006-08-10 13:45:32.000000000 +0200
+++ new/drbd-0.7.22/ChangeLog 2006-10-06 13:51:18.000000000 +0200
@@ -1,11 +1,26 @@
Latest:
------
- ChangeLog last updated: $LastChangedRevision: 2325 $
- $LastChangedDate: 2006-08-01 16:39:39 +0200 (Tue, 01 Aug 2006) $
+ ChangeLog last updated: $LastChangedRevision: 2505 $
+ $LastChangedDate: 2006-10-04 11:57:57 +0200 (Wed, 04 Oct 2006) $
Cumulative changes since last tarball.
For even more detail, use "svn log" and "svn diff".
+0.7.22 (api:79/proto:74)
+-----
+ * *** anyone using protocol A or B should upgrade! ***
+ while rewriting the request code for drbd8,
+ we noticed that in protocol A and B, on connection loss,
+ we could "forget" to set certain areas out of sync.
+ so resync in those protocol has been broken all along!
+ * fix races between failure in drbd_send_dblock
+ and concurrently running tl_clear
+ * fix potential access-afer-free in drbd_dio_end
+ * fix possible list corruption
+ respective resulting deadlock in receive_DataRequest
+ * improved the drbd_thread_stop / start code
+ * gracefull removal of devfs and other updates...
+
0.7.21 (api:79/proto:74)
-----
* Fixed the "syncer stalled" after reconnect symptom.
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/Makefile new/drbd-0.7.22/Makefile
--- old/drbd-0.7.21/Makefile 2006-03-27 17:40:08.000000000 +0200
+++ new/drbd-0.7.22/Makefile 2006-10-06 13:51:18.000000000 +0200
@@ -112,7 +112,7 @@
.filelist:
@ svn info >/dev/null || { echo "you need a svn checkout to do this." ; false ; }
@find $$(svn st -v | sed '/^?/d;s/^.\{8\} \+[0-9]\+ \+[0-9]\+ [a-z]\+ *//;$(if $(PRESERVE_DEBIAN),,/^debian/d)' ) \
- \! -type d -maxdepth 0 |\
+ -maxdepth 0 \! -type d |\
sed 's#^#drbd-$(DIST_VERSION)/#' > .filelist
@[ -s .filelist ] # assert there is something in .filelist now
@find documentation -name "[^.]*.[58]" -o -name "*.html" | \
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/documentation/drbd.8 new/drbd-0.7.22/documentation/drbd.8
--- old/drbd-0.7.21/documentation/drbd.8 2006-08-10 14:19:52.000000000 +0200
+++ new/drbd-0.7.22/documentation/drbd.8 2006-10-06 14:00:11.000000000 +0200
@@ -3,7 +3,7 @@
.\" http://shell.ipoline.com/~elmert/comp/docbook2X/
.\" Please send any bug reports, improvements, comments, patches,
.\" etc. to Steve Cheng .
-.TH "DRBD" "8" "10 August 2006" "" ""
+.TH "DRBD" "8" "06 October 2006" "" ""
.SH NAME
/etc/init.d/drbd \- The start and stop script for DRBD
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/documentation/drbd.conf.5 new/drbd-0.7.22/documentation/drbd.conf.5
--- old/drbd-0.7.21/documentation/drbd.conf.5 2006-08-10 14:19:51.000000000 +0200
+++ new/drbd-0.7.22/documentation/drbd.conf.5 2006-10-06 14:00:10.000000000 +0200
@@ -3,7 +3,7 @@
.\" http://shell.ipoline.com/~elmert/comp/docbook2X/
.\" Please send any bug reports, improvements, comments, patches,
.\" etc. to Steve Cheng .
-.TH "DRBD.CONF" "5" "10 August 2006" "" ""
+.TH "DRBD.CONF" "5" "06 October 2006" "" ""
.SH NAME
drbd.conf \- Configuration file for DRBD's devices
@@ -337,7 +337,9 @@
To ensure smooth operation of the application on top of DRBD,
it is possible to limit the bandwidth which may be used by
background synchronizations. The default is 250 KB/sec, the
-default unit is KB/sec. Optional suffixes K, M, G are allowed.
+default unit is KB/sec. Optional suffixes K, M are allowed.
+Note that this is \fBbyte\fR (octet) per second,
+not bit. We are storage guys.
.TP
\fBgroup \fInumber\fB\fR
Resynchronization of all devices in one group runs parallel.
@@ -357,7 +359,7 @@
to the meta-data device. A higher number of extents gives
longer resync times but less updates to the meta-data. The
default number of \fIextents\fR is
-127. (Minimum: 7, Maximum: 3843)
+127. (Minimum: 7, Maximum: 3833)
.SH "UPGRADE FROM DRBD VERSION 0.6.X"
.PP
\&...
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/documentation/drbd.conf.sgml new/drbd-0.7.22/documentation/drbd.conf.sgml
--- old/drbd-0.7.21/documentation/drbd.conf.sgml 2006-08-10 13:45:31.000000000 +0200
+++ new/drbd-0.7.22/documentation/drbd.conf.sgml 2006-10-06 13:51:18.000000000 +0200
@@ -500,7 +500,9 @@
To ensure smooth operation of the application on top of DRBD,
it is possible to limit the bandwidth which may be used by
background synchronizations. The default is 250 KB/sec, the
- default unit is KB/sec. Optional suffixes K, M, G are allowed.
+ default unit is KB/sec. Optional suffixes K, M are allowed.
+ Note that this is <emphasis>byte</emphasis> (octet) per second,
+ not bit. We are storage guys.
</para>
</listitem>
</varlistentry>
@@ -528,7 +530,7 @@
to the meta-data device. A higher number of extents gives
longer resync times but less updates to the meta-data. The
default number of <replaceable>extents</replaceable> is
- 127. (Minimum: 7, Maximum: 3843)
+ 127. (Minimum: 7, Maximum: 3833)
</para>
</listitem>
</varlistentry>
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/documentation/drbdadm.8 new/drbd-0.7.22/documentation/drbdadm.8
--- old/drbd-0.7.21/documentation/drbdadm.8 2006-08-10 14:19:53.000000000 +0200
+++ new/drbd-0.7.22/documentation/drbdadm.8 2006-10-06 14:00:12.000000000 +0200
@@ -3,7 +3,7 @@
.\" http://shell.ipoline.com/~elmert/comp/docbook2X/
.\" Please send any bug reports, improvements, comments, patches,
.\" etc. to Steve Cheng .
-.TH "DRBDADM" "8" "10 August 2006" "" ""
+.TH "DRBDADM" "8" "06 October 2006" "" ""
.SH NAME
drbdadm \- Administration tool for DRBD
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/documentation/drbddisk.8 new/drbd-0.7.22/documentation/drbddisk.8
--- old/drbd-0.7.21/documentation/drbddisk.8 2006-08-10 14:19:54.000000000 +0200
+++ new/drbd-0.7.22/documentation/drbddisk.8 2006-10-06 14:00:13.000000000 +0200
@@ -3,7 +3,7 @@
.\" http://shell.ipoline.com/~elmert/comp/docbook2X/
.\" Please send any bug reports, improvements, comments, patches,
.\" etc. to Steve Cheng .
-.TH "DRBDDISK" "8" "10 August 2006" "" ""
+.TH "DRBDDISK" "8" "06 October 2006" "" ""
.SH NAME
/etc/ha.d/resource.d/drbddisk \- Script to mark devices as primary and mount filesystems
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/documentation/drbdsetup.8 new/drbd-0.7.22/documentation/drbdsetup.8
--- old/drbd-0.7.21/documentation/drbdsetup.8 2006-08-10 14:19:50.000000000 +0200
+++ new/drbd-0.7.22/documentation/drbdsetup.8 2006-10-06 14:00:09.000000000 +0200
@@ -3,7 +3,7 @@
.\" http://shell.ipoline.com/~elmert/comp/docbook2X/
.\" Please send any bug reports, improvements, comments, patches,
.\" etc. to Steve Cheng .
-.TH "DRBDSETUP" "8" "10 August 2006" "" ""
+.TH "DRBDSETUP" "8" "06 October 2006" "" ""
.SH NAME
drbdsetup \- Setup tool for DRBD
@@ -196,7 +196,9 @@
To ensure smooth operation of the application on top of DRBD,
it is possible to limit the bandwidth which may be used by
background synchronizations. The default is 250 KB/sec, the
-default unit is KB/sec.
+default unit is KB/sec.
+Note that this is \fBbyte\fR (octet) per second,
+not bit. We are storage guys.
.TP
\fB-k, --skip-sync \fR
This option suppresses the automatic start of the resynchronization
@@ -221,7 +223,7 @@
to the meta-data device. A higher number of extents gives
longer resync times but less updates to the meta-data. The
default number of \fIextents\fR is
-127. (Minimum: 7, Maximum: 3843)
+127. (Minimum: 7, Maximum: 3833)
.SS "PRIMARY"
.PP
Sets the \fIdevice\fR into primary state, this
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/documentation/drbdsetup.sgml new/drbd-0.7.22/documentation/drbdsetup.sgml
--- old/drbd-0.7.21/documentation/drbdsetup.sgml 2006-08-10 13:45:31.000000000 +0200
+++ new/drbd-0.7.22/documentation/drbdsetup.sgml 2006-10-06 13:51:18.000000000 +0200
@@ -358,7 +358,9 @@
To ensure smooth operation of the application on top of DRBD,
it is possible to limit the bandwidth which may be used by
background synchronizations. The default is 250 KB/sec, the
- default unit is KB/sec.
+ default unit is KB/sec.
+ Note that this is <emphasis>byte</emphasis> (octet) per second,
+ not bit. We are storage guys.
</para>
</listitem>
</varlistentry>
@@ -399,7 +401,7 @@
to the meta-data device. A higher number of extents gives
longer resync times but less updates to the meta-data. The
default number of <replaceable>extents</replaceable> is
- 127. (Minimum: 7, Maximum: 3843)
+ 127. (Minimum: 7, Maximum: 3833)
</para>
</listitem>
</varlistentry>
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/drbd/drbd_bitmap.c new/drbd-0.7.22/drbd/drbd_bitmap.c
--- old/drbd-0.7.21/drbd/drbd_bitmap.c 2006-08-10 13:45:32.000000000 +0200
+++ new/drbd-0.7.22/drbd/drbd_bitmap.c 2006-10-06 13:51:18.000000000 +0200
@@ -813,6 +813,7 @@
int drbd_bm_set_bit(drbd_dev *mdev, const unsigned long bitnr)
{
struct drbd_bitmap *b = mdev->bitmap;
+ unsigned long flags;
int i;
ERR_IF(!b) return 1;
ERR_IF(!b->bm) return 1;
@@ -828,7 +829,7 @@
ERR("%s in drbd_bm_set_bit\n", cstate_to_name(mdev->cstate));
*/
- spin_lock_irq(&b->bm_lock);
+ spin_lock_irqsave(&b->bm_lock,flags);
BM_PARANOIA_CHECK();
MUST_NOT_BE_LOCKED();
ERR_IF (bitnr >= b->bm_bits) {
@@ -838,7 +839,7 @@
i = (0 != __test_and_set_bit(bitnr, b->bm));
b->bm_set += !i;
}
- spin_unlock_irq(&b->bm_lock);
+ spin_unlock_irqrestore(&b->bm_lock,flags);
return i;
}
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/drbd/drbd_buildtag.c new/drbd-0.7.22/drbd/drbd_buildtag.c
--- old/drbd-0.7.21/drbd/drbd_buildtag.c 2006-08-14 21:39:12.000000000 +0200
+++ new/drbd-0.7.22/drbd/drbd_buildtag.c 2006-10-06 14:00:14.000000000 +0200
@@ -1,6 +1,6 @@
/* automatically generated. DO NOT EDIT. */
const char * drbd_buildtag(void)
{
- return "SVN Revision: 2341M"
- " build by lmb@dale, 2006-08-14 21:39:12";
+ return "SVN Revision: 2515"
+ " build by lmb@dale, 2006-10-06 14:00:14";
}
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/drbd/drbd_compat_wrappers.h new/drbd-0.7.22/drbd/drbd_compat_wrappers.h
--- old/drbd-0.7.21/drbd/drbd_compat_wrappers.h 2005-08-31 10:23:41.000000000 +0200
+++ new/drbd-0.7.22/drbd/drbd_compat_wrappers.h 2006-10-06 13:51:18.000000000 +0200
@@ -83,16 +83,6 @@
return (drbd_dev*) req->private_bio.b_private;
}
-static inline sector_t drbd_req_get_sector(struct drbd_request *req)
-{
- return req->private_bio.b_blocknr;
-}
-
-static inline unsigned short drbd_req_get_size(struct drbd_request *req)
-{
- return req->private_bio.b_size;
-}
-
static inline drbd_bio_t* drbd_req_private_bio(struct drbd_request *req)
{
return &req->private_bio;
@@ -233,6 +223,8 @@
|(1 << BH_Mapped) ;
req->rq_status = RQ_DRBD_NOTHING;
+ req->sector = req->private_bio.b_blocknr;
+ req->size = req->private_bio.b_size;
}
static inline void
@@ -258,6 +250,8 @@
|(1 << BH_Mapped) ;
req->rq_status = RQ_DRBD_NOTHING;
+ req->sector = req->private_bio.b_blocknr;
+ req->size = req->private_bio.b_size;
}
static inline struct page* drbd_bio_get_page(struct buffer_head *bh)
@@ -397,18 +391,6 @@
return (drbd_dev*) req->mdev;
}
-static inline sector_t drbd_req_get_sector(struct drbd_request *req)
-{
- return req->master_bio->bi_sector;
-}
-
-static inline unsigned short drbd_req_get_size(struct drbd_request *req)
-{
- drbd_dev* mdev = req->mdev;
- D_ASSERT(req->master_bio->bi_size);
- return req->master_bio->bi_size;
-}
-
static inline drbd_bio_t* drbd_req_private_bio(struct drbd_request *req)
{
return req->private_bio;
@@ -553,6 +535,8 @@
req->rq_status = RQ_DRBD_NOTHING;
req->mdev = mdev;
+ req->sector = req->master_bio->bi_sector;
+ req->size = req->master_bio->bi_size;
}
static inline void
@@ -568,6 +552,8 @@
req->rq_status = RQ_DRBD_NOTHING;
req->mdev = mdev;
+ req->sector = req->master_bio->bi_sector;
+ req->size = req->master_bio->bi_size;
}
static inline struct page* drbd_bio_get_page(struct bio *bio)
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/drbd/drbd_int.h new/drbd-0.7.22/drbd/drbd_int.h
--- old/drbd-0.7.21/drbd/drbd_int.h 2006-08-14 21:35:25.000000000 +0200
+++ new/drbd-0.7.22/drbd/drbd_int.h 2006-10-06 13:51:18.000000000 +0200
@@ -57,6 +57,11 @@
last->next = at;
at->prev = last;
}
+static inline void list_splice(struct list_head *list, struct list_head *head)
+{
+ if (!list_empty(list))
+ __list_splice(list, head);
+}
static inline void list_splice_init(struct list_head *list,
struct list_head *head)
{
@@ -73,7 +78,7 @@
extern int major_nr;
extern int use_nbd_major;
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
+#ifndef NO_MORE_DEV_FS
// use_nbd_major ? "nbd" : "drbd";
extern char* drbd_devfs_name;
#endif
@@ -214,11 +219,11 @@
#ifdef DBG_ASSERTS
extern void drbd_assert_breakpoint(drbd_dev*, char *, char *, int );
-# define D_ASSERT(exp) if (!(exp)) \
- drbd_assert_breakpoint(mdev,#exp,__FILE__,__LINE__)
+# define D_ASSERT(exp) do { if (!(exp)) \
+ drbd_assert_breakpoint(mdev,#exp,__FILE__,__LINE__); } while (0)
#else
-# define D_ASSERT(exp) if (!(exp)) \
- ERR("ASSERT( " #exp " ) in %s:%d\n", __FILE__,__LINE__)
+# define D_ASSERT(exp) do { if (!(exp)) \
+ ERR("ASSERT( " #exp " ) in %s:%d\n", __FILE__,__LINE__); } while (0)
#endif
#define ERR_IF(exp) if (({ \
int _b = (exp)!=0; \
@@ -613,6 +618,8 @@
int rq_status;
struct drbd_barrier *barrier; // The next barrier.
drbd_bio_t *master_bio; // master bio pointer
+ unsigned int size;
+ sector_t sector;
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
drbd_bio_t private_bio; // private bio struct
#else
@@ -766,7 +773,6 @@
atomic_t unacked_cnt; // Need to send replys for
atomic_t local_cnt; // Waiting for local disk to signal completion
spinlock_t req_lock;
- spinlock_t tl_lock;
struct drbd_barrier* newest_barrier;
struct drbd_barrier* oldest_barrier;
unsigned long flags;
@@ -826,7 +832,7 @@
extern void tl_release(drbd_dev *mdev,unsigned int barrier_nr,
unsigned int set_size);
extern void tl_clear(drbd_dev *mdev);
-extern int tl_dependence(drbd_dev *mdev, drbd_request_t * item);
+extern int tl_dependence(drbd_dev *mdev, drbd_request_t * item, int free_it);
extern void drbd_free_sock(drbd_dev *mdev);
extern int drbd_send(drbd_dev *mdev, struct socket *sock,
void* buf, size_t size, unsigned msg_flags);
@@ -1020,8 +1026,8 @@
extern mempool_t *drbd_request_mempool;
// drbd_req
-#define ERF_NOTLD 2 /* do not call tl_dependence */
-extern void drbd_end_req(drbd_request_t *, int, int, sector_t);
+extern void _drbd_end_req(drbd_request_t *, int, int);
+extern void drbd_end_req(drbd_request_t *, int, int);
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
extern int drbd_make_request_24(request_queue_t *q, int rw, struct buffer_head *bio);
#else
@@ -1318,76 +1324,36 @@
__func__ , __LINE__ , \
atomic_read(&mdev->which))
-#define dec_ap_pending(mdev) \
+#define dec_ap_pending(mdev) do { \
typecheck(drbd_dev*,mdev); \
if(atomic_dec_and_test(&mdev->ap_pending_cnt)) \
wake_up(&mdev->cstate_wait); \
- ERR_IF_CNT_IS_NEGATIVE(ap_pending_cnt)
+ ERR_IF_CNT_IS_NEGATIVE(ap_pending_cnt); } while (0)
static inline void inc_rs_pending(drbd_dev* mdev)
{
atomic_inc(&mdev->rs_pending_cnt);
}
-#define dec_rs_pending(mdev) \
+#define dec_rs_pending(mdev) do { \
typecheck(drbd_dev*,mdev); \
atomic_dec(&mdev->rs_pending_cnt); \
- ERR_IF_CNT_IS_NEGATIVE(rs_pending_cnt)
+ ERR_IF_CNT_IS_NEGATIVE(rs_pending_cnt); } while (0)
static inline void inc_unacked(drbd_dev* mdev)
{
atomic_inc(&mdev->unacked_cnt);
}
-#if 0 && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-/*
- * idea was to forcefully push the tcp stack whenever the
- * currently last pending packet is in the buffer.
- * should be benchmarked on some real box to see if it has any
- * effect on overall latency.
- */
-
-/* this only works with 2.6 kernels because of some conflicting defines
- * in header files included from net.tcp.h.
- */
-
-#include
-static inline void drbd_push_msock(drbd_dev* mdev)
-{
- struct sock *sk;
- struct tcp_opt *tp;
- if (mdev->meta.socket == NULL) return;
- sk = mdev->meta.socket->sk;
- tp = tcp_sk(sk);
- lock_sock(sk);
- __tcp_push_pending_frames(sk, tp, tcp_current_mss(sk, 1), TCP_NAGLE_PUSH);
- release_sock(sk);
-}
-
-#define dec_unacked(mdev) \
- might_sleep(); \
- typecheck(drbd_dev*,mdev); \
- if (atomic_dec_and_test(&mdev->unacked_cnt)) \
- drbd_push_msock(mdev); \
- ERR_IF_CNT_IS_NEGATIVE(unacked_cnt);
-
-#define sub_unacked(mdev, n) \
- might_sleep(); \
- typecheck(drbd_dev*,mdev); \
- if (atomic_sub_and_test(n, &mdev->unacked_cnt)) \
- drbd_push_msock(mdev); \
- ERR_IF_CNT_IS_NEGATIVE(unacked_cnt);
-#else
-#define dec_unacked(mdev) \
+#define dec_unacked(mdev) do { \
typecheck(drbd_dev*,mdev); \
atomic_dec(&mdev->unacked_cnt); \
- ERR_IF_CNT_IS_NEGATIVE(unacked_cnt)
+ ERR_IF_CNT_IS_NEGATIVE(unacked_cnt); } while (0)
-#define sub_unacked(mdev, n) \
+#define sub_unacked(mdev, n) do { \
typecheck(drbd_dev*,mdev); \
atomic_sub(n, &mdev->unacked_cnt); \
- ERR_IF_CNT_IS_NEGATIVE(unacked_cnt)
-#endif
+ ERR_IF_CNT_IS_NEGATIVE(unacked_cnt); } while (0)
/**
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/drbd/drbd_main.c new/drbd-0.7.22/drbd/drbd_main.c
--- old/drbd-0.7.21/drbd/drbd_main.c 2006-08-14 21:38:09.000000000 +0200
+++ new/drbd-0.7.22/drbd/drbd_main.c 2006-10-06 13:51:18.000000000 +0200
@@ -49,7 +49,7 @@
#include
#endif
#include
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
+#ifndef NO_MORE_DEV_FS
#include
#endif
@@ -146,7 +146,7 @@
#endif
int disable_bd_claim = 0;
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
+#ifndef NO_MORE_DEV_FS
// devfs name
char* drbd_devfs_name = "drbd";
#endif
@@ -208,7 +208,7 @@
{
struct drbd_barrier *b;
- spin_lock_irq(&mdev->tl_lock);
+ spin_lock_irq(&mdev->req_lock);
b=mdev->newest_barrier;
@@ -220,22 +220,7 @@
set_bit(ISSUE_BARRIER,&mdev->flags);
}
- spin_unlock_irq(&mdev->tl_lock);
-}
-
-STATIC void tl_cancel(drbd_dev *mdev, drbd_request_t * item)
-{
- struct drbd_barrier *b;
-
- spin_lock_irq(&mdev->tl_lock);
-
- b=item->barrier;
- b->n_req--;
-
- list_del(&item->w.list);
- item->rq_status &= ~RQ_DRBD_IN_TL;
-
- spin_unlock_irq(&mdev->tl_lock);
+ spin_unlock_irq(&mdev->req_lock);
}
STATIC unsigned int tl_add_barrier(drbd_dev *mdev)
@@ -256,13 +241,13 @@
b->br_number=barrier_nr_issue;
b->n_req=0;
- spin_lock_irq(&mdev->tl_lock);
+ spin_lock_irq(&mdev->req_lock);
bnr = mdev->newest_barrier->br_number;
mdev->newest_barrier->next = b;
mdev->newest_barrier = b;
- spin_unlock_irq(&mdev->tl_lock);
+ spin_unlock_irq(&mdev->req_lock);
return bnr;
}
@@ -271,48 +256,36 @@
unsigned int set_size)
{
struct drbd_barrier *b;
+ struct list_head *le,*tle;
+ drbd_request_t *req;
- spin_lock_irq(&mdev->tl_lock);
+ spin_lock_irq(&mdev->req_lock);
b = mdev->oldest_barrier;
mdev->oldest_barrier = b->next;
- list_del(&b->requests);
- /* There could be requests on the list waiting for completion
- of the write to the local disk, to avoid corruptions of
- slab's data structures we have to remove the lists head */
-
- spin_unlock_irq(&mdev->tl_lock);
+ list_for_each_safe(le,tle,&b->requests) {
+ req = list_entry(le, struct drbd_request,w.list);
+ /* master_bio already completed, but protocol != C,
+ * so we had it still in the tl. need to list_del
+ * anyways, there may be local io pending! */
+ list_del(&req->w.list);
+ req->rq_status &= ~RQ_DRBD_IN_TL;
+ if( (req->rq_status & RQ_DRBD_DONE) == RQ_DRBD_DONE ) {
+ D_ASSERT(req->master_bio == NULL);
+ INVALIDATE_MAGIC(req);
+ mempool_free(req,drbd_request_mempool);
+ }
+ }
+ spin_unlock_irq(&mdev->req_lock);
D_ASSERT(b->br_number == barrier_nr);
D_ASSERT(b->n_req == set_size);
+ list_del(&b->requests);
kfree(b);
}
-/* tl_dependence reports if this sector was present in the current
- epoch.
- As side effect it clears also the pointer to the request if it
- was present in the transfert log. (Since tl_dependence indicates
- that IO is complete and that drbd_end_req() should not be called
- in case tl_clear has to be called due to interruption of the
- communication)
-*/
-/* bool */
-int tl_dependence(drbd_dev *mdev, drbd_request_t * item)
-{
- unsigned long flags;
- int r=TRUE;
-
- spin_lock_irqsave(&mdev->tl_lock,flags);
-
- r = ( item->barrier == mdev->newest_barrier );
- list_del(&item->w.list);
-
- spin_unlock_irqrestore(&mdev->tl_lock,flags);
- return r;
-}
-
void tl_clear(drbd_dev *mdev)
{
struct list_head *le,*tle;
@@ -334,32 +307,31 @@
new_first->br_number=4711;
new_first->n_req=0;
- spin_lock_irq(&mdev->tl_lock);
+ spin_lock_irq(&mdev->req_lock);
b=mdev->oldest_barrier;
mdev->oldest_barrier = new_first;
mdev->newest_barrier = new_first;
- spin_unlock_irq(&mdev->tl_lock);
-
inc_ap_pending(mdev); // Since we count the old first as well...
-
while ( b ) {
list_for_each_safe(le, tle, &b->requests) {
r = list_entry(le, struct drbd_request,w.list);
- // bi_size and bi_sector are modified in bio_endio!
- sector = drbd_req_get_sector(r);
- size = drbd_req_get_size(r);
+ // r may be freed within drbd_end_req
+ sector = r->sector;
+ size = r->size;
+
+ r->rq_status &= ~RQ_DRBD_IN_TL;
+ list_del(&r->w.list);
+
if( !(r->rq_status & RQ_DRBD_SENT) ) {
- if(mdev->conf.wire_protocol != DRBD_PROT_A )
- dec_ap_pending(mdev);
- drbd_end_req(r,RQ_DRBD_SENT,ERF_NOTLD|1, sector);
- goto mark;
- }
- if(mdev->conf.wire_protocol != DRBD_PROT_C ) {
- mark:
- drbd_set_out_of_sync(mdev, sector, size);
- }
+ _drbd_end_req(r,RQ_DRBD_SENT,1);
+ } else if ((r->rq_status & RQ_DRBD_DONE) == RQ_DRBD_DONE) {
+ D_ASSERT(r->master_bio == NULL);
+ INVALIDATE_MAGIC(r);
+ mempool_free(r,drbd_request_mempool);
+ } /* else: local io still pending */
+ drbd_set_out_of_sync(mdev, sector, size);
}
f=b;
b=b->next;
@@ -367,6 +339,7 @@
kfree(f);
dec_ap_pending(mdev); // for the barrier
}
+ spin_unlock_irq(&mdev->req_lock);
}
/**
@@ -519,7 +492,6 @@
thi->t_lock = SPIN_LOCK_UNLOCKED;
thi->task = NULL;
thi->t_state = None;
- init_completion(&thi->startstop);
thi->function = func;
thi->mdev = mdev;
@@ -540,6 +512,7 @@
thi->t_state); */
if (thi->t_state == None) {
+ init_completion(&thi->startstop);
D_ASSERT(thi->task == NULL);
thi->t_state = Running;
spin_unlock(&thi->t_lock);
@@ -565,10 +538,15 @@
spin_lock(&thi->t_lock);
- /* INFO("%s [%d]: %s %d -> %d; %d\n",
+ /*
+ INFO("%s [%d]: %s[%s] %d -> %d; wait:%d; x->done:%d\n",
current->comm, current->pid,
- thi->task ? thi->task->comm : "NULL", thi->t_state, ns, wait); */
-
+ thi == &mdev->worker ? "worker" :
+ thi == &mdev->asender ? "asender" :
+ thi == &mdev->receiver ? "receiver" : "???",
+ thi->task ? thi->task->comm : "NULL", thi->t_state, ns, wait,
+ thi->startstop.done);
+ */
if (thi->t_state == None) {
spin_unlock(&thi->t_lock);
@@ -589,10 +567,10 @@
thi->t_state = ns;
smp_mb();
- if (thi->task != current)
+ if (thi->task != current) {
+ if(wait) init_completion(&thi->startstop);
force_sig(DRBD_SIGKILL,thi->task);
- else
- D_ASSERT(!wait);
+ } else D_ASSERT(!wait);
}
spin_unlock(&thi->t_lock);
@@ -816,14 +794,12 @@
int ok;
Drbd_Barrier_Packet p;
- /* printk(KERN_DEBUG DEVICE_NAME": issuing a barrier\n"); */
/* tl_add_barrier() must be called with the sock_mutex aquired */
p.barrier=tl_add_barrier(mdev);
inc_ap_pending(mdev);
ok = _drbd_send_cmd(mdev,mdev->data.socket,Barrier,(Drbd_Header*)&p,sizeof(p),0);
-// if (!ok) dec_ap_pending(mdev); // is done in tl_clear()
return ok;
}
@@ -1042,10 +1018,9 @@
p.head.magic = BE_DRBD_MAGIC;
p.head.command = cpu_to_be16(Data);
- p.head.length = cpu_to_be16( sizeof(p)-sizeof(Drbd_Header)
- + drbd_req_get_size(req) );
+ p.head.length = cpu_to_be16(sizeof(p)-sizeof(Drbd_Header)+req->size);
- p.sector = cpu_to_be64(drbd_req_get_sector(req));
+ p.sector = cpu_to_be64(req->sector);
p.block_id = (unsigned long)req;
/* About tl_add():
@@ -1057,8 +1032,7 @@
tl_ datastructure (=> We would want to remove it before it
is there!)
3. Q: Why can we add it to tl_ even when drbd_send() might fail ?
- There could be a tl_cancel() to remove it within the semaphore!
- A: If drbd_send fails, we will loose the connection. Then
+ A: If drbd_send fails, we will lose the connection. Then
tl_cear() will simulate a RQ_DRBD_SEND and set it out of sync
for everything in the data structure.
*/
@@ -1072,37 +1046,53 @@
old_blocked = drbd_block_all_signals();
down(&mdev->data.mutex);
+
+ /* drbd_disconnect may have freed that socket while we were waiting
+ * in down(). we have to check that, to avoid a race with tl_clear
+ * cleaning up before we can tl_add */
+ if (unlikely(!mdev->data.socket)) {
+ /* this req is not in the tl, tl_clear cannot find it.
+ * we cannot just tl_add it here, either, because tl_clear
+ * might be done already. so we have to mark this request
+ * "SENT" here, otherwise it won't ever complete.
+ * FIXME won't work for freeze io.
+ * FIXME if we are Diskless, we complete a WRITE
+ * as successful here, that has never been written! */
+ drbd_set_out_of_sync(mdev, req->sector, req->size);
+ drbd_end_req(req,RQ_DRBD_SENT,1);
+ goto out;
+ }
+
spin_lock(&mdev->send_task_lock);
mdev->send_task=current;
spin_unlock(&mdev->send_task_lock);
if(test_and_clear_bit(ISSUE_BARRIER,&mdev->flags))
ok = _drbd_send_barrier(mdev);
+
+ /* unconditional tl_add! */
+ tl_add(mdev,req);
if(ok) {
- tl_add(mdev,req);
dump_packet(mdev,mdev->data.socket,0,(void*)&p, __FILE__, __LINE__);
set_bit(UNPLUG_REMOTE,&mdev->flags);
ok = sizeof(p) == drbd_send(mdev,mdev->data.socket,&p,sizeof(p),MSG_MORE);
if(ok) {
if(mdev->conf.wire_protocol == DRBD_PROT_A) {
ok = _drbd_send_bio(mdev,drbd_req_private_bio(req));
+ /* drbd_end_req has to be within the data.mutex,
+ * which protects us from a concurrently running tl_clear */
+ if (ok) drbd_end_req(req,RQ_DRBD_SENT,1);
} else {
ok = _drbd_send_zc_bio(mdev,drbd_req_private_bio(req));
}
}
- if(!ok) tl_cancel(mdev,req);
- }
- if (!ok) {
- drbd_set_out_of_sync(mdev,
- drbd_req_get_sector(req),
- drbd_req_get_size(req));
- drbd_end_req(req,RQ_DRBD_SENT,ERF_NOTLD|1,
- drbd_req_get_sector(req));
}
+ /* if (!ok) ... cleanup done in tl_clear */
spin_lock(&mdev->send_task_lock);
mdev->send_task=NULL;
spin_unlock(&mdev->send_task_lock);
+ out:
up(&mdev->data.mutex);
restore_old_sigset(old_blocked);
return ok;
@@ -1378,7 +1368,6 @@
sema_init(&mdev->meta.work.s,0);
mdev->al_lock = SPIN_LOCK_UNLOCKED;
- mdev->tl_lock = SPIN_LOCK_UNLOCKED;
mdev->ee_lock = SPIN_LOCK_UNLOCKED;
mdev->req_lock = SPIN_LOCK_UNLOCKED;
mdev->pr_lock = SPIN_LOCK_UNLOCKED;
@@ -1698,7 +1687,7 @@
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
devfs_unregister(devfs_handle);
#else
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
+#ifndef NO_MORE_DEV_FS
devfs_remove(drbd_devfs_name);
#endif
#endif
@@ -1774,7 +1763,7 @@
return err;
}
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
+#ifndef NO_MORE_DEV_FS
drbd_devfs_name = (major_nr == NBD_MAJOR) ? "nbd" : "drbd";
#endif
@@ -1798,7 +1787,7 @@
if (unlikely(!drbd_blocksizes)) goto Enomem;
#else
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
+#ifndef NO_MORE_DEV_FS
devfs_mk_dir(drbd_devfs_name);
#endif
@@ -1823,7 +1812,7 @@
disk->first_minor = i;
disk->fops = &drbd_ops;
sprintf(disk->disk_name, DEVICE_NAME "%d", i);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
+#ifndef NO_MORE_DEV_FS
sprintf(disk->devfs_name, "%s/%d", drbd_devfs_name, i);
#endif
disk->private_data = mdev;
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/drbd/drbd_receiver.c new/drbd-0.7.22/drbd/drbd_receiver.c
--- old/drbd-0.7.21/drbd/drbd_receiver.c 2006-08-10 13:45:32.000000000 +0200
+++ new/drbd-0.7.22/drbd/drbd_receiver.c 2006-10-06 13:51:18.000000000 +0200
@@ -924,7 +924,7 @@
bio = req->master_bio;
- D_ASSERT( sector == drbd_req_get_sector(req) );
+ D_ASSERT( sector == req->sector );
rr=drbd_recv(mdev,drbd_bio_kmap(bio),data_size);
drbd_bio_kunmap(bio);
@@ -1203,7 +1203,6 @@
return FALSE;
}
e->block_id = p->block_id; // no meaning on this side, pr* on partner
- list_add(&e->w.list,&mdev->read_ee);
spin_unlock_irq(&mdev->ee_lock);
if(!inc_local(mdev) || (mdev->gen_cnt[Flags] & MDF_Consistent) == 0) {
@@ -1245,6 +1244,9 @@
mdev->read_cnt += size >> 9;
inc_unacked(mdev);
+ spin_lock_irq(&mdev->ee_lock);
+ list_add(&e->w.list,&mdev->read_ee);
+ spin_unlock_irq(&mdev->ee_lock);
drbd_generic_make_request(READ,&e->private_bio);
if (atomic_read(&mdev->local_cnt) >= (mdev->conf.max_epoch_size>>4) ) {
drbd_kick_lo(mdev);
@@ -2152,7 +2154,13 @@
ERR_IF (!VALID_POINTER(req)) return FALSE;
- drbd_end_req(req, RQ_DRBD_SENT, 1, sector);
+ spin_lock_irq(&mdev->req_lock);
+ if (mdev->conf.wire_protocol == DRBD_PROT_C) {
+ req->rq_status &= ~RQ_DRBD_IN_TL;
+ list_del(&req->w.list);
+ }
+ _drbd_end_req(req, RQ_DRBD_SENT, 1);
+ spin_unlock_irq(&mdev->req_lock);
if (test_bit(SYNC_STARTED,&mdev->flags) &&
mdev->conf.wire_protocol == DRBD_PROT_C)
@@ -2164,7 +2172,6 @@
dec_rs_pending(mdev);
} else {
D_ASSERT(mdev->conf.wire_protocol != DRBD_PROT_A);
- dec_ap_pending(mdev);
}
return TRUE;
}
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/drbd/drbd_req.c new/drbd-0.7.22/drbd/drbd_req.c
--- old/drbd-0.7.21/drbd/drbd_req.c 2006-08-10 13:45:32.000000000 +0200
+++ new/drbd-0.7.22/drbd/drbd_req.c 2006-10-06 13:51:18.000000000 +0200
@@ -32,88 +32,85 @@
#include
#include "drbd_int.h"
-void drbd_end_req(drbd_request_t *req, int nextstate, int er_flags,
- sector_t rsector)
+void _drbd_end_req(drbd_request_t *req, int nextstate, int er_flags)
{
- /* This callback will be called in irq context by the IDE drivers,
- and in Softirqs/Tasklets/BH context by the SCSI drivers.
- This function is called by the receiver in kernel-thread context.
- Try to get the locking right :) */
-
struct Drbd_Conf* mdev = drbd_req_get_mdev(req);
- unsigned long flags=0;
+ sector_t rsector = req->sector;
int uptodate;
- PARANOIA_BUG_ON(!IS_VALID_MDEV(mdev));
- PARANOIA_BUG_ON(drbd_req_get_sector(req) != rsector);
- spin_lock_irqsave(&mdev->req_lock,flags);
-
if(req->rq_status & nextstate) {
ERR("request state error(%d)\n", req->rq_status);
}
+ if (nextstate == RQ_DRBD_SENT) dec_ap_pending(mdev);
+
req->rq_status |= nextstate;
req->rq_status &= er_flags | ~0x0001;
- if( (req->rq_status & RQ_DRBD_DONE) == RQ_DRBD_DONE ) goto end_it;
-
- spin_unlock_irqrestore(&mdev->req_lock,flags);
-
- return;
-
-/* We only report uptodate == TRUE if both operations (WRITE && SEND)
- reported uptodate == TRUE
- */
+ if( (req->rq_status & RQ_DRBD_DONE) != RQ_DRBD_DONE )
+ return;
- end_it:
- spin_unlock_irqrestore(&mdev->req_lock,flags);
+ /* complete the master bio now. */
- if( req->rq_status & RQ_DRBD_IN_TL ) {
- if( ! ( er_flags & ERF_NOTLD ) ) {
- /*If this call is from tl_clear() we may not call
- tl_dependene, otherwhise we have a homegrown
- spinlock deadlock. */
- if(tl_dependence(mdev,req))
- set_bit(ISSUE_BARRIER,&mdev->flags);
- } else {
- list_del(&req->w.list); // we have the tl_lock...
- }
- }
+ /* if this sector was present in the current epoch, close it.
+ * FIXME compares reusable pointer addresses,
+ * possibly artificially reducing epoch size */
+ if (req->barrier == mdev->newest_barrier)
+ set_bit(ISSUE_BARRIER,&mdev->flags);
uptodate = req->rq_status & 0x0001;
if( !uptodate && mdev->on_io_error == Detach) {
- drbd_set_out_of_sync(mdev,rsector, drbd_req_get_size(req));
+ drbd_set_out_of_sync(mdev,rsector, req->size);
// It should also be as out of sync on
// the other side! See w_io_error()
drbd_bio_endio(req->master_bio,1);
+ req->master_bio = NULL;
dec_ap_bio(mdev);
// The assumption is that we wrote it on the peer.
// FIXME proto A and diskless :)
req->w.cb = w_io_error;
- drbd_queue_work(mdev,&mdev->data.work,&req->w);
+ _drbd_queue_work(&mdev->data.work,&req->w);
goto out;
}
drbd_bio_endio(req->master_bio,uptodate);
+ req->master_bio = NULL;
dec_ap_bio(mdev);
- INVALIDATE_MAGIC(req);
- mempool_free(req,drbd_request_mempool);
+ /* free the request,
+ * if it is not/no longer in the transfer log, because
+ * it was local only (not connected), or
+ * this is protocol C, or
+ * the corresponding barrier ack has been received already, or
+ * it has been cleared from the transfer log (after connection loss)
+ */
+ if (!(req->rq_status & RQ_DRBD_IN_TL)) {
+ INVALIDATE_MAGIC(req);
+ mempool_free(req,drbd_request_mempool);
+ }
out:
if (test_bit(ISSUE_BARRIER,&mdev->flags)) {
- spin_lock_irqsave(&mdev->req_lock,flags);
if(list_empty(&mdev->barrier_work.list)) {
_drbd_queue_work(&mdev->data.work,&mdev->barrier_work);
}
- spin_unlock_irqrestore(&mdev->req_lock,flags);
}
}
+void drbd_end_req(drbd_request_t *req, int nextstate, int er_flags)
+{
+ struct Drbd_Conf* mdev = drbd_req_get_mdev(req);
+ unsigned long flags=0;
+ spin_lock_irqsave(&mdev->req_lock,flags);
+ _drbd_end_req(req,nextstate,er_flags);
+ spin_unlock_irqrestore(&mdev->req_lock,flags);
+}
+
+
int drbd_read_remote(drbd_dev *mdev, drbd_request_t *req)
{
int rv;
@@ -331,11 +328,7 @@
if (!drbd_send_dblock(mdev,req)) {
if (mdev->cstate >= Connected)
set_cstate(mdev,NetworkFailure);
- dec_ap_pending(mdev);
drbd_thread_restart_nowait(&mdev->receiver);
- } else if(mdev->conf.wire_protocol == DRBD_PROT_A) {
- dec_ap_pending(mdev);
- drbd_end_req(req, RQ_DRBD_SENT, 1, sector);
}
} else {
// this node is diskless ...
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/drbd/drbd_worker.c new/drbd-0.7.22/drbd/drbd_worker.c
--- old/drbd-0.7.21/drbd/drbd_worker.c 2006-08-10 13:45:32.000000000 +0200
+++ new/drbd-0.7.22/drbd/drbd_worker.c 2006-10-06 13:51:18.000000000 +0200
@@ -139,6 +139,7 @@
{
struct Drbd_Conf* mdev;
drbd_request_t *req;
+ sector_t rsector;
mdev = bh->b_private;
PARANOIA_BUG_ON(!IS_VALID_MDEV(mdev));
@@ -147,8 +148,10 @@
PARANOIA_BUG_ON(!VALID_POINTER(req));
drbd_chk_io_error(mdev,!uptodate);
- drbd_end_req(req, RQ_DRBD_LOCAL, uptodate, drbd_req_get_sector(req));
- drbd_al_complete_io(mdev,drbd_req_get_sector(req));
+ // req may get freed within drbd_end_req
+ rsector = req->sector;
+ drbd_end_req(req, RQ_DRBD_LOCAL, uptodate, rsector);
+ drbd_al_complete_io(mdev,rsector);
dec_local(mdev);
}
@@ -284,9 +287,9 @@
return 1;
drbd_chk_io_error(mdev,error);
- rsector = drbd_req_get_sector(req);
- // the bi_sector of the bio gets modified somewhere in drbd_end_req()!
- drbd_end_req(req, RQ_DRBD_LOCAL, (error == 0), rsector);
+ // req may get freed within drbd_end_req
+ rsector = req->sector;
+ drbd_end_req(req, RQ_DRBD_LOCAL, (error == 0));
drbd_al_complete_io(mdev,rsector);
dec_local(mdev);
bio_put(bio);
@@ -934,7 +937,7 @@
sprintf(current->comm, "drbd%d_worker", (int)(mdev-drbd_conf));
- for (;;) {
+ while (get_t_state(thi) == Running) {
intr = down_interruptible(&mdev->data.work.s);
if (unlikely(drbd_did_panic == DRBD_MAGIC)) {
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/drbd/linux/drbd_config.h new/drbd-0.7.22/drbd/linux/drbd_config.h
--- old/drbd-0.7.21/drbd/linux/drbd_config.h 2006-08-10 13:45:31.000000000 +0200
+++ new/drbd-0.7.22/drbd/linux/drbd_config.h 2006-10-06 13:51:18.000000000 +0200
@@ -22,7 +22,7 @@
extern const char * drbd_buildtag(void);
-#define REL_VERSION "0.7.21"
+#define REL_VERSION "0.7.22"
#define API_VERSION 79
#define PRO_VERSION 74
@@ -69,4 +69,6 @@
// but more recent kernels define it in arch/um/include/mem.h
#define HAVE_UML_TO_VIRT
+#define NO_MORE_DEV_FS
+
#endif
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/drbd.spec.in new/drbd-0.7.22/drbd.spec.in
--- old/drbd-0.7.21/drbd.spec.in 2006-08-10 13:45:32.000000000 +0200
+++ new/drbd-0.7.22/drbd.spec.in 2006-10-06 13:51:18.000000000 +0200
@@ -190,6 +190,21 @@
/sbin/depmod -a -F /boot/System.map-%{kernelversion} %{kernelversion} >/dev/null 2>&1 || true
%changelog
+* Wed Oct 4 2006 11:55:01 +0200 Lars Ellenberg
+- drbd (0.7.22-1)
+ * *** anyone using protocol A or B should upgrade! ***
+ while rewriting the request code for drbd8,
+ we noticed that in protocol A and B, on connection loss,
+ we could "forget" to set certain areas out of sync.
+ so resync in those protocol has been broken all along!
+ * fix races between failure in drbd_send_dblock
+ and concurrently running tl_clear
+ * fix potential access-afer-free in drbd_dio_end
+ * fix possible list corruption
+ respective resulting deadlock in receive_DataRequest
+ * improved the drbd_thread_stop / start code
+ * gracefull removal of devfs and other updates...
+
* Tue Aug 1 2006 16:34:22 +0200 Philipp Reisner
- drbd (0.7.21-1)
* Fixed the "syncer stalled" after reconnect symptom.
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/scripts/adjust_drbd_config_h.sh new/drbd-0.7.22/scripts/adjust_drbd_config_h.sh
--- old/drbd-0.7.21/scripts/adjust_drbd_config_h.sh 2005-06-21 11:53:20.000000000 +0200
+++ new/drbd-0.7.22/scripts/adjust_drbd_config_h.sh 2006-10-06 13:51:17.000000000 +0200
@@ -80,6 +80,7 @@
else
have_mm_inline_h=0
fi
+ no_more_dev_fs=0
else
# 2.6. kernel. just leave it alone...
need_sighand_hack=0
@@ -87,6 +88,7 @@
need_RH_2_4_18_hack=0
have_find_next_bit=0
have_mm_inline_h=0
+ no_more_dev_fs=1
fi
test -e ./linux/drbd_config.h.orig || cp ./linux/drbd_config.h{,.orig}
@@ -101,7 +103,9 @@
s{.*(#define HAVE_FIND_NEXT_BIT.*)}
{ ( $have_find_next_bit ? '' : '//' ) . \$1}e;
s{.*(#define HAVE_MM_INLINE_H.*)}
- { ( $have_mm_inline_h ? '' : '//' ) . \$1}e;" \
+ { ( $have_mm_inline_h ? '' : '//' ) . \$1}e;
+ s{.*(#define NO_MORE_DEV_FS.*)}
+ { ( $no_more_dev_fs ? '' : '//' ) . \$1}e;" \
< ./linux/drbd_config.h \
> ./linux/drbd_config.h.new
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/scripts/drbd.conf new/drbd-0.7.22/scripts/drbd.conf
--- old/drbd-0.7.21/scripts/drbd.conf 2006-08-10 13:45:30.000000000 +0200
+++ new/drbd-0.7.22/scripts/drbd.conf 2006-10-06 13:51:17.000000000 +0200
@@ -206,7 +206,7 @@
syncer {
# Limit the bandwith used by the resynchronisation process.
- # default unit is kByte/sec; optional suffixes K,M,G are allowed.
+ # default unit is kByte/sec; optional suffixes K,M are allowed.
#
# Even though this is a network setting, the units are based
# on _byte_ (octet for our french friends) not bit.
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/drbd-0.7.21/user/drbdadm_main.c new/drbd-0.7.22/user/drbdadm_main.c
--- old/drbd-0.7.21/user/drbdadm_main.c 2006-08-10 13:45:32.000000000 +0200
+++ new/drbd-0.7.22/user/drbdadm_main.c 2006-10-06 13:51:18.000000000 +0200
@@ -1181,8 +1181,6 @@
" PRETENDING that I am >>%s<<\n\n",nodeinfo.nodename);
}
- if(argc == 1) print_usage_and_exit("missing arguments"); // arguments missing.
-
/* in case drbdadm is called with an absolut or relative pathname
* look for the drbdsetup binary in the same location,
* otherwise, just let execvp sort it out... */
@@ -1200,6 +1198,9 @@
}
argv[0] = progname;
}
+
+ if(argc == 1) print_usage_and_exit("missing arguments"); // arguments missing.
+
if (drbdsetup == NULL) {
fprintf(stderr,"could not strdup argv[0].\n");
exit(E_exec_error);
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
---------------------------------------------------------------------
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org