Lines Matching refs:sd
73 sr_raid5_discipline_init(struct sr_discipline *sd) in sr_raid5_discipline_init() argument
76 sd->sd_type = SR_MD_RAID5; in sr_raid5_discipline_init()
77 strlcpy(sd->sd_name, "RAID 5", sizeof(sd->sd_name)); in sr_raid5_discipline_init()
78 sd->sd_capabilities = SR_CAP_SYSTEM_DISK | SR_CAP_AUTO_ASSEMBLE | in sr_raid5_discipline_init()
80 sd->sd_max_wu = SR_RAID5_NOWU + 2; /* Two for scrub/rebuild. */ in sr_raid5_discipline_init()
83 sd->sd_assemble = sr_raid5_assemble; in sr_raid5_discipline_init()
84 sd->sd_create = sr_raid5_create; in sr_raid5_discipline_init()
85 sd->sd_openings = sr_raid5_openings; in sr_raid5_discipline_init()
86 sd->sd_rebuild = sr_raid5_rebuild; in sr_raid5_discipline_init()
87 sd->sd_scsi_rw = sr_raid5_rw; in sr_raid5_discipline_init()
88 sd->sd_scsi_intr = sr_raid5_intr; in sr_raid5_discipline_init()
89 sd->sd_scsi_wu_done = sr_raid5_wu_done; in sr_raid5_discipline_init()
90 sd->sd_set_chunk_state = sr_raid5_set_chunk_state; in sr_raid5_discipline_init()
91 sd->sd_set_vol_state = sr_raid5_set_vol_state; in sr_raid5_discipline_init()
95 sr_raid5_create(struct sr_discipline *sd, struct bioc_createraid *bc, in sr_raid5_create() argument
99 sr_error(sd->sd_sc, "%s requires three or more chunks", in sr_raid5_create()
100 sd->sd_name); in sr_raid5_create()
108 sd->sd_meta->ssdi.ssd_strip_size = MAXPHYS; in sr_raid5_create()
109 sd->sd_meta->ssdi.ssd_size = (coerced_size & in sr_raid5_create()
110 ~(((u_int64_t)sd->sd_meta->ssdi.ssd_strip_size >> in sr_raid5_create()
113 return sr_raid5_init(sd); in sr_raid5_create()
117 sr_raid5_assemble(struct sr_discipline *sd, struct bioc_createraid *bc, in sr_raid5_assemble() argument
120 return sr_raid5_init(sd); in sr_raid5_assemble()
124 sr_raid5_init(struct sr_discipline *sd) in sr_raid5_init() argument
127 sd->mds.mdd_raid5.sr5_strip_bits = in sr_raid5_init()
128 sr_validate_stripsize(sd->sd_meta->ssdi.ssd_strip_size); in sr_raid5_init()
129 if (sd->mds.mdd_raid5.sr5_strip_bits == -1) { in sr_raid5_init()
130 sr_error(sd->sd_sc, "invalid strip size"); in sr_raid5_init()
134 sd->sd_max_ccb_per_wu = sd->sd_meta->ssdi.ssd_chunk_no; in sr_raid5_init()
140 sr_raid5_openings(struct sr_discipline *sd) in sr_raid5_openings() argument
143 return ((sd->sd_max_wu - 2) >> 1); in sr_raid5_openings()
147 sr_raid5_set_chunk_state(struct sr_discipline *sd, int c, int new_state) in sr_raid5_set_chunk_state() argument
152 DEVNAME(sd->sd_sc), sd->sd_meta->ssd_devname, in sr_raid5_set_chunk_state()
153 sd->sd_vol.sv_chunks[c]->src_meta.scmi.scm_devname, c, new_state); in sr_raid5_set_chunk_state()
157 old_state = sd->sd_vol.sv_chunks[c]->src_meta.scm_status; in sr_raid5_set_chunk_state()
205 DEVNAME(sd->sd_sc), in sr_raid5_set_chunk_state()
206 sd->sd_meta->ssd_devname, in sr_raid5_set_chunk_state()
207 sd->sd_vol.sv_chunks[c]->src_meta.scmi.scm_devname, in sr_raid5_set_chunk_state()
212 sd->sd_vol.sv_chunks[c]->src_meta.scm_status = new_state; in sr_raid5_set_chunk_state()
213 sd->sd_set_vol_state(sd); in sr_raid5_set_chunk_state()
215 sd->sd_must_flush = 1; in sr_raid5_set_chunk_state()
216 task_add(systq, &sd->sd_meta_save_task); in sr_raid5_set_chunk_state()
222 sr_raid5_set_vol_state(struct sr_discipline *sd) in sr_raid5_set_vol_state() argument
226 int old_state = sd->sd_vol_status; in sr_raid5_set_vol_state()
229 DEVNAME(sd->sd_sc), sd->sd_meta->ssd_devname); in sr_raid5_set_vol_state()
231 nd = sd->sd_meta->ssdi.ssd_chunk_no; in sr_raid5_set_vol_state()
237 s = sd->sd_vol.sv_chunks[i]->src_meta.scm_status; in sr_raid5_set_vol_state()
240 DEVNAME(sd->sd_sc), in sr_raid5_set_vol_state()
241 sd->sd_meta->ssd_devname, in sr_raid5_set_vol_state()
242 sd->sd_vol.sv_chunks[i]->src_meta.scmi.scm_devname); in sr_raid5_set_vol_state()
259 "was %d\n", DEVNAME(sd->sd_sc), old_state); in sr_raid5_set_vol_state()
262 DEVNAME(sd->sd_sc), i, in sr_raid5_set_vol_state()
263 sd->sd_vol.sv_chunks[i]->src_meta.scm_status); in sr_raid5_set_vol_state()
269 DEVNAME(sd->sd_sc), sd->sd_meta->ssd_devname, in sr_raid5_set_vol_state()
338 DEVNAME(sd->sd_sc), sd->sd_meta->ssd_devname, in sr_raid5_set_vol_state()
343 sd->sd_vol_status = new_state; in sr_raid5_set_vol_state()
347 sr_raid5_chunk_online(struct sr_discipline *sd, int chunk) in sr_raid5_chunk_online() argument
349 switch (sd->sd_vol.sv_chunks[chunk]->src_meta.scm_status) { in sr_raid5_chunk_online()
359 sr_raid5_chunk_rebuild(struct sr_discipline *sd, int chunk) in sr_raid5_chunk_rebuild() argument
361 switch (sd->sd_vol.sv_chunks[chunk]->src_meta.scm_status) { in sr_raid5_chunk_rebuild()
373 struct sr_discipline *sd = wu->swu_dis; in sr_raid5_rw() local
390 DEVNAME(sd->sd_sc), sd->sd_meta->ssd_devname, in sr_raid5_rw()
394 strip_size = sd->sd_meta->ssdi.ssd_strip_size; in sr_raid5_rw()
395 strip_bits = sd->mds.mdd_raid5.sr5_strip_bits; in sr_raid5_rw()
396 no_chunk = sd->sd_meta->ssdi.ssd_chunk_no - 1; in sr_raid5_rw()
404 if ((wu_r = sr_scsi_wu_get(sd, SCSI_NOSLEEP)) == NULL){ in sr_raid5_rw()
406 DEVNAME(sd->sd_sc), sd->sd_meta->ssd_devname); in sr_raid5_rw()
440 scp = sd->sd_vol.sv_chunks[chunk]; in sr_raid5_rw()
462 DEVNAME(sd->sd_sc)); in sr_raid5_rw()
486 TAILQ_INSERT_TAIL(&sd->sd_wu_defq, wu, swu_link); in sr_raid5_rw()
490 sr_scsi_wu_put(sd, wu_r); in sr_raid5_rw()
502 sr_scsi_wu_put(sd, wu_r); in sr_raid5_rw()
510 struct sr_discipline *sd = wu->swu_dis; in sr_raid5_regenerate() local
521 DEVNAME(sd->sd_sc), sd->sd_meta->ssd_devname, chunk, blkno); in sr_raid5_regenerate()
524 for (i = 0; i < sd->sd_meta->ssdi.ssd_chunk_no; i++) { in sr_raid5_regenerate()
527 if (!sr_raid5_chunk_online(sd, i)) in sr_raid5_regenerate()
544 struct sr_discipline *sd = wu->swu_dis; in sr_raid5_write() local
584 "blkno %llu\n", DEVNAME(sd->sd_sc), sd->sd_meta->ssd_devname, in sr_raid5_write()
587 chunk_online = sr_raid5_chunk_online(sd, chunk); in sr_raid5_write()
588 chunk_rebuild = sr_raid5_chunk_rebuild(sd, chunk); in sr_raid5_write()
589 parity_online = sr_raid5_chunk_online(sd, parity); in sr_raid5_write()
590 parity_rebuild = sr_raid5_chunk_rebuild(sd, parity); in sr_raid5_write()
592 for (i = 0; i < sd->sd_meta->ssdi.ssd_chunk_no; i++) { in sr_raid5_write()
595 if (sr_raid5_chunk_rebuild(sd, i)) in sr_raid5_write()
597 else if (!sr_raid5_chunk_online(sd, i)) in sr_raid5_write()
602 "other offline %d\n", DEVNAME(sd->sd_sc), sd->sd_meta->ssd_devname, in sr_raid5_write()
608 xorbuf = sr_block_get(sd, len); in sr_raid5_write()
631 for (i = 0; i < sd->sd_meta->ssdi.ssd_chunk_no; i++) { in sr_raid5_write()
664 struct sr_discipline *sd = wu->swu_dis; in sr_raid5_intr() local
668 DEVNAME(sd->sd_sc), bp, wu->swu_xs); in sr_raid5_intr()
682 sr_block_put(sd, ccb->ccb_buf.b_data, ccb->ccb_buf.b_bcount); in sr_raid5_intr()
693 struct sr_discipline *sd = wu->swu_dis; in sr_raid5_wu_done() local
708 sd->sd_meta->ssd_devname, (long long)wu->swu_blk_start); in sr_raid5_wu_done()
711 if (sd->sd_scsi_rw(wu) == 0) in sr_raid5_wu_done()
716 sd->sd_meta->ssd_devname, (long long)wu->swu_blk_start); in sr_raid5_wu_done()
729 struct sr_discipline *sd = wu->swu_dis; in sr_raid5_addio() local
738 data = sr_block_get(sd, len); in sr_raid5_addio()
744 ccb = sr_ccb_rw(sd, chunk, blkno, len, data, xsflags, ccbflags); in sr_raid5_addio()
747 sr_block_put(sd, data, len); in sr_raid5_addio()
767 sr_raid5_rebuild(struct sr_discipline *sd) in sr_raid5_rebuild() argument
777 for (i = 0; i < sd->sd_meta->ssdi.ssd_chunk_no; i++) { in sr_raid5_rebuild()
778 if (sr_raid5_chunk_rebuild(sd, i)) { in sr_raid5_rebuild()
786 strip_size = sd->sd_meta->ssdi.ssd_strip_size; in sr_raid5_rebuild()
787 strip_bits = sd->mds.mdd_raid5.sr5_strip_bits; in sr_raid5_rebuild()
788 chunk_count = sd->sd_meta->ssdi.ssd_chunk_no - 1; in sr_raid5_rebuild()
789 chunk_size = sd->sd_meta->ssdi.ssd_size / chunk_count; in sr_raid5_rebuild()
795 "row size = %lld\n", DEVNAME(sd->sd_sc), sd->sd_meta->ssd_devname, in sr_raid5_rebuild()
796 sd->sd_meta->ssdi.ssd_size, chunk_count, chunk_size, chunk_strips, in sr_raid5_rebuild()
799 restart = sd->sd_meta->ssd_rebuild / row_size; in sr_raid5_rebuild()
802 DEVNAME(sd->sd_sc)); in sr_raid5_rebuild()
806 percent = sr_rebuild_percent(sd); in sr_raid5_rebuild()
808 DEVNAME(sd->sd_sc), sd->sd_meta->ssd_devname, percent); in sr_raid5_rebuild()
815 "chunk lba = %lld\n", DEVNAME(sd->sd_sc), in sr_raid5_rebuild()
816 sd->sd_meta->ssd_devname, strip_no, chunk_lba); in sr_raid5_rebuild()
818 wu_w = sr_scsi_wu_get(sd, 0); in sr_raid5_rebuild()
819 wu_r = sr_scsi_wu_get(sd, 0); in sr_raid5_rebuild()
821 xorbuf = sr_block_get(sd, strip_size); in sr_raid5_rebuild()
845 "swu_blk_end = %lld\n", DEVNAME(sd->sd_sc), in sr_raid5_rebuild()
846 sd->sd_meta->ssd_devname, in sr_raid5_rebuild()
850 TAILQ_INSERT_TAIL(&sd->sd_wu_defq, wu_w, swu_link); in sr_raid5_rebuild()
861 tsleep_nsec(sd->sd_sc, PWAIT, "sr_yield", in sr_raid5_rebuild()
865 sr_scsi_wu_put(sd, wu_r); in sr_raid5_rebuild()
866 sr_scsi_wu_put(sd, wu_w); in sr_raid5_rebuild()
868 sd->sd_meta->ssd_rebuild = chunk_lba * chunk_count; in sr_raid5_rebuild()
870 percent = sr_rebuild_percent(sd); in sr_raid5_rebuild()
872 if (sr_meta_save(sd, SR_META_DIRTY)) in sr_raid5_rebuild()
874 DEVNAME(sd->sd_sc), in sr_raid5_rebuild()
875 sd->sd_meta->ssd_devname); in sr_raid5_rebuild()
879 if (sd->sd_reb_abort) in sr_raid5_rebuild()
883 DNPRINTF(SR_D_REBUILD, "%s: %s rebuild complete\n", DEVNAME(sd->sd_sc), in sr_raid5_rebuild()
884 sd->sd_meta->ssd_devname); in sr_raid5_rebuild()
887 sd->sd_meta->ssd_rebuild = 0; in sr_raid5_rebuild()
888 for (i = 0; i < sd->sd_meta->ssdi.ssd_chunk_no; i++) { in sr_raid5_rebuild()
889 if (sd->sd_vol.sv_chunks[i]->src_meta.scm_status == in sr_raid5_rebuild()
891 sd->sd_set_chunk_state(sd, i, BIOC_SDONLINE); in sr_raid5_rebuild()
899 if (sr_meta_save(sd, SR_META_DIRTY)) in sr_raid5_rebuild()
901 DEVNAME(sd->sd_sc), sd->sd_meta->ssd_devname); in sr_raid5_rebuild()
908 sr_raid5_scrub(struct sr_discipline *sd)
916 wu_w = sr_scsi_wu_get(sd, 0);
917 wu_r = sr_scsi_wu_get(sd, 0);
919 no_chunk = sd->sd_meta->ssdi.ssd_chunk_no - 1;
920 strip_size = sd->sd_meta->ssdi.ssd_strip_size;
921 strip_bits = sd->mds.mdd_raid5.sr5_strip_bits;
922 max_strip = sd->sd_meta->ssdi.ssd_size >> strip_bits;
927 xorbuf = sr_block_get(sd, strip_size);
944 TAILQ_INSERT_TAIL(&sd->sd_wu_defq, wu_w, swu_link);
956 tsleep_nsec(sd->sd_sc, PWAIT, "sr_yield",