Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755848AbZIRQqv (ORCPT ); Fri, 18 Sep 2009 12:46:51 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1755271AbZIRQqu (ORCPT ); Fri, 18 Sep 2009 12:46:50 -0400 Received: from TYO202.gate.nec.co.jp ([202.32.8.206]:62197 "EHLO tyo202.gate.nec.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752217AbZIRQqu (ORCPT ); Fri, 18 Sep 2009 12:46:50 -0400 Message-ID: <4AB3B43D.9000802@ce.jp.nec.com> Date: Sat, 19 Sep 2009 01:24:29 +0900 From: "Jun'ichi Nomura" User-Agent: Thunderbird 2.0.0.19 (Windows/20081209) MIME-Version: 1.0 To: Jens Axboe , Mike Snitzer , "Martin K. Petersen" , Alasdair G Kergon CC: David Strand , device-mapper development , linux-kernel@vger.kernel.org Subject: [PATCH 1/3] block: Add blk_queue_copy_limits() Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3426 Lines: 84 This patch is a preparation for the last patch in this patchset which changes blk_set_default_limits() to set 0 to max_sectors. dm uses blk_stack_limits() to merge limits of underlying devices and copy the end result to the queue. But if there's no underlying device (like 'zero' target), max_sectors/max_hw_sectors are left unchanged from the default 0 and just copying it to the queue causes problems. Provide blk_queue_copy_limits() to get a safe copy with invalid values fixed-up. Signed-off-by: Kiyoshi Ueda Signed-off-by: Jun'ichi Nomura Cc: David Strand Cc: Mike Snitzer Cc: Alasdair G Kergon Cc: Martin K. Petersen Cc: Jens Axboe --- block/blk-settings.c | 28 ++++++++++++++++++++++++++++ include/linux/blkdev.h | 1 + 2 files changed, 29 insertions(+) Index: linux-2.6.31.work/block/blk-settings.c =================================================================== --- linux-2.6.31.work.orig/block/blk-settings.c +++ linux-2.6.31.work/block/blk-settings.c @@ -122,6 +122,34 @@ void blk_set_default_limits(struct queue EXPORT_SYMBOL(blk_set_default_limits); /** + * blk_queue_copy_limits - copy limits to queue + * @q: the request queue whose limits as a copy destination + * @lim: the queue_limits structure as a copy source + * + * Description: + * Copies a queue_limit struct contents to @q with fix-ups to + * invalid values. + */ +void blk_queue_copy_limits(struct request_queue *q, struct queue_limits *lim) +{ + q->limits = *lim; + + /* + * blk_set_default_limits() sets 0 to max_sectors/max_hw_sectors + * so that blk_stack_limits() appropriately propagate the values + * of lower-stack by min_not_zero(). + * However, if the default value 0 is unchanged (e.g. the stacking + * device is virtual and has no underlying device), it results + * in unusable device. + * Check if max_sectors/max_hw_sectors have non-zero values, + * and set SAFE_MAX_SECTORS if they do. + */ + if (q->limits.max_sectors == 0 || q->limits.max_hw_sectors == 0) + blk_queue_max_sectors(q, SAFE_MAX_SECTORS); +} +EXPORT_SYMBOL(blk_queue_copy_limits); + +/** * blk_queue_make_request - define an alternate make_request function for a device * @q: the request queue for the device to be affected * @mfn: the alternate make_request function Index: linux-2.6.31.work/include/linux/blkdev.h =================================================================== --- linux-2.6.31.work.orig/include/linux/blkdev.h +++ linux-2.6.31.work/include/linux/blkdev.h @@ -917,6 +917,7 @@ extern void blk_limits_io_min(struct que extern void blk_queue_io_min(struct request_queue *q, unsigned int min); extern void blk_queue_io_opt(struct request_queue *q, unsigned int opt); extern void blk_set_default_limits(struct queue_limits *lim); +extern void blk_queue_copy_limits(struct request_queue *q, struct queue_limits *lim); extern int blk_stack_limits(struct queue_limits *t, struct queue_limits *b, sector_t offset); extern void disk_stack_limits(struct gendisk *disk, struct block_device *bdev, -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/