Lines Matching refs:sc
52 struct stripe_c *sc = container_of(work, struct stripe_c, in trigger_event() local
54 dm_table_event(sc->ti->table); in trigger_event()
73 static int get_stripe(struct dm_target *ti, struct stripe_c *sc, in get_stripe() argument
83 &sc->stripe[stripe].dev)) in get_stripe()
86 sc->stripe[stripe].physical_start = start; in get_stripe()
97 struct stripe_c *sc; in stripe_ctr() local
142 sc = alloc_context(stripes); in stripe_ctr()
143 if (!sc) { in stripe_ctr()
149 INIT_WORK(&sc->trigger_event, trigger_event); in stripe_ctr()
152 sc->ti = ti; in stripe_ctr()
153 sc->stripes = stripes; in stripe_ctr()
154 sc->stripe_width = width; in stripe_ctr()
157 sc->stripes_shift = -1; in stripe_ctr()
159 sc->stripes_shift = __ffs(stripes); in stripe_ctr()
163 kfree(sc); in stripe_ctr()
171 sc->chunk_size = chunk_size; in stripe_ctr()
173 sc->chunk_size_shift = -1; in stripe_ctr()
175 sc->chunk_size_shift = __ffs(chunk_size); in stripe_ctr()
183 r = get_stripe(ti, sc, i, argv); in stripe_ctr()
187 dm_put_device(ti, sc->stripe[i].dev); in stripe_ctr()
188 kfree(sc); in stripe_ctr()
191 atomic_set(&(sc->stripe[i].error_count), 0); in stripe_ctr()
194 ti->private = sc; in stripe_ctr()
202 struct stripe_c *sc = (struct stripe_c *) ti->private; in stripe_dtr() local
204 for (i = 0; i < sc->stripes; i++) in stripe_dtr()
205 dm_put_device(ti, sc->stripe[i].dev); in stripe_dtr()
207 flush_work(&sc->trigger_event); in stripe_dtr()
208 kfree(sc); in stripe_dtr()
211 static void stripe_map_sector(struct stripe_c *sc, sector_t sector, in stripe_map_sector() argument
214 sector_t chunk = dm_target_offset(sc->ti, sector); in stripe_map_sector()
217 if (sc->chunk_size_shift < 0) in stripe_map_sector()
218 chunk_offset = sector_div(chunk, sc->chunk_size); in stripe_map_sector()
220 chunk_offset = chunk & (sc->chunk_size - 1); in stripe_map_sector()
221 chunk >>= sc->chunk_size_shift; in stripe_map_sector()
224 if (sc->stripes_shift < 0) in stripe_map_sector()
225 *stripe = sector_div(chunk, sc->stripes); in stripe_map_sector()
227 *stripe = chunk & (sc->stripes - 1); in stripe_map_sector()
228 chunk >>= sc->stripes_shift; in stripe_map_sector()
231 if (sc->chunk_size_shift < 0) in stripe_map_sector()
232 chunk *= sc->chunk_size; in stripe_map_sector()
234 chunk <<= sc->chunk_size_shift; in stripe_map_sector()
239 static void stripe_map_range_sector(struct stripe_c *sc, sector_t sector, in stripe_map_range_sector() argument
244 stripe_map_sector(sc, sector, &stripe, result); in stripe_map_range_sector()
250 if (sc->chunk_size_shift < 0) in stripe_map_range_sector()
251 *result -= sector_div(sector, sc->chunk_size); in stripe_map_range_sector()
253 *result = sector & ~(sector_t)(sc->chunk_size - 1); in stripe_map_range_sector()
256 *result += sc->chunk_size; /* next chunk */ in stripe_map_range_sector()
259 static int stripe_map_range(struct stripe_c *sc, struct bio *bio, in stripe_map_range() argument
264 stripe_map_range_sector(sc, bio->bi_iter.bi_sector, in stripe_map_range()
266 stripe_map_range_sector(sc, bio_end_sector(bio), in stripe_map_range()
269 bio->bi_bdev = sc->stripe[target_stripe].dev->bdev; in stripe_map_range()
271 sc->stripe[target_stripe].physical_start; in stripe_map_range()
283 struct stripe_c *sc = ti->private; in stripe_map() local
289 BUG_ON(target_bio_nr >= sc->stripes); in stripe_map()
290 bio->bi_bdev = sc->stripe[target_bio_nr].dev->bdev; in stripe_map()
296 BUG_ON(target_bio_nr >= sc->stripes); in stripe_map()
297 return stripe_map_range(sc, bio, target_bio_nr); in stripe_map()
300 stripe_map_sector(sc, bio->bi_iter.bi_sector, in stripe_map()
303 bio->bi_iter.bi_sector += sc->stripe[stripe].physical_start; in stripe_map()
304 bio->bi_bdev = sc->stripe[stripe].dev->bdev; in stripe_map()
325 struct stripe_c *sc = (struct stripe_c *) ti->private; in stripe_status() local
326 char buffer[sc->stripes + 1]; in stripe_status()
332 DMEMIT("%d ", sc->stripes); in stripe_status()
333 for (i = 0; i < sc->stripes; i++) { in stripe_status()
334 DMEMIT("%s ", sc->stripe[i].dev->name); in stripe_status()
335 buffer[i] = atomic_read(&(sc->stripe[i].error_count)) ? in stripe_status()
343 DMEMIT("%d %llu", sc->stripes, in stripe_status()
344 (unsigned long long)sc->chunk_size); in stripe_status()
345 for (i = 0; i < sc->stripes; i++) in stripe_status()
346 DMEMIT(" %s %llu", sc->stripe[i].dev->name, in stripe_status()
347 (unsigned long long)sc->stripe[i].physical_start); in stripe_status()
356 struct stripe_c *sc = ti->private; in stripe_end_io() local
378 for (i = 0; i < sc->stripes; i++) in stripe_end_io()
379 if (!strcmp(sc->stripe[i].dev->name, major_minor)) { in stripe_end_io()
380 atomic_inc(&(sc->stripe[i].error_count)); in stripe_end_io()
381 if (atomic_read(&(sc->stripe[i].error_count)) < in stripe_end_io()
383 schedule_work(&sc->trigger_event); in stripe_end_io()
392 struct stripe_c *sc = ti->private; in stripe_iterate_devices() local
397 ret = fn(ti, sc->stripe[i].dev, in stripe_iterate_devices()
398 sc->stripe[i].physical_start, in stripe_iterate_devices()
399 sc->stripe_width, data); in stripe_iterate_devices()
400 } while (!ret && ++i < sc->stripes); in stripe_iterate_devices()
408 struct stripe_c *sc = ti->private; in stripe_io_hints() local
409 unsigned chunk_size = sc->chunk_size << SECTOR_SHIFT; in stripe_io_hints()
412 blk_limits_io_opt(limits, chunk_size * sc->stripes); in stripe_io_hints()
418 struct stripe_c *sc = ti->private; in stripe_merge() local
423 stripe_map_sector(sc, bvm_sector, &stripe, &bvm_sector); in stripe_merge()
425 q = bdev_get_queue(sc->stripe[stripe].dev->bdev); in stripe_merge()
429 bvm->bi_bdev = sc->stripe[stripe].dev->bdev; in stripe_merge()
430 bvm->bi_sector = sc->stripe[stripe].physical_start + bvm_sector; in stripe_merge()