From: "Jun'ichi Nomura" <j-nomura@ce.jp.nec.com>
To: Jens Axboe <jens.axboe@oracle.com>,
Mike Snitzer <snitzer@redhat.com>,
"Martin K. Petersen" <martin.petersen@oracle.com>,
Alasdair G Kergon <agk@redhat.com>
Cc: device-mapper development <dm-devel@redhat.com>,
linux-kernel@vger.kernel.org
Subject: [PATCH 1/3] block: Add blk_queue_copy_limits()
Date: Sat, 19 Sep 2009 01:24:29 +0900 [thread overview]
Message-ID: <4AB3B43D.9000802@ce.jp.nec.com> (raw)
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 <k-ueda@ct.jp.nec.com>
Signed-off-by: Jun'ichi Nomura <j-nomura@ce.jp.nec.com>
Cc: David Strand <dpstrand@gmail.com>
Cc: Mike Snitzer <snitzer@redhat.com>
Cc: Alasdair G Kergon <agk@redhat.com>
Cc: Martin K. Petersen <martin.petersen@oracle.com>
Cc: Jens Axboe <jens.axboe@oracle.com>
---
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,
WARNING: multiple messages have this Message-ID (diff)
From: "Jun'ichi Nomura" <j-nomura@ce.jp.nec.com>
To: Jens Axboe <jens.axboe@oracle.com>,
Mike Snitzer <snitzer@redhat.com>,
"Martin K. Petersen" <martin.petersen@oracle.com>,
Alasdair G Kergon <agk@redhat.com>
Cc: David Strand <dpstrand@gmail.com>,
device-mapper development <dm-devel@redhat.com>,
linux-kernel@vger.kernel.org
Subject: [PATCH 1/3] block: Add blk_queue_copy_limits()
Date: Sat, 19 Sep 2009 01:24:29 +0900 [thread overview]
Message-ID: <4AB3B43D.9000802@ce.jp.nec.com> (raw)
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 <k-ueda@ct.jp.nec.com>
Signed-off-by: Jun'ichi Nomura <j-nomura@ce.jp.nec.com>
Cc: David Strand <dpstrand@gmail.com>
Cc: Mike Snitzer <snitzer@redhat.com>
Cc: Alasdair G Kergon <agk@redhat.com>
Cc: Martin K. Petersen <martin.petersen@oracle.com>
Cc: Jens Axboe <jens.axboe@oracle.com>
---
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,
next reply other threads:[~2009-09-18 16:24 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-18 16:24 Jun'ichi Nomura [this message]
2009-09-18 16:24 ` [PATCH 1/3] block: Add blk_queue_copy_limits() Jun'ichi Nomura
2009-09-18 16:26 ` [PATCH 2/3] dm: Use blk_queue_copy_limits() Jun'ichi Nomura
2009-09-18 16:26 ` Jun'ichi Nomura
2009-09-18 19:11 ` Mike Snitzer
2009-09-18 19:11 ` Mike Snitzer
2009-09-18 16:29 ` [PATCH 3/3] block: blk_set_default_limits sets 0 to max_sectors Jun'ichi Nomura
2009-09-18 16:29 ` Jun'ichi Nomura
2009-09-18 19:07 ` [PATCH 1/3] block: Add blk_queue_copy_limits() Mike Snitzer
2009-09-18 19:07 ` Mike Snitzer
2009-09-18 19:28 ` Martin K. Petersen
2009-09-18 19:28 ` [dm-devel] " Martin K. Petersen
2009-09-18 20:30 ` Mike Snitzer
2009-09-18 20:30 ` Mike Snitzer
2009-09-19 15:22 ` Jun'ichi Nomura
2009-09-19 15:22 ` [dm-devel] " Jun'ichi Nomura
2009-09-20 21:00 ` Martin K. Petersen
2009-09-20 21:00 ` [dm-devel] " Martin K. Petersen
2009-09-21 16:33 ` Jun'ichi Nomura
2009-09-21 16:33 ` [dm-devel] " Jun'ichi Nomura
2009-09-21 19:43 ` Martin K. Petersen
2009-09-21 19:43 ` [dm-devel] " Martin K. Petersen
2009-09-21 19:45 ` Jens Axboe
2009-09-21 19:45 ` [dm-devel] " Jens Axboe
2009-09-18 20:33 ` Jens Axboe
2009-09-18 20:33 ` Jens Axboe
2009-09-18 20:35 ` Jens Axboe
2009-09-18 20:35 ` Jens Axboe
2009-09-19 15:35 ` Jun'ichi Nomura
2009-09-19 15:35 ` Jun'ichi Nomura
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4AB3B43D.9000802@ce.jp.nec.com \
--to=j-nomura@ce.jp.nec.com \
--cc=agk@redhat.com \
--cc=dm-devel@redhat.com \
--cc=jens.axboe@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=snitzer@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.