g_mirror.c (155539) | g_mirror.c (155545) |
---|---|
1/*- 2 * Copyright (c) 2004-2005 Pawel Jakub Dawidek <pjd@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2004-2005 Pawel Jakub Dawidek <pjd@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> |
28__FBSDID("$FreeBSD: head/sys/geom/mirror/g_mirror.c 155539 2006-02-11 14:42:23Z pjd $"); | 28__FBSDID("$FreeBSD: head/sys/geom/mirror/g_mirror.c 155545 2006-02-11 17:39:29Z pjd $"); |
29 30#include <sys/param.h> 31#include <sys/systm.h> 32#include <sys/kernel.h> 33#include <sys/module.h> 34#include <sys/limits.h> 35#include <sys/lock.h> 36#include <sys/mutex.h> --- 28 unchanged lines hidden (view full) --- 65static u_int g_mirror_reqs_per_sync = 5; 66SYSCTL_UINT(_kern_geom_mirror, OID_AUTO, reqs_per_sync, CTLFLAG_RW, 67 &g_mirror_reqs_per_sync, 0, 68 "Number of regular I/O requests per synchronization request"); 69static u_int g_mirror_syncs_per_sec = 1000; 70SYSCTL_UINT(_kern_geom_mirror, OID_AUTO, syncs_per_sec, CTLFLAG_RW, 71 &g_mirror_syncs_per_sec, 0, 72 "Number of synchronizations requests per second"); | 29 30#include <sys/param.h> 31#include <sys/systm.h> 32#include <sys/kernel.h> 33#include <sys/module.h> 34#include <sys/limits.h> 35#include <sys/lock.h> 36#include <sys/mutex.h> --- 28 unchanged lines hidden (view full) --- 65static u_int g_mirror_reqs_per_sync = 5; 66SYSCTL_UINT(_kern_geom_mirror, OID_AUTO, reqs_per_sync, CTLFLAG_RW, 67 &g_mirror_reqs_per_sync, 0, 68 "Number of regular I/O requests per synchronization request"); 69static u_int g_mirror_syncs_per_sec = 1000; 70SYSCTL_UINT(_kern_geom_mirror, OID_AUTO, syncs_per_sec, CTLFLAG_RW, 71 &g_mirror_syncs_per_sec, 0, 72 "Number of synchronizations requests per second"); |
73static u_int g_mirror_disconnect_on_failure = 1; 74TUNABLE_INT("kern.geom.mirror.disconnect_on_failure", 75 &g_mirror_disconnect_on_failure); 76SYSCTL_UINT(_kern_geom_mirror, OID_AUTO, disconnect_on_failure, CTLFLAG_RW, 77 &g_mirror_disconnect_on_failure, 0, "Disconnect component on I/O failure."); |
|
73 74#define MSLEEP(ident, mtx, priority, wmesg, timeout) do { \ 75 G_MIRROR_DEBUG(4, "%s: Sleeping %p.", __func__, (ident)); \ 76 msleep((ident), (mtx), (priority), (wmesg), (timeout)); \ 77 G_MIRROR_DEBUG(4, "%s: Woken up %p.", __func__, (ident)); \ 78} while (0) 79 80static eventhandler_tag g_mirror_ehtag = NULL; --- 539 unchanged lines hidden (view full) --- 620 sector = malloc((size_t)length, M_MIRROR, M_WAITOK | M_ZERO); 621 if (md != NULL) 622 mirror_metadata_encode(md, sector); 623 g_topology_unlock(); 624 error = g_write_data(cp, offset, sector, length); 625 g_topology_lock(); 626 free(sector, M_MIRROR); 627 if (error != 0) { | 78 79#define MSLEEP(ident, mtx, priority, wmesg, timeout) do { \ 80 G_MIRROR_DEBUG(4, "%s: Sleeping %p.", __func__, (ident)); \ 81 msleep((ident), (mtx), (priority), (wmesg), (timeout)); \ 82 G_MIRROR_DEBUG(4, "%s: Woken up %p.", __func__, (ident)); \ 83} while (0) 84 85static eventhandler_tag g_mirror_ehtag = NULL; --- 539 unchanged lines hidden (view full) --- 625 sector = malloc((size_t)length, M_MIRROR, M_WAITOK | M_ZERO); 626 if (md != NULL) 627 mirror_metadata_encode(md, sector); 628 g_topology_unlock(); 629 error = g_write_data(cp, offset, sector, length); 630 g_topology_lock(); 631 free(sector, M_MIRROR); 632 if (error != 0) { |
628 disk->d_softc->sc_bump_id |= G_MIRROR_BUMP_GENID; 629 g_mirror_event_send(disk, G_MIRROR_DISK_STATE_DISCONNECTED, 630 G_MIRROR_EVENT_DONTWAIT); | 633 if ((disk->d_flags & G_MIRROR_DISK_FLAG_BROKEN) == 0) { 634 disk->d_flags |= G_MIRROR_DISK_FLAG_BROKEN; 635 G_MIRROR_DEBUG(0, "Cannot write metadata on %s " 636 "(device=%s, error=%d).", 637 g_mirror_get_diskname(disk), sc->sc_name, error); 638 } else { 639 G_MIRROR_DEBUG(1, "Cannot write metadata on %s " 640 "(device=%s, error=%d).", 641 g_mirror_get_diskname(disk), sc->sc_name, error); 642 } 643 if (g_mirror_disconnect_on_failure && 644 g_mirror_ndisks(sc, G_MIRROR_DISK_STATE_ACTIVE) > 1) { 645 sc->sc_bump_id |= G_MIRROR_BUMP_GENID; 646 g_mirror_event_send(disk, 647 G_MIRROR_DISK_STATE_DISCONNECTED, 648 G_MIRROR_EVENT_DONTWAIT); 649 } |
631 } 632 return (error); 633} 634 635static int 636g_mirror_clear_metadata(struct g_mirror_disk *disk) 637{ 638 int error; --- 240 unchanged lines hidden (view full) --- 879 G_MIRROR_LOGREQ(3, pbp, "Request delivered."); 880 pbp->bio_completed = pbp->bio_length; 881 g_io_deliver(pbp, pbp->bio_error); 882 } 883 return; 884 } else if (bp->bio_error != 0) { 885 if (pbp->bio_error == 0) 886 pbp->bio_error = bp->bio_error; | 650 } 651 return (error); 652} 653 654static int 655g_mirror_clear_metadata(struct g_mirror_disk *disk) 656{ 657 int error; --- 240 unchanged lines hidden (view full) --- 898 G_MIRROR_LOGREQ(3, pbp, "Request delivered."); 899 pbp->bio_completed = pbp->bio_length; 900 g_io_deliver(pbp, pbp->bio_error); 901 } 902 return; 903 } else if (bp->bio_error != 0) { 904 if (pbp->bio_error == 0) 905 pbp->bio_error = bp->bio_error; |
887 G_MIRROR_LOGREQ(0, bp, "Request failed (error=%d).", 888 bp->bio_error); | |
889 if (disk != NULL) { | 906 if (disk != NULL) { |
890 sc->sc_bump_id |= G_MIRROR_BUMP_GENID; 891 g_mirror_event_send(disk, 892 G_MIRROR_DISK_STATE_DISCONNECTED, 893 G_MIRROR_EVENT_DONTWAIT); | 907 if ((disk->d_flags & G_MIRROR_DISK_FLAG_BROKEN) == 0) { 908 disk->d_flags |= G_MIRROR_DISK_FLAG_BROKEN; 909 G_MIRROR_LOGREQ(0, bp, 910 "Request failed (error=%d).", 911 bp->bio_error); 912 } else { 913 G_MIRROR_LOGREQ(1, bp, 914 "Request failed (error=%d).", 915 bp->bio_error); 916 } 917 if (g_mirror_disconnect_on_failure && 918 g_mirror_ndisks(sc, G_MIRROR_DISK_STATE_ACTIVE) > 1) 919 { 920 sc->sc_bump_id |= G_MIRROR_BUMP_GENID; 921 g_mirror_event_send(disk, 922 G_MIRROR_DISK_STATE_DISCONNECTED, 923 G_MIRROR_EVENT_DONTWAIT); 924 } |
894 } 895 switch (pbp->bio_cmd) { 896 case BIO_DELETE: 897 case BIO_WRITE: 898 pbp->bio_inbed--; 899 pbp->bio_children--; 900 break; 901 } 902 } 903 g_destroy_bio(bp); 904 905 switch (pbp->bio_cmd) { 906 case BIO_READ: | 925 } 926 switch (pbp->bio_cmd) { 927 case BIO_DELETE: 928 case BIO_WRITE: 929 pbp->bio_inbed--; 930 pbp->bio_children--; 931 break; 932 } 933 } 934 g_destroy_bio(bp); 935 936 switch (pbp->bio_cmd) { 937 case BIO_READ: |
907 if (pbp->bio_children == pbp->bio_inbed) { | 938 if (pbp->bio_inbed < pbp->bio_children) 939 break; 940 if (g_mirror_ndisks(sc, G_MIRROR_DISK_STATE_ACTIVE) == 1) 941 g_io_deliver(pbp, pbp->bio_error); 942 else { |
908 pbp->bio_error = 0; 909 mtx_lock(&sc->sc_queue_mtx); 910 bioq_disksort(&sc->sc_queue, pbp); 911 G_MIRROR_DEBUG(4, "%s: Waking up %p.", __func__, sc); 912 wakeup(sc); 913 mtx_unlock(&sc->sc_queue_mtx); 914 } 915 break; --- 1818 unchanged lines hidden (view full) --- 2734 } \ 2735} while (0) 2736 ADD_FLAG(G_MIRROR_DISK_FLAG_DIRTY, "DIRTY"); 2737 ADD_FLAG(G_MIRROR_DISK_FLAG_HARDCODED, "HARDCODED"); 2738 ADD_FLAG(G_MIRROR_DISK_FLAG_INACTIVE, "INACTIVE"); 2739 ADD_FLAG(G_MIRROR_DISK_FLAG_SYNCHRONIZING, 2740 "SYNCHRONIZING"); 2741 ADD_FLAG(G_MIRROR_DISK_FLAG_FORCE_SYNC, "FORCE_SYNC"); | 943 pbp->bio_error = 0; 944 mtx_lock(&sc->sc_queue_mtx); 945 bioq_disksort(&sc->sc_queue, pbp); 946 G_MIRROR_DEBUG(4, "%s: Waking up %p.", __func__, sc); 947 wakeup(sc); 948 mtx_unlock(&sc->sc_queue_mtx); 949 } 950 break; --- 1818 unchanged lines hidden (view full) --- 2769 } \ 2770} while (0) 2771 ADD_FLAG(G_MIRROR_DISK_FLAG_DIRTY, "DIRTY"); 2772 ADD_FLAG(G_MIRROR_DISK_FLAG_HARDCODED, "HARDCODED"); 2773 ADD_FLAG(G_MIRROR_DISK_FLAG_INACTIVE, "INACTIVE"); 2774 ADD_FLAG(G_MIRROR_DISK_FLAG_SYNCHRONIZING, 2775 "SYNCHRONIZING"); 2776 ADD_FLAG(G_MIRROR_DISK_FLAG_FORCE_SYNC, "FORCE_SYNC"); |
2777 ADD_FLAG(G_MIRROR_DISK_FLAG_BROKEN, "BROKEN"); |
|
2742#undef ADD_FLAG 2743 } 2744 sbuf_printf(sb, "</Flags>\n"); 2745 sbuf_printf(sb, "%s<Priority>%u</Priority>\n", indent, 2746 disk->d_priority); 2747 sbuf_printf(sb, "%s<State>%s</State>\n", indent, 2748 g_mirror_disk_state2str(disk->d_state)); 2749 } else { --- 81 unchanged lines hidden --- | 2778#undef ADD_FLAG 2779 } 2780 sbuf_printf(sb, "</Flags>\n"); 2781 sbuf_printf(sb, "%s<Priority>%u</Priority>\n", indent, 2782 disk->d_priority); 2783 sbuf_printf(sb, "%s<State>%s</State>\n", indent, 2784 g_mirror_disk_state2str(disk->d_state)); 2785 } else { --- 81 unchanged lines hidden --- |