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
84 &sc->stripe[stripe].dev); in get_stripe()
88 sc->stripe[stripe].physical_start = start; in get_stripe()
99 struct stripe_c *sc; in stripe_ctr() local
144 sc = alloc_context(stripes); in stripe_ctr()
145 if (!sc) { in stripe_ctr()
151 INIT_WORK(&sc->trigger_event, trigger_event); in stripe_ctr()
154 sc->ti = ti; in stripe_ctr()
155 sc->stripes = stripes; in stripe_ctr()
156 sc->stripe_width = width; in stripe_ctr()
159 sc->stripes_shift = -1; in stripe_ctr()
161 sc->stripes_shift = __ffs(stripes); in stripe_ctr()
165 kfree(sc); in stripe_ctr()
173 sc->chunk_size = chunk_size; in stripe_ctr()
175 sc->chunk_size_shift = -1; in stripe_ctr()
177 sc->chunk_size_shift = __ffs(chunk_size); in stripe_ctr()
185 r = get_stripe(ti, sc, i, argv); in stripe_ctr()
189 dm_put_device(ti, sc->stripe[i].dev); in stripe_ctr()
190 kfree(sc); in stripe_ctr()
193 atomic_set(&(sc->stripe[i].error_count), 0); in stripe_ctr()
196 ti->private = sc; in stripe_ctr()
204 struct stripe_c *sc = (struct stripe_c *) ti->private; in stripe_dtr() local
206 for (i = 0; i < sc->stripes; i++) in stripe_dtr()
207 dm_put_device(ti, sc->stripe[i].dev); in stripe_dtr()
209 flush_work(&sc->trigger_event); in stripe_dtr()
210 kfree(sc); in stripe_dtr()
213 static void stripe_map_sector(struct stripe_c *sc, sector_t sector, in stripe_map_sector() argument
216 sector_t chunk = dm_target_offset(sc->ti, sector); in stripe_map_sector()
219 if (sc->chunk_size_shift < 0) in stripe_map_sector()
220 chunk_offset = sector_div(chunk, sc->chunk_size); in stripe_map_sector()
222 chunk_offset = chunk & (sc->chunk_size - 1); in stripe_map_sector()
223 chunk >>= sc->chunk_size_shift; in stripe_map_sector()
226 if (sc->stripes_shift < 0) in stripe_map_sector()
227 *stripe = sector_div(chunk, sc->stripes); in stripe_map_sector()
229 *stripe = chunk & (sc->stripes - 1); in stripe_map_sector()
230 chunk >>= sc->stripes_shift; in stripe_map_sector()
233 if (sc->chunk_size_shift < 0) in stripe_map_sector()
234 chunk *= sc->chunk_size; in stripe_map_sector()
236 chunk <<= sc->chunk_size_shift; in stripe_map_sector()
241 static void stripe_map_range_sector(struct stripe_c *sc, sector_t sector, in stripe_map_range_sector() argument
246 stripe_map_sector(sc, sector, &stripe, result); in stripe_map_range_sector()
252 if (sc->chunk_size_shift < 0) in stripe_map_range_sector()
253 *result -= sector_div(sector, sc->chunk_size); in stripe_map_range_sector()
255 *result = sector & ~(sector_t)(sc->chunk_size - 1); in stripe_map_range_sector()
258 *result += sc->chunk_size; /* next chunk */ in stripe_map_range_sector()
261 static int stripe_map_range(struct stripe_c *sc, struct bio *bio, in stripe_map_range() argument
266 stripe_map_range_sector(sc, bio->bi_iter.bi_sector, in stripe_map_range()
268 stripe_map_range_sector(sc, bio_end_sector(bio), in stripe_map_range()
271 bio->bi_bdev = sc->stripe[target_stripe].dev->bdev; in stripe_map_range()
273 sc->stripe[target_stripe].physical_start; in stripe_map_range()
285 struct stripe_c *sc = ti->private; in stripe_map() local
291 BUG_ON(target_bio_nr >= sc->stripes); in stripe_map()
292 bio->bi_bdev = sc->stripe[target_bio_nr].dev->bdev; in stripe_map()
298 BUG_ON(target_bio_nr >= sc->stripes); in stripe_map()
299 return stripe_map_range(sc, bio, target_bio_nr); in stripe_map()
302 stripe_map_sector(sc, bio->bi_iter.bi_sector, in stripe_map()
305 bio->bi_iter.bi_sector += sc->stripe[stripe].physical_start; in stripe_map()
306 bio->bi_bdev = sc->stripe[stripe].dev->bdev; in stripe_map()
327 struct stripe_c *sc = (struct stripe_c *) ti->private; in stripe_status() local
328 char buffer[sc->stripes + 1]; in stripe_status()
334 DMEMIT("%d ", sc->stripes); in stripe_status()
335 for (i = 0; i < sc->stripes; i++) { in stripe_status()
336 DMEMIT("%s ", sc->stripe[i].dev->name); in stripe_status()
337 buffer[i] = atomic_read(&(sc->stripe[i].error_count)) ? in stripe_status()
345 DMEMIT("%d %llu", sc->stripes, in stripe_status()
346 (unsigned long long)sc->chunk_size); in stripe_status()
347 for (i = 0; i < sc->stripes; i++) in stripe_status()
348 DMEMIT(" %s %llu", sc->stripe[i].dev->name, in stripe_status()
349 (unsigned long long)sc->stripe[i].physical_start); in stripe_status()
358 struct stripe_c *sc = ti->private; in stripe_end_io() local
380 for (i = 0; i < sc->stripes; i++) in stripe_end_io()
381 if (!strcmp(sc->stripe[i].dev->name, major_minor)) { in stripe_end_io()
382 atomic_inc(&(sc->stripe[i].error_count)); in stripe_end_io()
383 if (atomic_read(&(sc->stripe[i].error_count)) < in stripe_end_io()
385 schedule_work(&sc->trigger_event); in stripe_end_io()
394 struct stripe_c *sc = ti->private; in stripe_iterate_devices() local
399 ret = fn(ti, sc->stripe[i].dev, in stripe_iterate_devices()
400 sc->stripe[i].physical_start, in stripe_iterate_devices()
401 sc->stripe_width, data); in stripe_iterate_devices()
402 } while (!ret && ++i < sc->stripes); in stripe_iterate_devices()
410 struct stripe_c *sc = ti->private; in stripe_io_hints() local
411 unsigned chunk_size = sc->chunk_size << SECTOR_SHIFT; in stripe_io_hints()
414 blk_limits_io_opt(limits, chunk_size * sc->stripes); in stripe_io_hints()