On Mon, May 02, 2016 at 07:02:08AM +0800, Anand Jain wrote: > --- a/fs/btrfs/dev-replace.c > +++ b/fs/btrfs/dev-replace.c > @@ -569,11 +569,9 @@ static int btrfs_dev_replace_finishing(struct > btrfs_fs_info *fs_info, > ASSERT(list_empty(&src_device->resized_list)); > tgt_device->commit_total_bytes = src_device->commit_total_bytes; > tgt_device->commit_bytes_used = src_device->bytes_used; > - if (fs_info->sb->s_bdev && > - (fs_info->sb->s_bdev == src_device->bdev)) > - fs_info->sb->s_bdev = tgt_device->bdev;
What's the base of this patch? The above code is not in my for-next so I could be missing some important bits. > - if (fs_info->fs_devices->latest_bdev == src_device->bdev) > - fs_info->fs_devices->latest_bdev = tgt_device->bdev; > + > + btrfs_assign_next_active_device(fs_info, src_device, tgt_device); > + > list_add(&tgt_device->dev_alloc_list, &fs_info->fs_devices->alloc_list); > fs_info->fs_devices->rw_devices++; > > diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c > index 5f70c1235466..0bb15da2da40 100644 > --- a/fs/btrfs/volumes.c > +++ b/fs/btrfs/volumes.c > @@ -1742,10 +1742,49 @@ out: > return ret; > } > > +struct btrfs_device *btrfs_find_next_active_device(struct btrfs_fs_devices > *fs_devs, > + struct btrfs_device *device) > +{ > + struct btrfs_device *next_device; > + > + list_for_each_entry(next_device, &fs_devs->devices, dev_list) { > + if (next_device != device && > + !next_device->missing && next_device->bdev) > + return next_device; > + } > + return NULL; > +} > + > +/* > + * Helper function to check if the given device is part of > + * s_bdev / latest_bdev and replace it with the provided or > + * the next active device, in the context where this function > + * called, there should be always be another device which is > + * active. > + */ > +void btrfs_assign_next_active_device(struct btrfs_fs_info *fs_info, > + struct btrfs_device *device, struct btrfs_device *this_dev) > +{ > + struct btrfs_device *next_device; > + > + if (this_dev) > + next_device = this_dev; > + else > + next_device = btrfs_find_next_active_device(fs_info->fs_devices, > + device); > + BUG_ON(!next_device); /* Logic error */ Please make it an ASSERT. -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html