On Tue, May 22, 2012 at 12:53:47PM +0200, Stefan Behrens wrote:
>                */
>               clear_buffer_uptodate(bh);
> +             btrfs_device_stat_inc(&device->cnt_write_io_errs);
> +             device->device_stats_dirty = 1;
> +             btrfs_device_stat_print_on_error(device);

this sequence repeats several times (with a slight change), IMHO it asks
for a helper.

void stat_inc(... *device, atomic_inc *cnt) {
        atomic_inc(cntr);
        device->device_stats_dirty = 1;
        btrfs_device_stat_print_on_error(device);
}

usage:

stat_inc(device, &device->cnt_write_io_errs);

I think it's unavoidable to leave out the 'device' parameter without a
macro trickery, but as there are only 2 params, it don't it's needed.


>  static void btrfs_end_bio(struct bio *bio, int err)
>  {
> -     struct btrfs_bio *bbio = bio->bi_private;
> +     struct btrfs_bio *bbio = (struct btrfs_bio *)
> +             (((uintptr_t)bio->bi_private) & ~((uintptr_t)3));

I suggest do use a helper for all the "var & 3" places, and comment why
is it so and what are the limitations. I can see from the code below
that it encodes number of devices and fails for > 3.

>       int is_orig_bio = 0;
>  
> -     if (err)
> +     if (err) {
>               atomic_inc(&bbio->error);
> +             if (err == -EIO || err == -EREMOTEIO) {
> +                     unsigned int dev_nr = ((uintptr_t)bio->bi_private) & 3;

eg.

unsigned int dev_nr = bio_private_to_nr_dev(bio);

> @@ -4148,7 +4166,9 @@ int btrfs_map_bio(struct btrfs_root *root, int rw, 
> struct bio *bio,
>               } else {
>                       bio = first_bio;
>               }
> -             bio->bi_private = bbio;
> +             BUG_ON((((uintptr_t)bbio) & 3) != 0);
> +             BUG_ON(dev_nr > 3);
> +             bio->bi_private = (void *)(((uintptr_t)bbio) | dev_nr);
>               bio->bi_end_io = btrfs_end_bio;
>               bio->bi_sector = bbio->stripes[dev_nr].physical >> 9;
>               dev = bbio->stripes[dev_nr].dev;


otherwise ok,
david
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to