static void process_suspend_info(struct mddev *mddev, int slot, sector_t lo, sector_t hi) { struct md_cluster_info *cinfo = mddev->cluster_info; struct suspend_info *s; if (!hi) { remove_suspend_info(mddev, slot); set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); md_wakeup_thread(mddev->thread); return; } s = kzalloc(sizeof(struct suspend_info), GFP_KERNEL); if (!s) return; s->slot = slot; s->lo = lo; s->hi = hi; mddev->pers->quiesce(mddev, 1); mddev->pers->quiesce(mddev, 0); spin_lock_irq(&cinfo->suspend_lock); /* Remove existing entry (if exists) before adding */ __remove_suspend_info(cinfo, slot); list_add(&s->list, &cinfo->suspend_list); spin_unlock_irq(&cinfo->suspend_lock); mddev->pers->quiesce(mddev, 2); }
static void remove_suspend_info(struct mddev *mddev, int slot) { struct md_cluster_info *cinfo = mddev->cluster_info; spin_lock_irq(&cinfo->suspend_lock); __remove_suspend_info(cinfo, slot); spin_unlock_irq(&cinfo->suspend_lock); mddev->pers->quiesce(mddev, 2); }
static void process_suspend_info(struct mddev *mddev, int slot, sector_t lo, sector_t hi) { struct md_cluster_info *cinfo = mddev->cluster_info; struct suspend_info *s; if (!hi) { remove_suspend_info(mddev, slot); set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); md_wakeup_thread(mddev->thread); return; } /* * The bitmaps are not same for different nodes * if RESYNCING is happening in one node, then * the node which received the RESYNCING message * probably will perform resync with the region * [lo, hi] again, so we could reduce resync time * a lot if we can ensure that the bitmaps among * different nodes are match up well. * * sync_low/hi is used to record the region which * arrived in the previous RESYNCING message, * * Call bitmap_sync_with_cluster to clear * NEEDED_MASK and set RESYNC_MASK since * resync thread is running in another node, * so we don't need to do the resync again * with the same section */ bitmap_sync_with_cluster(mddev, cinfo->sync_low, cinfo->sync_hi, lo, hi); cinfo->sync_low = lo; cinfo->sync_hi = hi; s = kzalloc(sizeof(struct suspend_info), GFP_KERNEL); if (!s) return; s->slot = slot; s->lo = lo; s->hi = hi; mddev->pers->quiesce(mddev, 1); mddev->pers->quiesce(mddev, 0); spin_lock_irq(&cinfo->suspend_lock); /* Remove existing entry (if exists) before adding */ __remove_suspend_info(cinfo, slot); list_add(&s->list, &cinfo->suspend_list); spin_unlock_irq(&cinfo->suspend_lock); mddev->pers->quiesce(mddev, 2); }
static void process_suspend_info(struct md_cluster_info *cinfo, int slot, sector_t lo, sector_t hi) { struct suspend_info *s; if (!hi) { remove_suspend_info(cinfo, slot); return; } s = kzalloc(sizeof(struct suspend_info), GFP_KERNEL); if (!s) return; s->slot = slot; s->lo = lo; s->hi = hi; spin_lock_irq(&cinfo->suspend_lock); /* Remove existing entry (if exists) before adding */ __remove_suspend_info(cinfo, slot); list_add(&s->list, &cinfo->suspend_list); spin_unlock_irq(&cinfo->suspend_lock); }
static void remove_suspend_info(struct md_cluster_info *cinfo, int slot) { spin_lock_irq(&cinfo->suspend_lock); __remove_suspend_info(cinfo, slot); spin_unlock_irq(&cinfo->suspend_lock); }