Commit d5c82388 authored by Davidlohr Bueso's avatar Davidlohr Bueso Committed by David Sterba
Browse files

btrfs: convert data_seqcount to seqcount_mutex_t



By doing so we can associate the sequence counter to the chunk_mutex
for lockdep purposes (compiled-out otherwise), the mutex is otherwise
used on the write side.
Also avoid explicitly disabling preemption around the write region as it
will now be done automatically by the seqcount machinery based on the
lock type.

Signed-off-by: default avatarDavidlohr Bueso <dbueso@suse.de>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 0425e7ba
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -431,7 +431,7 @@ static struct btrfs_device *__alloc_device(struct btrfs_fs_info *fs_info)

	atomic_set(&dev->reada_in_flight, 0);
	atomic_set(&dev->dev_stats_ccnt, 0);
	btrfs_device_data_ordered_init(dev);
	btrfs_device_data_ordered_init(dev, fs_info);
	INIT_RADIX_TREE(&dev->reada_zones, GFP_NOFS & ~__GFP_DIRECT_RECLAIM);
	INIT_RADIX_TREE(&dev->reada_extents, GFP_NOFS & ~__GFP_DIRECT_RECLAIM);
	extent_io_tree_init(fs_info, &dev->alloc_state,
+5 −6
Original line number Diff line number Diff line
@@ -39,10 +39,10 @@ struct btrfs_io_geometry {
#if BITS_PER_LONG==32 && defined(CONFIG_SMP)
#include <linux/seqlock.h>
#define __BTRFS_NEED_DEVICE_DATA_ORDERED
#define btrfs_device_data_ordered_init(device)	\
	seqcount_init(&device->data_seqcount)
#define btrfs_device_data_ordered_init(device, info)				\
	seqcount_mutex_init(&device->data_seqcount, &info->chunk_mutex)
#else
#define btrfs_device_data_ordered_init(device) do { } while (0)
#define btrfs_device_data_ordered_init(device, info) do { } while (0)
#endif

#define BTRFS_DEV_STATE_WRITEABLE	(0)
@@ -72,7 +72,8 @@ struct btrfs_device {
	blk_status_t last_flush_error;

#ifdef __BTRFS_NEED_DEVICE_DATA_ORDERED
	seqcount_t data_seqcount;
	/* A seqcount_t with associated chunk_mutex (for lockdep) */
	seqcount_mutex_t data_seqcount;
#endif

	/* the internal btrfs device id */
@@ -163,11 +164,9 @@ btrfs_device_get_##name(const struct btrfs_device *dev) \
static inline void							\
btrfs_device_set_##name(struct btrfs_device *dev, u64 size)		\
{									\
	preempt_disable();						\
	write_seqcount_begin(&dev->data_seqcount);			\
	dev->name = size;						\
	write_seqcount_end(&dev->data_seqcount);			\
	preempt_enable();						\
}
#elif BITS_PER_LONG==32 && defined(CONFIG_PREEMPTION)
#define BTRFS_DEVICE_GETSET_FUNCS(name)					\