Ejemplo n.º 1
0
int dm_get_device(struct dm_target *ti, const char *path, sector_t start,
		  sector_t len, int mode, struct dm_dev **result)
{
	int r = __table_get_device(ti->table, ti, path,
				   start, len, mode, result);

	if (!r)
		dm_set_device_limits(ti, (*result)->bdev);

	return r;
}
/**ltl
 * 功能: 根据目标设备<major:minor>和起始偏移量获取目标设备对象
 * 参数: ti	-> 映射目标设备对象
 *		path	-> <major:minor>
 *		start->映射目标相对低层设备的起始偏移量
 *		len	->此目标设备在dm设备的长度
 *		mode	->rw
 *		result->低层设备对象
 * 返回值:
 * 说明:
 */
int dm_get_device(struct dm_target *ti, const char *path, sector_t start,
		  sector_t len, int mode, struct dm_dev **result)
{
	/* 初始化映射设备 */
	int r = __table_get_device(ti->table, ti, path,
				   start, len, mode, result);
	if (!r) {
		request_queue_t *q = bdev_get_queue((*result)->bdev);
		struct io_restrictions *rs = &ti->limits;

		/*
		 * Combine the device limits low.
		 *
		 * FIXME: if we move an io_restriction struct
		 *        into q this would just be a call to
		 *        combine_restrictions_low()
		 */
		rs->max_sectors =
			min_not_zero(rs->max_sectors, q->max_sectors);

		/* FIXME: Device-Mapper on top of RAID-0 breaks because DM
		 *        currently doesn't honor MD's merge_bvec_fn routine.
		 *        In this case, we'll force DM to use PAGE_SIZE or
		 *        smaller I/O, just to be safe. A better fix is in the
		 *        works, but add this for the time being so it will at
		 *        least operate correctly.
		 */
		if (q->merge_bvec_fn)
			rs->max_sectors =
				min_not_zero(rs->max_sectors,
					     (unsigned int) (PAGE_SIZE >> 9));

		rs->max_phys_segments =
			min_not_zero(rs->max_phys_segments,
				     q->max_phys_segments);

		rs->max_hw_segments =
			min_not_zero(rs->max_hw_segments, q->max_hw_segments);

		rs->hardsect_size = max(rs->hardsect_size, q->hardsect_size);

		rs->max_segment_size =
			min_not_zero(rs->max_segment_size, q->max_segment_size);

		rs->seg_boundary_mask =
			min_not_zero(rs->seg_boundary_mask,
				     q->seg_boundary_mask);

		rs->no_cluster |= !test_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags);
	}