From patchwork Sat Sep 19 15:35:28 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Junichi Nomura X-Patchwork-Id: 48764 Received: from hormel.redhat.com (hormel1.redhat.com [209.132.177.33]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n8JFfFPv019403 for ; Sat, 19 Sep 2009 15:41:15 GMT Received: from listman.util.phx.redhat.com (listman.util.phx.redhat.com [10.8.4.110]) by hormel.redhat.com (Postfix) with ESMTP id 4CACF6199F4; Sat, 19 Sep 2009 11:41:15 -0400 (EDT) Received: from int-mx03.intmail.prod.int.phx2.redhat.com (nat-pool.util.phx.redhat.com [10.8.5.200]) by listman.util.phx.redhat.com (8.13.1/8.13.1) with ESMTP id n8JFfC91003788 for ; Sat, 19 Sep 2009 11:41:12 -0400 Received: from mx1.redhat.com (ext-mx05.extmail.prod.ext.phx2.redhat.com [10.5.110.9]) by int-mx03.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id n8JFf9Nc009305; Sat, 19 Sep 2009 11:41:09 -0400 Received: from tyo201.gate.nec.co.jp (TYO201.gate.nec.co.jp [202.32.8.193]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id n8JFf1Nq010116; Sat, 19 Sep 2009 11:41:02 -0400 Received: from mailgate3.nec.co.jp ([10.7.69.195]) by tyo201.gate.nec.co.jp (8.13.8/8.13.4) with ESMTP id n8JFesqK005627; Sun, 20 Sep 2009 00:40:54 +0900 (JST) Received: (from root@localhost) by mailgate3.nec.co.jp (8.11.7/3.7W-MAILGATE-NEC) id n8JFesQ28511; Sun, 20 Sep 2009 00:40:54 +0900 (JST) Received: from mail03.kamome.nec.co.jp (mail03.kamome.nec.co.jp [10.25.43.7]) by mailsv3.nec.co.jp (8.13.8/8.13.4) with ESMTP id n8JFerYa002042; Sun, 20 Sep 2009 00:40:54 +0900 (JST) Received: from komachi.jp.nec.com ([10.26.220.10] [10.26.220.10]) by mail02.kamome.nec.co.jp with ESMTP id BT-MMP-2070228; Sun, 20 Sep 2009 00:35:32 +0900 Received: from [10.66.61.195] ([10.66.61.195] [10.66.61.195]) by mail.jp.nec.com with ESMTP; Sun, 20 Sep 2009 00:35:29 +0900 Message-ID: <4AB4FA40.70700@ce.jp.nec.com> Date: Sun, 20 Sep 2009 00:35:28 +0900 From: "Jun'ichi Nomura" User-Agent: Thunderbird 2.0.0.22 (Windows/20090605) MIME-Version: 1.0 To: Jens Axboe References: <4AB3B43D.9000802@ce.jp.nec.com> <20090918203328.GT23126@kernel.dk> <20090918203533.GU23126@kernel.dk> In-Reply-To: <20090918203533.GU23126@kernel.dk> X-RedHat-Spam-Score: -1.333 (AWL) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.16 X-Scanned-By: MIMEDefang 2.67 on 10.5.110.9 X-loop: dm-devel@redhat.com Cc: Mike Snitzer , "Martin K. Petersen" , linux-kernel@vger.kernel.org, device-mapper development , Alasdair G Kergon Subject: [dm-devel] Re: [PATCH 1/3] block: Add blk_queue_copy_limits() X-BeenThere: dm-devel@redhat.com X-Mailman-Version: 2.1.5 Precedence: junk Reply-To: device-mapper development List-Id: device-mapper development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dm-devel-bounces@redhat.com Errors-To: dm-devel-bounces@redhat.com Jens Axboe wrote: > On Fri, Sep 18 2009, Jens Axboe wrote: >> On Sat, Sep 19 2009, Jun'ichi Nomura wrote: >>> 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. >> Added for 2.6.32. > > And removed, it's white space damaged and doesn't apply to the current > tree. Sorry... I forgot to disable line-wrapping and broke the patch. Re-sending with Mike's correction to English applied. This patch is a preparation for the last patch in this patchset which changes blk_set_default_limits() to set max_sectors to 0. 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(+) -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel 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 max_sectors/max_hw_sectors to 0 + * 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,