svn commit: r218680 - in projects/graid/7: . contrib/bsnmp/snmpd
contrib/wpa_supplicant gnu/usr.bin/groff/tmac
sbin/geom/class/raid share/misc sys/conf sys/geom/raid
sys/modules/geom/geom_raid tool...
Alexander Motin
mav at FreeBSD.org
Mon Feb 14 14:26:14 UTC 2011
Author: mav
Date: Mon Feb 14 14:26:14 2011
New Revision: 218680
URL: http://svn.freebsd.org/changeset/base/218680
Log:
MFH r218600, r218608, r218622, r218624, r218630, r218632, r218638,
r218649, r218651, r218653, r218669, r218674, r218678.
Added:
projects/graid/7/sys/geom/raid/tr_raid1e.c
- copied, changed from r218638, projects/graid/head/sys/geom/raid/tr_raid1e.c
Modified:
projects/graid/7/sbin/geom/class/raid/graid.8
projects/graid/7/sys/conf/files
projects/graid/7/sys/geom/raid/g_raid.c
projects/graid/7/sys/geom/raid/g_raid.h
projects/graid/7/sys/geom/raid/md_intel.c
projects/graid/7/sys/geom/raid/tr_raid0.c
projects/graid/7/sys/geom/raid/tr_raid1.c
projects/graid/7/sys/modules/geom/geom_raid/Makefile
Directory Properties:
projects/graid/7/ (props changed)
projects/graid/7/COPYRIGHT (props changed)
projects/graid/7/Makefile (props changed)
projects/graid/7/Makefile.inc1 (props changed)
projects/graid/7/ObsoleteFiles.inc (props changed)
projects/graid/7/UPDATING (props changed)
projects/graid/7/bin/ (props changed)
projects/graid/7/bin/chflags/ (props changed)
projects/graid/7/bin/chio/ (props changed)
projects/graid/7/bin/cp/ (props changed)
projects/graid/7/bin/csh/ (props changed)
projects/graid/7/bin/dd/ (props changed)
projects/graid/7/bin/df/ (props changed)
projects/graid/7/bin/echo/ (props changed)
projects/graid/7/bin/expr/ (props changed)
projects/graid/7/bin/kill/ (props changed)
projects/graid/7/bin/ln/ (props changed)
projects/graid/7/bin/ls/ (props changed)
projects/graid/7/bin/pax/ (props changed)
projects/graid/7/bin/ps/ (props changed)
projects/graid/7/bin/rm/ (props changed)
projects/graid/7/bin/sh/ (props changed)
projects/graid/7/bin/test/ (props changed)
projects/graid/7/cddl/contrib/opensolaris/ (props changed)
projects/graid/7/cddl/lib/libzpool/ (props changed)
projects/graid/7/contrib/bind9/ (props changed)
projects/graid/7/contrib/binutils/ (props changed)
projects/graid/7/contrib/bsnmp/ (props changed)
projects/graid/7/contrib/bsnmp/snmpd/bsnmpd.1 (props changed)
projects/graid/7/contrib/cpio/ (props changed)
projects/graid/7/contrib/csup/ (props changed)
projects/graid/7/contrib/expat/ (props changed)
projects/graid/7/contrib/gcc/ (props changed)
projects/graid/7/contrib/gdb/ (props changed)
projects/graid/7/contrib/gdtoa/ (props changed)
projects/graid/7/contrib/groff/ (props changed)
projects/graid/7/contrib/ipfilter/ (props changed)
projects/graid/7/contrib/less/ (props changed)
projects/graid/7/contrib/libpcap/ (props changed)
projects/graid/7/contrib/ncurses/ (props changed)
projects/graid/7/contrib/netcat/ (props changed)
projects/graid/7/contrib/ntp/ (props changed)
projects/graid/7/contrib/nvi/ (props changed)
projects/graid/7/contrib/pf/ (props changed)
projects/graid/7/contrib/sendmail/ (props changed)
projects/graid/7/contrib/smbfs/ (props changed)
projects/graid/7/contrib/tcp_wrappers/ (props changed)
projects/graid/7/contrib/tcsh/ (props changed)
projects/graid/7/contrib/telnet/ (props changed)
projects/graid/7/contrib/top/ (props changed)
projects/graid/7/contrib/traceroute/ (props changed)
projects/graid/7/contrib/wpa_supplicant/ (props changed)
projects/graid/7/contrib/wpa_supplicant/wpa_supplicant.conf (props changed)
projects/graid/7/crypto/openssh/ (props changed)
projects/graid/7/crypto/openssl/ (props changed)
projects/graid/7/etc/ (props changed)
projects/graid/7/games/factor/ (props changed)
projects/graid/7/games/fortune/ (props changed)
projects/graid/7/games/grdc/ (props changed)
projects/graid/7/gnu/ (props changed)
projects/graid/7/gnu/lib/libstdc++/ (props changed)
projects/graid/7/gnu/usr.bin/ (props changed)
projects/graid/7/gnu/usr.bin/cc/ (props changed)
projects/graid/7/gnu/usr.bin/cpio/ (props changed)
projects/graid/7/gnu/usr.bin/cvs/ (props changed)
projects/graid/7/gnu/usr.bin/gdb/ (props changed)
projects/graid/7/gnu/usr.bin/gdb/kgdb/ (props changed)
projects/graid/7/gnu/usr.bin/grep/ (props changed)
projects/graid/7/gnu/usr.bin/groff/ (props changed)
projects/graid/7/gnu/usr.bin/groff/tmac/mdoc.local (props changed)
projects/graid/7/gnu/usr.bin/man/ (props changed)
projects/graid/7/gnu/usr.bin/sort/ (props changed)
projects/graid/7/include/ (props changed)
projects/graid/7/kerberos5/ (props changed)
projects/graid/7/lib/ (props changed)
projects/graid/7/lib/bind/ (props changed)
projects/graid/7/lib/csu/ (props changed)
projects/graid/7/lib/libarchive/ (props changed)
projects/graid/7/lib/libbluetooth/ (props changed)
projects/graid/7/lib/libc/ (props changed)
projects/graid/7/lib/libc/stdtime/ (props changed)
projects/graid/7/lib/libc_r/ (props changed)
projects/graid/7/lib/libcam/ (props changed)
projects/graid/7/lib/libdisk/ (props changed)
projects/graid/7/lib/libdwarf/ (props changed)
projects/graid/7/lib/libelf/ (props changed)
projects/graid/7/lib/libexpat/ (props changed)
projects/graid/7/lib/libfetch/ (props changed)
projects/graid/7/lib/libftpio/ (props changed)
projects/graid/7/lib/libgeom/ (props changed)
projects/graid/7/lib/libgssapi/ (props changed)
projects/graid/7/lib/libkse/ (props changed)
projects/graid/7/lib/libkvm/ (props changed)
projects/graid/7/lib/libmagic/ (props changed)
projects/graid/7/lib/libmemstat/ (props changed)
projects/graid/7/lib/libpmc/ (props changed)
projects/graid/7/lib/libradius/ (props changed)
projects/graid/7/lib/libsm/ (props changed)
projects/graid/7/lib/libstand/ (props changed)
projects/graid/7/lib/libthr/ (props changed)
projects/graid/7/lib/libthread_db/ (props changed)
projects/graid/7/lib/libufs/ (props changed)
projects/graid/7/lib/libutil/ (props changed)
projects/graid/7/lib/msun/ (props changed)
projects/graid/7/libexec/ (props changed)
projects/graid/7/libexec/ftpd/ (props changed)
projects/graid/7/libexec/rpc.rquotad/ (props changed)
projects/graid/7/libexec/rpc.rstatd/ (props changed)
projects/graid/7/libexec/rtld-elf/ (props changed)
projects/graid/7/libexec/tftpd/ (props changed)
projects/graid/7/release/ (props changed)
projects/graid/7/release/doc/ (props changed)
projects/graid/7/release/doc/en_US.ISO8859-1/hardware/ (props changed)
projects/graid/7/release/picobsd/tinyware/login/ (props changed)
projects/graid/7/rescue/ (props changed)
projects/graid/7/sbin/ (props changed)
projects/graid/7/sbin/atacontrol/ (props changed)
projects/graid/7/sbin/bsdlabel/ (props changed)
projects/graid/7/sbin/clri/ (props changed)
projects/graid/7/sbin/ddb/ (props changed)
projects/graid/7/sbin/devd/ (props changed)
projects/graid/7/sbin/devfs/ (props changed)
projects/graid/7/sbin/dhclient/ (props changed)
projects/graid/7/sbin/dumpfs/ (props changed)
projects/graid/7/sbin/fdisk/ (props changed)
projects/graid/7/sbin/fdisk_pc98/ (props changed)
projects/graid/7/sbin/fsck/ (props changed)
projects/graid/7/sbin/fsck_ffs/ (props changed)
projects/graid/7/sbin/fsck_msdosfs/ (props changed)
projects/graid/7/sbin/geom/ (props changed)
projects/graid/7/sbin/geom/class/label/ (props changed)
projects/graid/7/sbin/geom/class/part/ (props changed)
projects/graid/7/sbin/geom/class/stripe/ (props changed)
projects/graid/7/sbin/geom/misc/ (props changed)
projects/graid/7/sbin/growfs/ (props changed)
projects/graid/7/sbin/ifconfig/ (props changed)
projects/graid/7/sbin/init/ (props changed)
projects/graid/7/sbin/ipf/ (props changed)
projects/graid/7/sbin/ipfw/ (props changed)
projects/graid/7/sbin/md5/ (props changed)
projects/graid/7/sbin/mdconfig/ (props changed)
projects/graid/7/sbin/mksnap_ffs/ (props changed)
projects/graid/7/sbin/mount/ (props changed)
projects/graid/7/sbin/mount_msdosfs/ (props changed)
projects/graid/7/sbin/natd/ (props changed)
projects/graid/7/sbin/newfs/ (props changed)
projects/graid/7/sbin/newfs_msdos/ (props changed)
projects/graid/7/sbin/ping6/ (props changed)
projects/graid/7/sbin/reboot/ (props changed)
projects/graid/7/sbin/restore/ (props changed)
projects/graid/7/sbin/route/ (props changed)
projects/graid/7/sbin/savecore/ (props changed)
projects/graid/7/sbin/sconfig/ (props changed)
projects/graid/7/sbin/shutdown/ (props changed)
projects/graid/7/sbin/sysctl/ (props changed)
projects/graid/7/sbin/tunefs/ (props changed)
projects/graid/7/secure/lib/libcrypto/ (props changed)
projects/graid/7/secure/lib/libssh/ (props changed)
projects/graid/7/secure/lib/libssl/ (props changed)
projects/graid/7/secure/libexec/sftp-server/ (props changed)
projects/graid/7/secure/usr.bin/bdes/ (props changed)
projects/graid/7/secure/usr.bin/openssl/ (props changed)
projects/graid/7/secure/usr.bin/ssh/ (props changed)
projects/graid/7/secure/usr.sbin/sshd/ (props changed)
projects/graid/7/share/ (props changed)
projects/graid/7/share/colldef/ (props changed)
projects/graid/7/share/dict/ (props changed)
projects/graid/7/share/doc/bind9/ (props changed)
projects/graid/7/share/doc/papers/jail/ (props changed)
projects/graid/7/share/doc/smm/01.setup/ (props changed)
projects/graid/7/share/examples/ (props changed)
projects/graid/7/share/man/ (props changed)
projects/graid/7/share/man/man1/ (props changed)
projects/graid/7/share/man/man3/ (props changed)
projects/graid/7/share/man/man4/ (props changed)
projects/graid/7/share/man/man5/ (props changed)
projects/graid/7/share/man/man7/ (props changed)
projects/graid/7/share/man/man8/ (props changed)
projects/graid/7/share/man/man9/ (props changed)
projects/graid/7/share/misc/ (props changed)
projects/graid/7/share/misc/iso639 (props changed)
projects/graid/7/share/misc/pci_vendors (props changed)
projects/graid/7/share/mk/ (props changed)
projects/graid/7/share/mklocale/ (props changed)
projects/graid/7/share/monetdef/ (props changed)
projects/graid/7/share/msgdef/ (props changed)
projects/graid/7/share/numericdef/ (props changed)
projects/graid/7/share/sendmail/ (props changed)
projects/graid/7/share/syscons/ (props changed)
projects/graid/7/share/syscons/keymaps/ (props changed)
projects/graid/7/share/termcap/ (props changed)
projects/graid/7/share/timedef/ (props changed)
projects/graid/7/share/zoneinfo/ (props changed)
projects/graid/7/sys/ (props changed)
projects/graid/7/sys/cddl/contrib/opensolaris/ (props changed)
projects/graid/7/sys/contrib/dev/acpica/ (props changed)
projects/graid/7/sys/contrib/pf/ (props changed)
projects/graid/7/tools/ (props changed)
projects/graid/7/tools/build/ (props changed)
projects/graid/7/tools/build/options/ (props changed)
projects/graid/7/tools/debugscripts/ (props changed)
projects/graid/7/tools/regression/acct/ (props changed)
projects/graid/7/tools/regression/atm/ (props changed)
projects/graid/7/tools/regression/bin/ (props changed)
projects/graid/7/tools/regression/bin/date/ (props changed)
projects/graid/7/tools/regression/bin/sh/ (props changed)
projects/graid/7/tools/regression/file/ (props changed)
projects/graid/7/tools/regression/file/flock/ (props changed)
projects/graid/7/tools/regression/lib/libc/ (props changed)
projects/graid/7/tools/regression/usr.bin/ (props changed)
projects/graid/7/tools/regression/usr.bin/jot/ (props changed)
projects/graid/7/tools/regression/usr.bin/tr/ (props changed)
projects/graid/7/tools/sched/ (props changed)
projects/graid/7/tools/test/ (props changed)
projects/graid/7/tools/tools/ (props changed)
projects/graid/7/tools/tools/aac/ (props changed)
projects/graid/7/tools/tools/crypto/ (props changed)
projects/graid/7/tools/tools/editing/ (props changed)
projects/graid/7/tools/tools/nanobsd/ (props changed)
projects/graid/7/tools/tools/nanobsd/FlashDevice.sub (props changed)
projects/graid/7/tools/tools/nanobsd/nanobsd.sh (props changed)
projects/graid/7/tools/tools/netrate/ (props changed)
projects/graid/7/tools/tools/umastat/ (props changed)
projects/graid/7/tools/tools/usb/ (props changed)
projects/graid/7/usr.bin/ (props changed)
projects/graid/7/usr.bin/basename/ (props changed)
projects/graid/7/usr.bin/bluetooth/rfcomm_sppd/ (props changed)
projects/graid/7/usr.bin/calendar/ (props changed)
projects/graid/7/usr.bin/catman/ (props changed)
projects/graid/7/usr.bin/cksum/ (props changed)
projects/graid/7/usr.bin/comm/ (props changed)
projects/graid/7/usr.bin/cpuset/ (props changed)
projects/graid/7/usr.bin/csup/ (props changed)
projects/graid/7/usr.bin/dirname/ (props changed)
projects/graid/7/usr.bin/du/ (props changed)
projects/graid/7/usr.bin/fetch/ (props changed)
projects/graid/7/usr.bin/file/ (props changed)
projects/graid/7/usr.bin/find/ (props changed)
projects/graid/7/usr.bin/finger/ (props changed)
projects/graid/7/usr.bin/fold/ (props changed)
projects/graid/7/usr.bin/fstat/ (props changed)
projects/graid/7/usr.bin/gcore/ (props changed)
projects/graid/7/usr.bin/gprof/ (props changed)
projects/graid/7/usr.bin/gzip/ (props changed)
projects/graid/7/usr.bin/hexdump/ (props changed)
projects/graid/7/usr.bin/id/ (props changed)
projects/graid/7/usr.bin/indent/ (props changed)
projects/graid/7/usr.bin/ipcrm/ (props changed)
projects/graid/7/usr.bin/ipcs/ (props changed)
projects/graid/7/usr.bin/jot/ (props changed)
projects/graid/7/usr.bin/kdump/ (props changed)
projects/graid/7/usr.bin/ktrace/ (props changed)
projects/graid/7/usr.bin/ldd/ (props changed)
projects/graid/7/usr.bin/less/ (props changed)
projects/graid/7/usr.bin/locate/ (props changed)
projects/graid/7/usr.bin/lockf/ (props changed)
projects/graid/7/usr.bin/logger/ (props changed)
projects/graid/7/usr.bin/make/ (props changed)
projects/graid/7/usr.bin/ncal/ (props changed)
projects/graid/7/usr.bin/netstat/ (props changed)
projects/graid/7/usr.bin/newgrp/ (props changed)
projects/graid/7/usr.bin/nsupdate/ (props changed)
projects/graid/7/usr.bin/pkill/ (props changed)
projects/graid/7/usr.bin/procstat/ (props changed)
projects/graid/7/usr.bin/quota/ (props changed)
projects/graid/7/usr.bin/rpcgen/ (props changed)
projects/graid/7/usr.bin/ruptime/ (props changed)
projects/graid/7/usr.bin/script/ (props changed)
projects/graid/7/usr.bin/sed/ (props changed)
projects/graid/7/usr.bin/shar/ (props changed)
projects/graid/7/usr.bin/sockstat/ (props changed)
projects/graid/7/usr.bin/stat/ (props changed)
projects/graid/7/usr.bin/su/ (props changed)
projects/graid/7/usr.bin/systat/ (props changed)
projects/graid/7/usr.bin/tail/ (props changed)
projects/graid/7/usr.bin/tar/ (props changed)
projects/graid/7/usr.bin/tftp/ (props changed)
projects/graid/7/usr.bin/tip/ (props changed)
projects/graid/7/usr.bin/top/ (props changed)
projects/graid/7/usr.bin/truncate/ (props changed)
projects/graid/7/usr.bin/truss/ (props changed)
projects/graid/7/usr.bin/uname/ (props changed)
projects/graid/7/usr.bin/unifdef/ (props changed)
projects/graid/7/usr.bin/units/ (props changed)
projects/graid/7/usr.bin/uudecode/ (props changed)
projects/graid/7/usr.bin/vmstat/ (props changed)
projects/graid/7/usr.bin/w/ (props changed)
projects/graid/7/usr.bin/wc/ (props changed)
projects/graid/7/usr.bin/whereis/ (props changed)
projects/graid/7/usr.bin/whois/ (props changed)
projects/graid/7/usr.bin/window/ (props changed)
projects/graid/7/usr.bin/xargs/ (props changed)
projects/graid/7/usr.bin/ypcat/ (props changed)
projects/graid/7/usr.bin/ypmatch/ (props changed)
projects/graid/7/usr.bin/ypwhich/ (props changed)
projects/graid/7/usr.sbin/ (props changed)
projects/graid/7/usr.sbin/Makefile (props changed)
projects/graid/7/usr.sbin/acpi/ (props changed)
projects/graid/7/usr.sbin/adduser/ (props changed)
projects/graid/7/usr.sbin/arp/ (props changed)
projects/graid/7/usr.sbin/bluetooth/ (props changed)
projects/graid/7/usr.sbin/bluetooth/btpand/ (props changed)
projects/graid/7/usr.sbin/bluetooth/hcsecd/ (props changed)
projects/graid/7/usr.sbin/bluetooth/hcseriald/ (props changed)
projects/graid/7/usr.sbin/bluetooth/rfcomm_pppd/ (props changed)
projects/graid/7/usr.sbin/bluetooth/sdpd/ (props changed)
projects/graid/7/usr.sbin/boot0cfg/ (props changed)
projects/graid/7/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_processor_tbl.c (props changed)
projects/graid/7/usr.sbin/bsnmpd/modules/snmp_pf/ (props changed)
projects/graid/7/usr.sbin/burncd/ (props changed)
projects/graid/7/usr.sbin/cdcontrol/ (props changed)
projects/graid/7/usr.sbin/chown/ (props changed)
projects/graid/7/usr.sbin/chroot/ (props changed)
projects/graid/7/usr.sbin/config/ (props changed)
projects/graid/7/usr.sbin/config/SMM.doc/ (props changed)
projects/graid/7/usr.sbin/cpucontrol/ (props changed)
projects/graid/7/usr.sbin/crashinfo/ (props changed)
projects/graid/7/usr.sbin/cron/ (props changed)
projects/graid/7/usr.sbin/cron/cron/ (props changed)
projects/graid/7/usr.sbin/crunch/ (props changed)
projects/graid/7/usr.sbin/cxgbtool/ (props changed)
projects/graid/7/usr.sbin/eeprom/ (props changed)
projects/graid/7/usr.sbin/extattr/ (props changed)
projects/graid/7/usr.sbin/faithd/ (props changed)
projects/graid/7/usr.sbin/fdcontrol/ (props changed)
projects/graid/7/usr.sbin/fdformat/ (props changed)
projects/graid/7/usr.sbin/fdread/ (props changed)
projects/graid/7/usr.sbin/fdwrite/ (props changed)
projects/graid/7/usr.sbin/fifolog/ (props changed)
projects/graid/7/usr.sbin/freebsd-update/ (props changed)
projects/graid/7/usr.sbin/fwcontrol/ (props changed)
projects/graid/7/usr.sbin/gstat/ (props changed)
projects/graid/7/usr.sbin/iostat/ (props changed)
projects/graid/7/usr.sbin/jail/ (props changed)
projects/graid/7/usr.sbin/jexec/ (props changed)
projects/graid/7/usr.sbin/jls/ (props changed)
projects/graid/7/usr.sbin/lpr/ (props changed)
projects/graid/7/usr.sbin/mailwrapper/ (props changed)
projects/graid/7/usr.sbin/makefs/ (props changed)
projects/graid/7/usr.sbin/makefs/ffs/ffs_bswap.c (props changed)
projects/graid/7/usr.sbin/makefs/ffs/ffs_subr.c (props changed)
projects/graid/7/usr.sbin/makefs/ffs/ufs_bswap.h (props changed)
projects/graid/7/usr.sbin/makefs/getid.c (props changed)
projects/graid/7/usr.sbin/mergemaster/ (props changed)
projects/graid/7/usr.sbin/mfiutil/ (props changed)
projects/graid/7/usr.sbin/mountd/ (props changed)
projects/graid/7/usr.sbin/mptutil/ (props changed)
projects/graid/7/usr.sbin/mtree/ (props changed)
projects/graid/7/usr.sbin/ndiscvt/ (props changed)
projects/graid/7/usr.sbin/ndp/ (props changed)
projects/graid/7/usr.sbin/newsyslog/ (props changed)
projects/graid/7/usr.sbin/nscd/ (props changed)
projects/graid/7/usr.sbin/ntp/ (props changed)
projects/graid/7/usr.sbin/pciconf/ (props changed)
projects/graid/7/usr.sbin/pkg_install/ (props changed)
projects/graid/7/usr.sbin/pmccontrol/ (props changed)
projects/graid/7/usr.sbin/pmcstat/ (props changed)
projects/graid/7/usr.sbin/portsnap/ (props changed)
projects/graid/7/usr.sbin/powerd/ (props changed)
projects/graid/7/usr.sbin/ppp/ (props changed)
projects/graid/7/usr.sbin/pstat/ (props changed)
projects/graid/7/usr.sbin/pw/ (props changed)
projects/graid/7/usr.sbin/pwd_mkdb/ (props changed)
projects/graid/7/usr.sbin/rpc.lockd/ (props changed)
projects/graid/7/usr.sbin/rpc.statd/ (props changed)
projects/graid/7/usr.sbin/rpc.yppasswdd/ (props changed)
projects/graid/7/usr.sbin/rtadvd/ (props changed)
projects/graid/7/usr.sbin/rtsold/ (props changed)
projects/graid/7/usr.sbin/sade/ (props changed)
projects/graid/7/usr.sbin/service/ (props changed)
projects/graid/7/usr.sbin/setfib/ (props changed)
projects/graid/7/usr.sbin/sysinstall/ (props changed)
projects/graid/7/usr.sbin/syslogd/ (props changed)
projects/graid/7/usr.sbin/traceroute/ (props changed)
projects/graid/7/usr.sbin/traceroute6/ (props changed)
projects/graid/7/usr.sbin/tzsetup/ (props changed)
projects/graid/7/usr.sbin/ugidfw/ (props changed)
projects/graid/7/usr.sbin/wpa/wpa_supplicant/ (props changed)
projects/graid/7/usr.sbin/ypserv/ (props changed)
projects/graid/7/usr.sbin/zic/ (props changed)
Modified: projects/graid/7/sbin/geom/class/raid/graid.8
==============================================================================
--- projects/graid/7/sbin/geom/class/raid/graid.8 Mon Feb 14 14:21:07 2011 (r218679)
+++ projects/graid/7/sbin/geom/class/raid/graid.8 Mon Feb 14 14:26:14 2011 (r218680)
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd February 10, 2011
+.Dd February 13, 2011
.Dt GRAID 8
.Os
.Sh NAME
@@ -211,7 +211,8 @@ risk: RAID1 (3+ disks), RAID1E (3+ disks
.Sh SUPPORTED RAID LEVELS
The GEOM RAID class follows a modular design, allowing different RAID levels
to be used.
-Support for the following RAID levels is currently implemented: RAID0, RAID1.
+Support for the following RAID levels is currently implemented: RAID0, RAID1,
+RAID1E, RAID10.
.Sh EXIT STATUS
Exit status is 0 on success, and non-zero if the command fails.
.Sh SEE ALSO
Modified: projects/graid/7/sys/conf/files
==============================================================================
--- projects/graid/7/sys/conf/files Mon Feb 14 14:21:07 2011 (r218679)
+++ projects/graid/7/sys/conf/files Mon Feb 14 14:26:14 2011 (r218680)
@@ -1533,6 +1533,7 @@ geom/raid/g_raid_tr_if.m optional geom_r
geom/raid/md_intel.c optional geom_raid
geom/raid/tr_raid0.c optional geom_raid
geom/raid/tr_raid1.c optional geom_raid
+geom/raid/tr_raid1e.c optional geom_raid
geom/raid3/g_raid3.c optional geom_raid3
geom/raid3/g_raid3_ctl.c optional geom_raid3
geom/shsec/g_shsec.c optional geom_shsec
Modified: projects/graid/7/sys/geom/raid/g_raid.c
==============================================================================
--- projects/graid/7/sys/geom/raid/g_raid.c Mon Feb 14 14:21:07 2011 (r218679)
+++ projects/graid/7/sys/geom/raid/g_raid.c Mon Feb 14 14:26:14 2011 (r218680)
@@ -59,14 +59,20 @@ u_int g_raid_debug = 2;
TUNABLE_INT("kern.geom.raid.debug", &g_raid_debug);
SYSCTL_UINT(_kern_geom_raid, OID_AUTO, debug, CTLFLAG_RW, &g_raid_debug, 0,
"Debug level");
+int g_raid_read_err_thresh = 10;
+TUNABLE_INT("kern.geom.raid.read_err_thresh", &g_raid_read_err_thresh);
+SYSCTL_UINT(_kern_geom_raid, OID_AUTO, read_err_thresh, CTLFLAG_RW,
+ &g_raid_read_err_thresh, 0,
+ "Number of read errors equated to disk failure");
u_int g_raid_start_timeout = 15;
TUNABLE_INT("kern.geom.raid.start_timeout", &g_raid_start_timeout);
-SYSCTL_UINT(_kern_geom_raid, OID_AUTO, timeout, CTLFLAG_RW, &g_raid_start_timeout,
- 0, "Time to wait for all array components");
-static u_int g_raid_cleantime = 5;
-TUNABLE_INT("kern.geom.raid.cleantime", &g_raid_cleantime);
-SYSCTL_UINT(_kern_geom_raid, OID_AUTO, cleantime, CTLFLAG_RW,
- &g_raid_cleantime, 0, "Mark volume as clean when idling");
+SYSCTL_UINT(_kern_geom_raid, OID_AUTO, start_timeout, CTLFLAG_RW,
+ &g_raid_start_timeout, 0,
+ "Time to wait for all array components");
+static u_int g_raid_clean_time = 5;
+TUNABLE_INT("kern.geom.raid.clean_time", &g_raid_clean_time);
+SYSCTL_UINT(_kern_geom_raid, OID_AUTO, clean_time, CTLFLAG_RW,
+ &g_raid_clean_time, 0, "Mark volume as clean when idling");
static u_int g_raid_disconnect_on_failure = 1;
TUNABLE_INT("kern.geom.raid.disconnect_on_failure",
&g_raid_disconnect_on_failure);
@@ -709,7 +715,7 @@ g_raid_clean(struct g_raid_volume *vol,
return (0);
if (acw > 0 || (acw == -1 &&
vol->v_provider != NULL && vol->v_provider->acw > 0)) {
- timeout = g_raid_cleantime - (time_uptime - vol->v_last_write);
+ timeout = g_raid_clean_time - (time_uptime - vol->v_last_write);
if (timeout > 0)
return (timeout);
}
@@ -737,6 +743,54 @@ g_raid_dirty(struct g_raid_volume *vol)
g_raid_write_metadata(sc, vol, NULL, NULL);
}
+void
+g_raid_tr_flush_common(struct g_raid_tr_object *tr, struct bio *bp)
+{
+ struct g_raid_softc *sc;
+ struct g_raid_volume *vol;
+ struct g_raid_subdisk *sd;
+ struct bio_queue_head queue;
+ struct bio *cbp;
+ int i;
+
+ vol = tr->tro_volume;
+ sc = vol->v_softc;
+
+ /*
+ * Allocate all bios before sending any request, so we can return
+ * ENOMEM in nice and clean way.
+ */
+ bioq_init(&queue);
+ for (i = 0; i < vol->v_disks_count; i++) {
+ sd = &vol->v_subdisks[i];
+ if (sd->sd_state == G_RAID_SUBDISK_S_NONE ||
+ sd->sd_state == G_RAID_SUBDISK_S_FAILED)
+ continue;
+ cbp = g_clone_bio(bp);
+ if (cbp == NULL)
+ goto failure;
+ cbp->bio_caller1 = sd;
+ bioq_insert_tail(&queue, cbp);
+ }
+ for (cbp = bioq_first(&queue); cbp != NULL;
+ cbp = bioq_first(&queue)) {
+ bioq_remove(&queue, cbp);
+ sd = cbp->bio_caller1;
+ cbp->bio_caller1 = NULL;
+ g_raid_subdisk_iostart(sd, cbp);
+ }
+ return;
+failure:
+ for (cbp = bioq_first(&queue); cbp != NULL;
+ cbp = bioq_first(&queue)) {
+ bioq_remove(&queue, cbp);
+ g_destroy_bio(cbp);
+ }
+ if (bp->bio_error == 0)
+ bp->bio_error = ENOMEM;
+ g_raid_iodone(bp, bp->bio_error);
+}
+
static void
g_raid_tr_kerneldump_common_done(struct bio *bp)
{
@@ -831,10 +885,8 @@ g_raid_start(struct bio *bp)
case BIO_READ:
case BIO_WRITE:
case BIO_DELETE:
- break;
case BIO_FLUSH:
- g_io_deliver(bp, EOPNOTSUPP);
- return;
+ break;
case BIO_GETATTR:
if (!strcmp(bp->bio_attribute, "GEOM::kerneldump"))
g_raid_kerneldump(sc, bp);
@@ -994,6 +1046,7 @@ g_raid_iodone(struct bio *bp, int error)
bioq_remove(&vol->v_inflight, bp);
if (vol->v_pending_lock && g_raid_is_in_locked_range(vol, bp))
g_raid_finish_with_locked_ranges(vol, bp);
+ getmicrouptime(&vol->v_last_done);
g_io_deliver(bp, error);
}
@@ -1220,6 +1273,7 @@ g_raid_worker(void *arg)
struct g_raid_event *ep;
struct g_raid_volume *vol;
struct bio *bp;
+ struct timeval now, t;
int timeout, rv;
sc = arg;
@@ -1243,38 +1297,59 @@ g_raid_worker(void *arg)
else if ((bp = bioq_takefirst(&sc->sc_queue)) != NULL)
;
else {
- /*
- * Two steps to avoid overflows at HZ=1000
- * and idle timeouts > 2.1s. Some rounding errors
- * can occur, but they are < 1tick, which is deemed to
- * be close enough for this purpose.
- */
- int micpertic = 1000000 / hz;
- timeout = g_raid_idle_threshold / micpertic;
- sx_xunlock(&sc->sc_lock);
- MSLEEP(rv, sc, &sc->sc_queue_mtx, PRIBIO | PDROP, "-",
- timeout);
- sx_xlock(&sc->sc_lock);
- goto process;
+ getmicrouptime(&now);
+ t = now;
+ TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) {
+ if (bioq_first(&vol->v_inflight) == NULL &&
+ timevalcmp(&vol->v_last_done, &t, < ))
+ t = vol->v_last_done;
+ }
+ timevalsub(&t, &now);
+ timeout = g_raid_idle_threshold +
+ t.tv_sec * 1000000 + t.tv_usec;
+ if (timeout > 0) {
+ /*
+ * Two steps to avoid overflows at HZ=1000
+ * and idle timeouts > 2.1s. Some rounding
+ * errors can occur, but they are < 1tick,
+ * which is deemed to be close enough for
+ * this purpose.
+ */
+ int micpertic = 1000000 / hz;
+ timeout = (timeout + micpertic - 1) / micpertic;
+ sx_xunlock(&sc->sc_lock);
+ MSLEEP(rv, sc, &sc->sc_queue_mtx,
+ PRIBIO | PDROP, "-", timeout);
+ sx_xlock(&sc->sc_lock);
+ goto process;
+ } else
+ rv = EWOULDBLOCK;
}
mtx_unlock(&sc->sc_queue_mtx);
process:
- if (ep != NULL)
+ if (ep != NULL) {
g_raid_handle_event(sc, ep);
- if (bp != NULL) {
+ } else if (bp != NULL) {
if (bp->bio_to != NULL &&
bp->bio_to->geom == sc->sc_geom)
g_raid_start_request(bp);
else
g_raid_disk_done_request(bp);
- }
- if (rv == EWOULDBLOCK) {
+ } else if (rv == EWOULDBLOCK) {
TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) {
if (vol->v_writes == 0 && vol->v_dirty)
g_raid_clean(vol, -1);
if (bioq_first(&vol->v_inflight) == NULL &&
- vol->v_tr)
- G_RAID_TR_IDLE(vol->v_tr);
+ vol->v_tr) {
+ t.tv_sec = g_raid_idle_threshold / 1000000;
+ t.tv_usec = g_raid_idle_threshold % 1000000;
+ timevaladd(&t, &vol->v_last_done);
+ getmicrouptime(&now);
+ if (timevalcmp(&t, &now, <= )) {
+ G_RAID_TR_IDLE(vol->v_tr);
+ vol->v_last_done = now;
+ }
+ }
}
}
if (sc->sc_stopping == G_RAID_DESTROY_HARD)
Modified: projects/graid/7/sys/geom/raid/g_raid.h
==============================================================================
--- projects/graid/7/sys/geom/raid/g_raid.h Mon Feb 14 14:21:07 2011 (r218679)
+++ projects/graid/7/sys/geom/raid/g_raid.h Mon Feb 14 14:26:14 2011 (r218680)
@@ -32,6 +32,7 @@
#include <sys/param.h>
#include <sys/kobj.h>
#include <sys/bio.h>
+#include <sys/time.h>
#define G_RAID_CLASS_NAME "RAID"
@@ -50,6 +51,7 @@ struct g_raid_tr_object;
#ifdef _KERNEL
extern u_int g_raid_aggressive_spare;
extern u_int g_raid_debug;
+extern int g_raid_read_err_thresh;
extern u_int g_raid_start_timeout;
extern struct g_class g_raid_class;
@@ -249,6 +251,7 @@ struct g_raid_volume {
LIST_HEAD(, g_raid_lock) v_locks; /* List of locked regions. */
int v_pending_lock; /* writes to locked region */
int v_dirty; /* Volume is DIRTY. */
+ struct timeval v_last_done; /* Time of the last I/O. */
time_t v_last_write; /* Time of the last write. */
u_int v_writes; /* Number of active writes. */
struct root_hold_token *v_rootmount; /* Root mount delay token. */
@@ -373,6 +376,7 @@ void g_raid_write_metadata(struct g_raid
void g_raid_fail_disk(struct g_raid_softc *sc,
struct g_raid_subdisk *sd, struct g_raid_disk *disk);
+void g_raid_tr_flush_common(struct g_raid_tr_object *tr, struct bio *bp);
int g_raid_tr_kerneldump_common(struct g_raid_tr_object *tr,
void *virtual, vm_offset_t physical, off_t offset, size_t length);
Modified: projects/graid/7/sys/geom/raid/md_intel.c
==============================================================================
--- projects/graid/7/sys/geom/raid/md_intel.c Mon Feb 14 14:21:07 2011 (r218679)
+++ projects/graid/7/sys/geom/raid/md_intel.c Mon Feb 14 14:26:14 2011 (r218680)
@@ -586,7 +586,7 @@ g_raid_md_intel_supported(int level, int
return (0);
break;
case G_RAID_VOLUME_RL_RAID1E:
- if (disks < 3)
+ if (disks < 2)
return (0);
if (!force && (disks != 4))
return (0);
@@ -776,15 +776,11 @@ nofit:
}
} else if (mvol->migr_type == INTEL_MT_INIT ||
mvol->migr_type == INTEL_MT_REBUILD) {
- if (!(mmap1->disk_idx[sd->sd_pos] & INTEL_DI_RBLD)) {
- /* Up to date disk. */
- g_raid_change_subdisk_state(sd,
- G_RAID_SUBDISK_S_ACTIVE);
- } else if (mmap0->disk_idx[sd->sd_pos] & INTEL_DI_RBLD) {
+ if (mmap0->disk_idx[sd->sd_pos] & INTEL_DI_RBLD) {
/* Freshly inserted disk. */
g_raid_change_subdisk_state(sd,
G_RAID_SUBDISK_S_NEW);
- } else {
+ } else if (mmap1->disk_idx[sd->sd_pos] & INTEL_DI_RBLD) {
/* Rebuilding disk. */
g_raid_change_subdisk_state(sd,
G_RAID_SUBDISK_S_REBUILD);
@@ -796,18 +792,22 @@ nofit:
sd->sd_volume->v_strip_size *
mmap0->total_domains;
}
- }
- } else if (mvol->migr_type == INTEL_MT_VERIFY ||
- mvol->migr_type == INTEL_MT_REPAIR) {
- if (!(mmap1->disk_idx[sd->sd_pos] & INTEL_DI_RBLD)) {
+ } else if (mvol->dirty) {
+ /* Dirty volume (unclean shutdown). */
+ g_raid_change_subdisk_state(sd,
+ G_RAID_SUBDISK_S_STALE);
+ } else {
/* Up to date disk. */
g_raid_change_subdisk_state(sd,
G_RAID_SUBDISK_S_ACTIVE);
- } else if (mmap0->disk_idx[sd->sd_pos] & INTEL_DI_RBLD) {
+ }
+ } else if (mvol->migr_type == INTEL_MT_VERIFY ||
+ mvol->migr_type == INTEL_MT_REPAIR) {
+ if (mmap0->disk_idx[sd->sd_pos] & INTEL_DI_RBLD) {
/* Freshly inserted disk. */
g_raid_change_subdisk_state(sd,
G_RAID_SUBDISK_S_NEW);
- } else {
+ } else if (mmap1->disk_idx[sd->sd_pos] & INTEL_DI_RBLD) {
/* Resyncing disk. */
g_raid_change_subdisk_state(sd,
G_RAID_SUBDISK_S_RESYNC);
@@ -819,6 +819,14 @@ nofit:
sd->sd_volume->v_strip_size *
mmap0->total_domains;
}
+ } else if (mvol->dirty) {
+ /* Dirty volume (unclean shutdown). */
+ g_raid_change_subdisk_state(sd,
+ G_RAID_SUBDISK_S_STALE);
+ } else {
+ /* Up to date disk. */
+ g_raid_change_subdisk_state(sd,
+ G_RAID_SUBDISK_S_ACTIVE);
}
}
g_raid_event_send(sd, G_RAID_SUBDISK_E_NEW,
@@ -1539,6 +1547,9 @@ makedisk:
/* Round size down to strip or sector. */
if (level == G_RAID_VOLUME_RL_RAID1)
size -= (size % sectorsize);
+ else if (level == G_RAID_VOLUME_RL_RAID1E &&
+ (numdisks & 1) != 0)
+ size -= (size % (2 * strip));
else
size -= (size % strip);
if (size <= 0) {
Modified: projects/graid/7/sys/geom/raid/tr_raid0.c
==============================================================================
--- projects/graid/7/sys/geom/raid/tr_raid0.c Mon Feb 14 14:21:07 2011 (r218679)
+++ projects/graid/7/sys/geom/raid/tr_raid0.c Mon Feb 14 14:26:14 2011 (r218680)
@@ -185,13 +185,12 @@ g_raid_tr_stop_raid0(struct g_raid_tr_ob
static void
g_raid_tr_iostart_raid0(struct g_raid_tr_object *tr, struct bio *bp)
{
- struct g_raid_softc *sc;
struct g_raid_volume *vol;
struct g_raid_subdisk *sd;
struct bio_queue_head queue;
struct bio *cbp;
char *addr;
- off_t offset, start, length, nstripe;
+ off_t offset, start, length, nstripe, remain;
u_int no, strip_size;
vol = tr->tro_volume;
@@ -200,8 +199,10 @@ g_raid_tr_iostart_raid0(struct g_raid_tr
g_raid_iodone(bp, EIO);
return;
}
- sc = vol->v_softc;
-
+ if (bp->bio_cmd == BIO_FLUSH) {
+ g_raid_tr_flush_common(tr, bp);
+ return;
+ }
addr = bp->bio_data;
strip_size = vol->v_strip_size;
@@ -211,55 +212,30 @@ g_raid_tr_iostart_raid0(struct g_raid_tr
start = bp->bio_offset % strip_size;
/* Disk number. */
no = nstripe % vol->v_disks_count;
- /* Start position in disk. */
- offset = (nstripe / vol->v_disks_count) * strip_size + start;
+ /* Stripe start position in disk. */
+ offset = (nstripe / vol->v_disks_count) * strip_size;
/* Length of data to operate. */
- length = MIN(bp->bio_length, strip_size - start);
+ remain = bp->bio_length;
- /*
- * Allocate all bios before sending any request, so we can
- * return ENOMEM in nice and clean way.
- */
bioq_init(&queue);
- cbp = g_clone_bio(bp);
- if (cbp == NULL)
- goto failure;
- /*
- * Fill in the component buf structure.
- */
- cbp->bio_offset = offset;
- cbp->bio_data = addr;
- cbp->bio_length = length;
- cbp->bio_caller1 = &vol->v_subdisks[no];
- bioq_insert_tail(&queue, cbp);
-
- offset -= offset % strip_size;
- addr += length;
- length = bp->bio_length - length;
- for (no++; length > 0;
- no++, length -= strip_size, addr += strip_size) {
- if (no > vol->v_disks_count - 1) {
- no = 0;
- offset += strip_size;
- }
+ do {
+ length = MIN(strip_size - start, remain);
cbp = g_clone_bio(bp);
if (cbp == NULL)
goto failure;
-
- /*
- * Fill in the component buf structure.
- */
- cbp->bio_offset = offset;
+ cbp->bio_offset = offset + start;
cbp->bio_data = addr;
- /*
- * MIN() is in case when
- * (bp->bio_length % sc->sc_stripesize) != 0.
- */
- cbp->bio_length = MIN(strip_size, length);
-
+ cbp->bio_length = length;
cbp->bio_caller1 = &vol->v_subdisks[no];
bioq_insert_tail(&queue, cbp);
- }
+ if (++no >= vol->v_disks_count) {
+ no = 0;
+ offset += strip_size;
+ }
+ remain -= length;
+ addr += length;
+ start = 0;
+ } while (remain > 0);
for (cbp = bioq_first(&queue); cbp != NULL;
cbp = bioq_first(&queue)) {
bioq_remove(&queue, cbp);
@@ -279,54 +255,47 @@ failure:
g_raid_iodone(bp, bp->bio_error);
}
-int
+static int
g_raid_tr_kerneldump_raid0(struct g_raid_tr_object *tr,
void *virtual, vm_offset_t physical, off_t boffset, size_t blength)
{
- struct g_raid_softc *sc;
struct g_raid_volume *vol;
char *addr;
- off_t offset, start, length, nstripe;
+ off_t offset, start, length, nstripe, remain;
u_int no, strip_size;
int error;
vol = tr->tro_volume;
if (vol->v_state != G_RAID_VOLUME_S_OPTIMAL)
return (ENXIO);
- sc = vol->v_softc;
-
addr = virtual;
strip_size = vol->v_strip_size;
+
/* Stripe number. */
nstripe = boffset / strip_size;
/* Start position in stripe. */
start = boffset % strip_size;
/* Disk number. */
no = nstripe % vol->v_disks_count;
- /* Start position in disk. */
- offset = (nstripe / vol->v_disks_count) * strip_size + start;
+ /* Stripe tart position in disk. */
+ offset = (nstripe / vol->v_disks_count) * strip_size;
/* Length of data to operate. */
- length = MIN(blength, strip_size - start);
+ remain = blength;
- error = g_raid_subdisk_kerneldump(&vol->v_subdisks[no],
- addr, 0, offset, length);
- if (error != 0)
- return (error);
-
- offset -= offset % strip_size;
- addr += length;
- length = blength - length;
- for (no++; length > 0;
- no++, length -= strip_size, addr += strip_size) {
- if (no > vol->v_disks_count - 1) {
- no = 0;
- offset += strip_size;
- }
+ do {
+ length = MIN(strip_size - start, remain);
error = g_raid_subdisk_kerneldump(&vol->v_subdisks[no],
- addr, 0, offset, MIN(strip_size, length));
+ addr, 0, offset + start, length);
if (error != 0)
return (error);
- }
+ if (++no >= vol->v_disks_count) {
+ no = 0;
+ offset += strip_size;
+ }
+ remain -= length;
+ addr += length;
+ start = 0;
+ } while (remain > 0);
return (0);
}
Modified: projects/graid/7/sys/geom/raid/tr_raid1.c
==============================================================================
--- projects/graid/7/sys/geom/raid/tr_raid1.c Mon Feb 14 14:21:07 2011 (r218679)
+++ projects/graid/7/sys/geom/raid/tr_raid1.c Mon Feb 14 14:26:14 2011 (r218680)
@@ -46,19 +46,12 @@ SYSCTL_DECL(_kern_geom_raid);
SYSCTL_NODE(_kern_geom_raid, OID_AUTO, raid1, CTLFLAG_RW, 0,
"RAID1 parameters");
-#define RAID1_READ_ERR_THRESH 10 /* errors to cause a rebuild */
-static int g_raid1_read_err_thresh = RAID1_READ_ERR_THRESH;
-TUNABLE_INT("kern.geom.raid.raid1.read_err_thresh", &g_raid1_read_err_thresh);
-SYSCTL_UINT(_kern_geom_raid_raid1, OID_AUTO, read_err_thresh, CTLFLAG_RW,
- &g_raid1_read_err_thresh, RAID1_READ_ERR_THRESH,
- "Number of read errors on a subdisk that trigger a rebuild");
-
#define RAID1_REBUILD_SLAB (1 << 20) /* One transation in a rebuild */
static int g_raid1_rebuild_slab = RAID1_REBUILD_SLAB;
TUNABLE_INT("kern.geom.raid.raid1.rebuild_slab_size",
&g_raid1_rebuild_slab);
SYSCTL_UINT(_kern_geom_raid_raid1, OID_AUTO, rebuild_slab_size, CTLFLAG_RW,
- &g_raid1_rebuild_slab, RAID1_REBUILD_SLAB,
+ &g_raid1_rebuild_slab, 0,
"Amount of the disk to rebuild each read/write cycle of the rebuild.");
#define RAID1_REBUILD_FAIR_IO 20 /* use 1/x of the available I/O */
@@ -66,7 +59,7 @@ static int g_raid1_rebuild_fair_io = RAI
TUNABLE_INT("kern.geom.raid.raid1.rebuild_fair_io",
&g_raid1_rebuild_fair_io);
SYSCTL_UINT(_kern_geom_raid_raid1, OID_AUTO, rebuild_fair_io, CTLFLAG_RW,
- &g_raid1_rebuild_fair_io, RAID1_REBUILD_FAIR_IO,
+ &g_raid1_rebuild_fair_io, 0,
"Fraction of the I/O bandwidth to use when disk busy for rebuild.");
#define RAID1_REBUILD_CLUSTER_IDLE 100
@@ -74,7 +67,7 @@ static int g_raid1_rebuild_cluster_idle
TUNABLE_INT("kern.geom.raid.raid1.rebuild_cluster_idle",
&g_raid1_rebuild_cluster_idle);
SYSCTL_UINT(_kern_geom_raid_raid1, OID_AUTO, rebuild_cluster_idle, CTLFLAG_RW,
- &g_raid1_rebuild_cluster_idle, RAID1_REBUILD_CLUSTER_IDLE,
+ &g_raid1_rebuild_cluster_idle, 0,
"Number of slabs to do each time we trigger a rebuild cycle");
#define RAID1_REBUILD_META_UPDATE 1024 /* update meta data every 1GB or so */
@@ -82,7 +75,7 @@ static int g_raid1_rebuild_meta_update =
TUNABLE_INT("kern.geom.raid.raid1.rebuild_meta_update",
&g_raid1_rebuild_meta_update);
SYSCTL_UINT(_kern_geom_raid_raid1, OID_AUTO, rebuild_meta_update, CTLFLAG_RW,
- &g_raid1_rebuild_meta_update, RAID1_REBUILD_META_UPDATE,
+ &g_raid1_rebuild_meta_update, 0,
"When to update the meta data.");
static MALLOC_DEFINE(M_TR_RAID1, "tr_raid1_data", "GEOM_RAID RAID1 data");
@@ -250,16 +243,16 @@ g_raid_tr_raid1_fail_disk(struct g_raid_
}
static void
-g_raid_tr_raid1_rebuild_some(struct g_raid_tr_object *tr,
- struct g_raid_subdisk *sd)
+g_raid_tr_raid1_rebuild_some(struct g_raid_tr_object *tr)
{
struct g_raid_tr_raid1_object *trs;
- struct g_raid_subdisk *good_sd;
+ struct g_raid_subdisk *sd, *good_sd;
struct bio *bp;
trs = (struct g_raid_tr_raid1_object *)tr;
if (trs->trso_flags & TR_RAID1_F_DOING_SOME)
return;
+ sd = trs->trso_failed_sd;
good_sd = g_raid_get_subdisk(sd->sd_volume, G_RAID_SUBDISK_S_ACTIVE);
if (good_sd == NULL) {
g_raid_tr_raid1_rebuild_abort(tr);
@@ -269,13 +262,11 @@ g_raid_tr_raid1_rebuild_some(struct g_ra
memset(bp, 0, sizeof(*bp));
bp->bio_offset = sd->sd_rebuild_pos;
bp->bio_length = MIN(g_raid1_rebuild_slab,
- sd->sd_volume->v_mediasize - sd->sd_rebuild_pos);
+ sd->sd_size - sd->sd_rebuild_pos);
bp->bio_data = trs->trso_buffer;
bp->bio_cmd = BIO_READ;
bp->bio_cflags = G_RAID_BIO_FLAG_SYNC;
bp->bio_caller1 = good_sd;
- trs->trso_recover_slabs = g_raid1_rebuild_cluster_idle;
- trs->trso_fair_io = g_raid1_rebuild_fair_io;
trs->trso_flags |= TR_RAID1_F_DOING_SOME;
trs->trso_flags |= TR_RAID1_F_LOCKED;
g_raid_lock_range(sd->sd_volume, /* Lock callback starts I/O */
@@ -343,7 +334,7 @@ g_raid_tr_raid1_rebuild_abort(struct g_r
if (trs->trso_flags & TR_RAID1_F_LOCKED) {
trs->trso_flags &= ~TR_RAID1_F_LOCKED;
len = MIN(g_raid1_rebuild_slab,
- vol->v_mediasize - sd->sd_rebuild_pos);
+ sd->sd_size - sd->sd_rebuild_pos);
g_raid_unlock_range(tr->tro_volume,
sd->sd_rebuild_pos, len);
}
@@ -411,7 +402,7 @@ g_raid_tr_raid1_rebuild_start(struct g_r
trs->trso_type = TR_RAID1_REBUILD;
trs->trso_buffer = malloc(g_raid1_rebuild_slab, M_TR_RAID1, M_WAITOK);
trs->trso_meta_update = g_raid1_rebuild_meta_update;
- g_raid_tr_raid1_rebuild_some(tr, trs->trso_failed_sd);
+ g_raid_tr_raid1_rebuild_some(tr);
}
@@ -511,10 +502,9 @@ g_raid_tr_raid1_select_read_disk(struct
for (i = 0; i < vol->v_disks_count; i++) {
sd = &vol->v_subdisks[i];
if (sd->sd_state != G_RAID_SUBDISK_S_ACTIVE &&
- !((sd->sd_state == G_RAID_SUBDISK_S_REBUILD ||
- sd->sd_state == G_RAID_SUBDISK_S_RESYNC) &&
- bp->bio_offset + bp->bio_length <
- sd->sd_rebuild_pos))
+ ((sd->sd_state != G_RAID_SUBDISK_S_REBUILD &&
+ sd->sd_state != G_RAID_SUBDISK_S_RESYNC) ||
+ bp->bio_offset + bp->bio_length > sd->sd_rebuild_pos))
continue;
if ((mask & (1 << i)) != 0)
continue;
@@ -601,17 +591,8 @@ g_raid_tr_iostart_raid1_write(struct g_r
continue;
}
cbp = g_clone_bio(bp);
- if (cbp == NULL) {
- for (cbp = bioq_first(&queue); cbp != NULL;
- cbp = bioq_first(&queue)) {
- bioq_remove(&queue, cbp);
- g_destroy_bio(cbp);
- }
- if (bp->bio_error == 0)
- bp->bio_error = ENOMEM;
- g_raid_iodone(bp, bp->bio_error);
- return;
- }
+ if (cbp == NULL)
+ goto failure;
cbp->bio_caller1 = sd;
bioq_insert_tail(&queue, cbp);
}
@@ -622,7 +603,16 @@ g_raid_tr_iostart_raid1_write(struct g_r
cbp->bio_caller1 = NULL;
g_raid_subdisk_iostart(sd, cbp);
}
-
+ return;
+failure:
+ for (cbp = bioq_first(&queue); cbp != NULL;
+ cbp = bioq_first(&queue)) {
+ bioq_remove(&queue, cbp);
+ g_destroy_bio(cbp);
+ }
+ if (bp->bio_error == 0)
+ bp->bio_error = ENOMEM;
+ g_raid_iodone(bp, bp->bio_error);
}
static void
@@ -647,10 +637,12 @@ g_raid_tr_iostart_raid1(struct g_raid_tr
*/
if (trs->trso_failed_sd != NULL &&
!(bp->bio_cflags & G_RAID_BIO_FLAG_SPECIAL)) {
- if (--trs->trso_fair_io <= 0)
- g_raid_tr_raid1_rebuild_some(tr, trs->trso_failed_sd);
/* Make this new or running now round short. */
trs->trso_recover_slabs = 0;
+ if (--trs->trso_fair_io <= 0) {
+ trs->trso_fair_io = g_raid1_rebuild_fair_io;
+ g_raid_tr_raid1_rebuild_some(tr);
+ }
}
switch (bp->bio_cmd) {
case BIO_READ:
@@ -662,6 +654,9 @@ g_raid_tr_iostart_raid1(struct g_raid_tr
case BIO_DELETE:
g_raid_iodone(bp, EIO);
break;
+ case BIO_FLUSH:
+ g_raid_tr_flush_common(tr, bp);
+ break;
default:
KASSERT(1 == 0, ("Invalid command here: %u (volume=%s)",
bp->bio_cmd, vol->v_name));
@@ -674,7 +669,7 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
struct g_raid_subdisk *sd, struct bio *bp)
{
struct bio *cbp;
- struct g_raid_subdisk *nsd, *good_sd;
+ struct g_raid_subdisk *nsd;
struct g_raid_volume *vol;
struct bio *pbp;
struct g_raid_tr_raid1_object *trs;
@@ -751,14 +746,13 @@ g_raid_tr_iodone_raid1(struct g_raid_tr_
g_raid_tr_raid1_rebuild_abort(tr);
return;
}
-/* XXX A lot of the following is needed when we kick of the work -- refactor */
rebuild_round_done:
nsd = trs->trso_failed_sd;
trs->trso_flags &= ~TR_RAID1_F_LOCKED;
g_raid_unlock_range(sd->sd_volume,
bp->bio_offset, bp->bio_length);
nsd->sd_rebuild_pos += bp->bio_length;
- if (nsd->sd_rebuild_pos >= vol->v_mediasize) {
+ if (nsd->sd_rebuild_pos >= nsd->sd_size) {
g_raid_tr_raid1_rebuild_finish(tr);
return;
}
@@ -776,29 +770,10 @@ rebuild_round_done:
trs->trso_meta_update =
g_raid1_rebuild_meta_update;
}
- if (--trs->trso_recover_slabs <= 0) {
- trs->trso_flags &= ~TR_RAID1_F_DOING_SOME;
+ trs->trso_flags &= ~TR_RAID1_F_DOING_SOME;
+ if (--trs->trso_recover_slabs <= 0)
return;
- }
- good_sd = g_raid_get_subdisk(sd->sd_volume,
- G_RAID_SUBDISK_S_ACTIVE);
- if (good_sd == NULL) {
- trs->trso_flags &= ~TR_RAID1_F_DOING_SOME;
- g_raid_tr_raid1_rebuild_abort(tr);
- return;
- }
- bp->bio_cmd = BIO_READ;
- bp->bio_cflags = G_RAID_BIO_FLAG_SYNC;
- bp->bio_offset = nsd->sd_rebuild_pos;
- bp->bio_length = MIN(g_raid1_rebuild_slab,
- vol->v_mediasize - nsd->sd_rebuild_pos);
- bp->bio_caller1 = good_sd;
- G_RAID_LOGREQ(4, bp,
- "Rebuild read at %jd.", bp->bio_offset);
- /* Lock callback starts I/O */
- trs->trso_flags |= TR_RAID1_F_LOCKED;
- g_raid_lock_range(sd->sd_volume,
- bp->bio_offset, bp->bio_length, NULL, bp);
+ g_raid_tr_raid1_rebuild_some(tr);
}
} else if (trs->trso_type == TR_RAID1_RESYNC) {
/*
@@ -830,7 +805,7 @@ rebuild_round_done:
* drive, which kicks off a resync?
*/
do_write = 1;
- if (sd->sd_disk->d_read_errs > g_raid1_read_err_thresh) {
+ if (sd->sd_disk->d_read_errs > g_raid_read_err_thresh) {
g_raid_tr_raid1_fail_disk(sd->sd_softc, sd, sd->sd_disk);
if (pbp->bio_children == 1)
do_write = 0;
@@ -848,6 +823,7 @@ rebuild_round_done:
*mask |= 1 << sd->sd_pos;
nsd = g_raid_tr_raid1_select_read_disk(vol, pbp, *mask);
if (nsd != NULL && (cbp = g_clone_bio(pbp)) != NULL) {
+ g_destroy_bio(bp);
G_RAID_LOGREQ(2, cbp, "Retrying read from %d",
nsd->sd_pos);
if (pbp->bio_children == 2 && do_write) {
@@ -888,6 +864,7 @@ rebuild_round_done:
G_RAID_LOGREQ(3, bp, "Recovered data from other drive");
cbp = g_clone_bio(pbp);
if (cbp != NULL) {
+ g_destroy_bio(bp);
cbp->bio_cmd = BIO_WRITE;
cbp->bio_cflags = G_RAID_BIO_FLAG_REMAP;
G_RAID_LOGREQ(2, cbp,
@@ -928,7 +905,7 @@ rebuild_round_done:
}
}
-int
+static int
g_raid_tr_kerneldump_raid1(struct g_raid_tr_object *tr,
void *virtual, vm_offset_t physical, off_t offset, size_t length)
{
@@ -992,8 +969,10 @@ g_raid_tr_idle_raid1(struct g_raid_tr_ob
struct g_raid_tr_raid1_object *trs;
trs = (struct g_raid_tr_raid1_object *)tr;
+ trs->trso_fair_io = g_raid1_rebuild_fair_io;
+ trs->trso_recover_slabs = g_raid1_rebuild_cluster_idle;
if (trs->trso_type == TR_RAID1_REBUILD)
- g_raid_tr_raid1_rebuild_some(tr, trs->trso_failed_sd);
+ g_raid_tr_raid1_rebuild_some(tr);
return (0);
}
Copied and modified: projects/graid/7/sys/geom/raid/tr_raid1e.c (from r218638, projects/graid/head/sys/geom/raid/tr_raid1e.c)
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid1e.c Sun Feb 13 13:21:55 2011 (r218638, copy source)
+++ projects/graid/7/sys/geom/raid/tr_raid1e.c Mon Feb 14 14:26:14 2011 (r218680)
@@ -101,6 +101,8 @@ struct g_raid_tr_raid1e_object {
int trso_flags;
struct g_raid_subdisk *trso_failed_sd; /* like per volume */
void *trso_buffer; /* Buffer space */
+ off_t trso_lock_pos; /* Locked range start. */
+ off_t trso_lock_len; /* Locked range length. */
struct bio trso_bio;
};
@@ -139,6 +141,8 @@ static struct g_raid_tr_class g_raid_tr_
static void g_raid_tr_raid1e_rebuild_abort(struct g_raid_tr_object *tr);
static void g_raid_tr_raid1e_maybe_rebuild(struct g_raid_tr_object *tr,
struct g_raid_subdisk *sd);
+static int g_raid_tr_raid1e_select_read_disk(struct g_raid_volume *vol,
+ int no, off_t off, off_t len, u_int mask);
static inline void
V2P(struct g_raid_volume *vol, off_t virt,
@@ -202,7 +206,6 @@ g_raid_tr_update_state_raid1e_even(struc
state = G_RAID_VOLUME_S_OPTIMAL;
for (i = 0; i < vol->v_disks_count / N; i++) {
bestsd = &vol->v_subdisks[i * N];
- worstsd = &vol->v_subdisks[i * N];
for (j = 1; j < N; j++) {
sd = &vol->v_subdisks[i * N + j];
if (sd->sd_state > bestsd->sd_state)
@@ -212,8 +215,6 @@ g_raid_tr_update_state_raid1e_even(struc
sd->sd_state == G_RAID_SUBDISK_S_RESYNC) &&
sd->sd_rebuild_pos > bestsd->sd_rebuild_pos)
bestsd = sd;
- if (sd->sd_state < worstsd->sd_state)
- worstsd = sd;
}
if (bestsd->sd_state >= G_RAID_SUBDISK_S_UNINITIALIZED &&
bestsd->sd_state != G_RAID_SUBDISK_S_ACTIVE) {
@@ -227,6 +228,12 @@ g_raid_tr_update_state_raid1e_even(struc
g_raid_write_metadata(sc,
vol, bestsd, bestsd->sd_disk);
}
+ worstsd = &vol->v_subdisks[i * N];
+ for (j = 1; j < N; j++) {
+ sd = &vol->v_subdisks[i * N + j];
+ if (sd->sd_state < worstsd->sd_state)
+ worstsd = sd;
+ }
if (worstsd->sd_state == G_RAID_SUBDISK_S_ACTIVE)
sstate = G_RAID_VOLUME_S_OPTIMAL;
else if (worstsd->sd_state >= G_RAID_SUBDISK_S_STALE)
@@ -317,7 +324,6 @@ g_raid_tr_update_state_raid1e(struct g_r
s = g_raid_tr_update_state_raid1e_even(vol);
else
s = g_raid_tr_update_state_raid1e_odd(vol);
- g_raid_tr_raid1e_maybe_rebuild(vol->v_tr, sd);
}
if (s != vol->v_state) {
g_raid_event_send(vol, G_RAID_VOLUME_S_ALIVE(s) ?
@@ -327,6 +333,8 @@ g_raid_tr_update_state_raid1e(struct g_r
if (!trs->trso_starting && !trs->trso_stopping)
g_raid_write_metadata(sc, vol, NULL, NULL);
}
+ if (!trs->trso_starting && !trs->trso_stopping)
+ g_raid_tr_raid1e_maybe_rebuild(vol->v_tr, sd);
return (0);
}
@@ -350,37 +358,6 @@ g_raid_tr_raid1e_fail_disk(struct g_raid
}
static void
-g_raid_tr_raid1e_rebuild_some(struct g_raid_tr_object *tr)
-{
- struct g_raid_tr_raid1e_object *trs;
- struct g_raid_subdisk *sd, *good_sd;
- struct bio *bp;
-
- trs = (struct g_raid_tr_raid1e_object *)tr;
- if (trs->trso_flags & TR_RAID1E_F_DOING_SOME)
- return;
- sd = trs->trso_failed_sd;
- good_sd = g_raid_get_subdisk(sd->sd_volume, G_RAID_SUBDISK_S_ACTIVE);
- if (good_sd == NULL) {
- g_raid_tr_raid1e_rebuild_abort(tr);
- return;
- }
- bp = &trs->trso_bio;
- memset(bp, 0, sizeof(*bp));
- bp->bio_offset = sd->sd_rebuild_pos;
- bp->bio_length = MIN(g_raid1e_rebuild_slab,
- sd->sd_volume->v_mediasize - sd->sd_rebuild_pos);
- bp->bio_data = trs->trso_buffer;
- bp->bio_cmd = BIO_READ;
- bp->bio_cflags = G_RAID_BIO_FLAG_SYNC;
- bp->bio_caller1 = good_sd;
- trs->trso_flags |= TR_RAID1E_F_DOING_SOME;
- trs->trso_flags |= TR_RAID1E_F_LOCKED;
- g_raid_lock_range(sd->sd_volume, /* Lock callback starts I/O */
- bp->bio_offset, bp->bio_length, NULL, bp);
-}
-
-static void
g_raid_tr_raid1e_rebuild_done(struct g_raid_tr_raid1e_object *trs)
{
struct g_raid_volume *vol;
@@ -421,7 +398,6 @@ g_raid_tr_raid1e_rebuild_abort(struct g_
struct g_raid_tr_raid1e_object *trs;
struct g_raid_subdisk *sd;
struct g_raid_volume *vol;
- off_t len;
vol = tr->tro_volume;
trs = (struct g_raid_tr_raid1e_object *)tr;
@@ -440,21 +416,94 @@ g_raid_tr_raid1e_rebuild_abort(struct g_
trs->trso_flags &= ~TR_RAID1E_F_ABORT;
if (trs->trso_flags & TR_RAID1E_F_LOCKED) {
trs->trso_flags &= ~TR_RAID1E_F_LOCKED;
- len = MIN(g_raid1e_rebuild_slab,
- vol->v_mediasize - sd->sd_rebuild_pos);
g_raid_unlock_range(tr->tro_volume,
- sd->sd_rebuild_pos, len);
+ trs->trso_lock_pos, trs->trso_lock_len);
}
g_raid_tr_raid1e_rebuild_done(trs);
}
}
static void
+g_raid_tr_raid1e_rebuild_some(struct g_raid_tr_object *tr)
+{
+ struct g_raid_tr_raid1e_object *trs;
+ struct g_raid_softc *sc;
+ struct g_raid_volume *vol;
+ struct g_raid_subdisk *sd;
+ struct bio *bp;
+ off_t len, virtual, vend, offset, start;
+ int disk, copy, best;
+
+ trs = (struct g_raid_tr_raid1e_object *)tr;
+ if (trs->trso_flags & TR_RAID1E_F_DOING_SOME)
+ return;
+ vol = tr->tro_volume;
+ sc = vol->v_softc;
+ sd = trs->trso_failed_sd;
+
+ while (1) {
+ if (sd->sd_rebuild_pos >= sd->sd_size) {
+ g_raid_tr_raid1e_rebuild_finish(tr);
+ return;
+ }
+ /* Get virtual offset from physical rebuild position. */
+ P2V(vol, sd->sd_pos, sd->sd_rebuild_pos, &virtual, ©);
+ /* Get physical offset back to get first stripe position. */
+ V2P(vol, virtual, &disk, &offset, &start);
+ /* Calculate contignous data length. */
+ len = MIN(g_raid1e_rebuild_slab,
+ sd->sd_size - sd->sd_rebuild_pos);
+ if ((vol->v_disks_count % N) != 0)
+ len = MIN(len, vol->v_strip_size - start);
+ /* Find disk with most accurate data. */
+ best = g_raid_tr_raid1e_select_read_disk(vol, disk,
+ offset + start, len, 0);
+ if (best < 0) {
+ /* There is no any valid disk. */
+ g_raid_tr_raid1e_rebuild_abort(tr);
+ return;
+ } else if (best != copy) {
+ /* Some other disk has better data. */
+ break;
+ }
+ /* We have the most accurate data. Skip the range. */
+ G_RAID_DEBUG1(3, sc, "Skipping rebuild for range %ju - %ju",
+ sd->sd_rebuild_pos, sd->sd_rebuild_pos + len);
+ sd->sd_rebuild_pos += len;
+ }
+
+ bp = &trs->trso_bio;
+ memset(bp, 0, sizeof(*bp));
+ bp->bio_offset = offset + start +
+ ((disk + best >= vol->v_disks_count) ? vol->v_strip_size : 0);
+ bp->bio_length = len;
+ bp->bio_data = trs->trso_buffer;
+ bp->bio_cmd = BIO_READ;
+ bp->bio_cflags = G_RAID_BIO_FLAG_SYNC;
+ bp->bio_caller1 = &vol->v_subdisks[(disk + best) % vol->v_disks_count];
+ G_RAID_LOGREQ(3, bp, "Queueing rebuild read");
+ /*
+ * If we are crossing stripe boundary, correct affected virtual
+ * range we should lock.
+ */
+ if (start + len > vol->v_strip_size) {
+ P2V(vol, sd->sd_pos, sd->sd_rebuild_pos + len, &vend, ©);
+ len = vend - virtual;
+ }
+ trs->trso_flags |= TR_RAID1E_F_DOING_SOME;
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-projects
mailing list