mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	btrfs: index check-integrity state hash by a dev_t
We won't have the struct block_device available in the bio soon, so switch to the numerical dev_t instead of the block_device pointer for looking up the check-integrity state. Reviewed-by: Liu Bo <bo.li.liu@oracle.com> Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
		
							parent
							
								
									744353b695
								
							
						
					
					
						commit
						f8f84b2dfd
					
				
					 1 changed files with 13 additions and 18 deletions
				
			
		| 
						 | 
				
			
			@ -296,8 +296,7 @@ static void btrfsic_dev_state_hashtable_add(
 | 
			
		|||
		struct btrfsic_dev_state *ds,
 | 
			
		||||
		struct btrfsic_dev_state_hashtable *h);
 | 
			
		||||
static void btrfsic_dev_state_hashtable_remove(struct btrfsic_dev_state *ds);
 | 
			
		||||
static struct btrfsic_dev_state *btrfsic_dev_state_hashtable_lookup(
 | 
			
		||||
		struct block_device *bdev,
 | 
			
		||||
static struct btrfsic_dev_state *btrfsic_dev_state_hashtable_lookup(dev_t dev,
 | 
			
		||||
		struct btrfsic_dev_state_hashtable *h);
 | 
			
		||||
static struct btrfsic_stack_frame *btrfsic_stack_frame_alloc(void);
 | 
			
		||||
static void btrfsic_stack_frame_free(struct btrfsic_stack_frame *sf);
 | 
			
		||||
| 
						 | 
				
			
			@ -385,8 +384,7 @@ static int btrfsic_process_superblock_dev_mirror(
 | 
			
		|||
		int superblock_mirror_num,
 | 
			
		||||
		struct btrfsic_dev_state **selected_dev_state,
 | 
			
		||||
		struct btrfs_super_block *selected_super);
 | 
			
		||||
static struct btrfsic_dev_state *btrfsic_dev_state_lookup(
 | 
			
		||||
		struct block_device *bdev);
 | 
			
		||||
static struct btrfsic_dev_state *btrfsic_dev_state_lookup(dev_t dev);
 | 
			
		||||
static void btrfsic_cmp_log_and_dev_bytenr(struct btrfsic_state *state,
 | 
			
		||||
					   u64 bytenr,
 | 
			
		||||
					   struct btrfsic_dev_state *dev_state,
 | 
			
		||||
| 
						 | 
				
			
			@ -626,17 +624,15 @@ static void btrfsic_dev_state_hashtable_remove(struct btrfsic_dev_state *ds)
 | 
			
		|||
	list_del(&ds->collision_resolving_node);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct btrfsic_dev_state *btrfsic_dev_state_hashtable_lookup(
 | 
			
		||||
		struct block_device *bdev,
 | 
			
		||||
static struct btrfsic_dev_state *btrfsic_dev_state_hashtable_lookup(dev_t dev,
 | 
			
		||||
		struct btrfsic_dev_state_hashtable *h)
 | 
			
		||||
{
 | 
			
		||||
	const unsigned int hashval =
 | 
			
		||||
	    (((unsigned int)((uintptr_t)bdev)) &
 | 
			
		||||
	     (BTRFSIC_DEV2STATE_HASHTABLE_SIZE - 1));
 | 
			
		||||
		dev & (BTRFSIC_DEV2STATE_HASHTABLE_SIZE - 1);
 | 
			
		||||
	struct btrfsic_dev_state *ds;
 | 
			
		||||
 | 
			
		||||
	list_for_each_entry(ds, h->table + hashval, collision_resolving_node) {
 | 
			
		||||
		if (ds->bdev == bdev)
 | 
			
		||||
		if (ds->bdev->bd_dev == dev)
 | 
			
		||||
			return ds;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -668,7 +664,7 @@ static int btrfsic_process_superblock(struct btrfsic_state *state,
 | 
			
		|||
		if (!device->bdev || !device->name)
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		dev_state = btrfsic_dev_state_lookup(device->bdev);
 | 
			
		||||
		dev_state = btrfsic_dev_state_lookup(device->bdev->bd_dev);
 | 
			
		||||
		BUG_ON(NULL == dev_state);
 | 
			
		||||
		for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) {
 | 
			
		||||
			ret = btrfsic_process_superblock_dev_mirror(
 | 
			
		||||
| 
						 | 
				
			
			@ -1556,7 +1552,7 @@ static int btrfsic_map_block(struct btrfsic_state *state, u64 bytenr, u32 len,
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	device = multi->stripes[0].dev;
 | 
			
		||||
	block_ctx_out->dev = btrfsic_dev_state_lookup(device->bdev);
 | 
			
		||||
	block_ctx_out->dev = btrfsic_dev_state_lookup(device->bdev->bd_dev);
 | 
			
		||||
	block_ctx_out->dev_bytenr = multi->stripes[0].physical;
 | 
			
		||||
	block_ctx_out->start = bytenr;
 | 
			
		||||
	block_ctx_out->len = len;
 | 
			
		||||
| 
						 | 
				
			
			@ -2654,7 +2650,7 @@ static struct btrfsic_block *btrfsic_block_lookup_or_add(
 | 
			
		|||
			pr_info("btrfsic: error, kmalloc failed!\n");
 | 
			
		||||
			return NULL;
 | 
			
		||||
		}
 | 
			
		||||
		dev_state = btrfsic_dev_state_lookup(block_ctx->dev->bdev);
 | 
			
		||||
		dev_state = btrfsic_dev_state_lookup(block_ctx->dev->bdev->bd_dev);
 | 
			
		||||
		if (NULL == dev_state) {
 | 
			
		||||
			pr_info("btrfsic: error, lookup dev_state failed!\n");
 | 
			
		||||
			btrfsic_block_free(block);
 | 
			
		||||
| 
						 | 
				
			
			@ -2734,10 +2730,9 @@ static void btrfsic_cmp_log_and_dev_bytenr(struct btrfsic_state *state,
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct btrfsic_dev_state *btrfsic_dev_state_lookup(
 | 
			
		||||
		struct block_device *bdev)
 | 
			
		||||
static struct btrfsic_dev_state *btrfsic_dev_state_lookup(dev_t dev)
 | 
			
		||||
{
 | 
			
		||||
	return btrfsic_dev_state_hashtable_lookup(bdev,
 | 
			
		||||
	return btrfsic_dev_state_hashtable_lookup(dev,
 | 
			
		||||
						  &btrfsic_dev_state_hashtable);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2751,7 +2746,7 @@ int btrfsic_submit_bh(int op, int op_flags, struct buffer_head *bh)
 | 
			
		|||
	mutex_lock(&btrfsic_mutex);
 | 
			
		||||
	/* since btrfsic_submit_bh() might also be called before
 | 
			
		||||
	 * btrfsic_mount(), this might return NULL */
 | 
			
		||||
	dev_state = btrfsic_dev_state_lookup(bh->b_bdev);
 | 
			
		||||
	dev_state = btrfsic_dev_state_lookup(bh->b_bdev->bd_dev);
 | 
			
		||||
 | 
			
		||||
	/* Only called to write the superblock (incl. FLUSH/FUA) */
 | 
			
		||||
	if (NULL != dev_state &&
 | 
			
		||||
| 
						 | 
				
			
			@ -2808,7 +2803,7 @@ static void __btrfsic_submit_bio(struct bio *bio)
 | 
			
		|||
	mutex_lock(&btrfsic_mutex);
 | 
			
		||||
	/* since btrfsic_submit_bio() is also called before
 | 
			
		||||
	 * btrfsic_mount(), this might return NULL */
 | 
			
		||||
	dev_state = btrfsic_dev_state_lookup(bio->bi_bdev);
 | 
			
		||||
	dev_state = btrfsic_dev_state_lookup(bio->bi_bdev->bd_dev);
 | 
			
		||||
	if (NULL != dev_state &&
 | 
			
		||||
	    (bio_op(bio) == REQ_OP_WRITE) && bio_has_data(bio)) {
 | 
			
		||||
		unsigned int i = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -2998,7 +2993,7 @@ void btrfsic_unmount(struct btrfs_fs_devices *fs_devices)
 | 
			
		|||
			continue;
 | 
			
		||||
 | 
			
		||||
		ds = btrfsic_dev_state_hashtable_lookup(
 | 
			
		||||
				device->bdev,
 | 
			
		||||
				device->bdev->bd_dev,
 | 
			
		||||
				&btrfsic_dev_state_hashtable);
 | 
			
		||||
		if (NULL != ds) {
 | 
			
		||||
			state = ds->state;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue