mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 12:44:11 +08:00
- A stable DM multipath fix to restore ability to pass integrity data
- 2 DM multipath fixes for a fix that was merged into 4.15-rc5 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJaqoz6AAoJEMUj8QotnQNaNtEH/37YSs5yBXSzbsvRQuVsht1G C5qXrTB22JczSBNBfC+i0h5o9bXSm5brL/lOcP0qEokXnhEFgVK/nfcJmDRErUuJ 7TJhvYPptrFJ0hR7uMzqXxqp5ZDY+/mmzj69s0ZGZyhVacvO/CDW9CPUg7vgROp2 lEUohb3vi1ZaaHavbb/di4/m88+niJw5Yi/TBV24O7UxixQ3F1aeC5UENbfOt9re 5CauY3OcosS0Z+Kr8rmOzy2l/yBd2bYl8YGf4sJHWp4hmPec9PXUBOAK9wca9ouA UNVh/2SBddjmM8wsDzUGsJJyZW+YN2eh2fzs9eJIDfrOFt4BhueUVUzKcxXo+RE= =XErm -----END PGP SIGNATURE----- Merge tag 'for-4.16/dm-fixes-3' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm Pull device mapper fixes from Mike Snitzer: - a stable DM multipath fix to restore ability to pass integrity data - two DM multipath fixes for a fix that was merged into 4.16-rc5 * tag 'for-4.16/dm-fixes-3' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm: dm mpath: fix passing integrity data dm mpath: eliminate need to use scsi_device_from_queue dm mpath: fix uninitialized 'pg_init_wait' waitqueue_head NULL pointer
This commit is contained in:
commit
667058ae60
@ -22,7 +22,6 @@
|
||||
#include <linux/time.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/delay.h>
|
||||
#include <scsi/scsi_device.h>
|
||||
#include <scsi/scsi_dh.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/blk-mq.h>
|
||||
@ -223,6 +222,16 @@ static int alloc_multipath_stage2(struct dm_target *ti, struct multipath *m)
|
||||
|
||||
dm_table_set_type(ti->table, m->queue_mode);
|
||||
|
||||
/*
|
||||
* Init fields that are only used when a scsi_dh is attached
|
||||
* - must do this unconditionally (really doesn't hurt non-SCSI uses)
|
||||
*/
|
||||
set_bit(MPATHF_QUEUE_IO, &m->flags);
|
||||
atomic_set(&m->pg_init_in_progress, 0);
|
||||
atomic_set(&m->pg_init_count, 0);
|
||||
m->pg_init_delay_msecs = DM_PG_INIT_DELAY_DEFAULT;
|
||||
init_waitqueue_head(&m->pg_init_wait);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -331,7 +340,6 @@ static void __switch_pg(struct multipath *m, struct priority_group *pg)
|
||||
set_bit(MPATHF_PG_INIT_REQUIRED, &m->flags);
|
||||
set_bit(MPATHF_QUEUE_IO, &m->flags);
|
||||
} else {
|
||||
/* FIXME: not needed if no scsi_dh is attached */
|
||||
clear_bit(MPATHF_PG_INIT_REQUIRED, &m->flags);
|
||||
clear_bit(MPATHF_QUEUE_IO, &m->flags);
|
||||
}
|
||||
@ -796,15 +804,14 @@ static int parse_path_selector(struct dm_arg_set *as, struct priority_group *pg,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int setup_scsi_dh(struct block_device *bdev, struct multipath *m, char **error)
|
||||
static int setup_scsi_dh(struct block_device *bdev, struct multipath *m,
|
||||
const char *attached_handler_name, char **error)
|
||||
{
|
||||
struct request_queue *q = bdev_get_queue(bdev);
|
||||
const char *attached_handler_name;
|
||||
int r;
|
||||
|
||||
if (test_bit(MPATHF_RETAIN_ATTACHED_HW_HANDLER, &m->flags)) {
|
||||
retain:
|
||||
attached_handler_name = scsi_dh_attached_handler_name(q, GFP_KERNEL);
|
||||
if (attached_handler_name) {
|
||||
/*
|
||||
* Clear any hw_handler_params associated with a
|
||||
@ -823,16 +830,6 @@ retain:
|
||||
*/
|
||||
kfree(m->hw_handler_name);
|
||||
m->hw_handler_name = attached_handler_name;
|
||||
|
||||
/*
|
||||
* Init fields that are only used when a scsi_dh is attached
|
||||
*/
|
||||
if (!test_and_set_bit(MPATHF_QUEUE_IO, &m->flags)) {
|
||||
atomic_set(&m->pg_init_in_progress, 0);
|
||||
atomic_set(&m->pg_init_count, 0);
|
||||
m->pg_init_delay_msecs = DM_PG_INIT_DELAY_DEFAULT;
|
||||
init_waitqueue_head(&m->pg_init_wait);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -868,7 +865,8 @@ static struct pgpath *parse_path(struct dm_arg_set *as, struct path_selector *ps
|
||||
int r;
|
||||
struct pgpath *p;
|
||||
struct multipath *m = ti->private;
|
||||
struct scsi_device *sdev;
|
||||
struct request_queue *q;
|
||||
const char *attached_handler_name;
|
||||
|
||||
/* we need at least a path arg */
|
||||
if (as->argc < 1) {
|
||||
@ -887,11 +885,11 @@ static struct pgpath *parse_path(struct dm_arg_set *as, struct path_selector *ps
|
||||
goto bad;
|
||||
}
|
||||
|
||||
sdev = scsi_device_from_queue(bdev_get_queue(p->path.dev->bdev));
|
||||
if (sdev) {
|
||||
put_device(&sdev->sdev_gendev);
|
||||
q = bdev_get_queue(p->path.dev->bdev);
|
||||
attached_handler_name = scsi_dh_attached_handler_name(q, GFP_KERNEL);
|
||||
if (attached_handler_name) {
|
||||
INIT_DELAYED_WORK(&p->activate_path, activate_path_work);
|
||||
r = setup_scsi_dh(p->path.dev->bdev, m, &ti->error);
|
||||
r = setup_scsi_dh(p->path.dev->bdev, m, attached_handler_name, &ti->error);
|
||||
if (r) {
|
||||
dm_put_device(ti, p->path.dev);
|
||||
goto bad;
|
||||
@ -2022,8 +2020,9 @@ static int multipath_busy(struct dm_target *ti)
|
||||
*---------------------------------------------------------------*/
|
||||
static struct target_type multipath_target = {
|
||||
.name = "multipath",
|
||||
.version = {1, 12, 0},
|
||||
.features = DM_TARGET_SINGLETON | DM_TARGET_IMMUTABLE,
|
||||
.version = {1, 13, 0},
|
||||
.features = DM_TARGET_SINGLETON | DM_TARGET_IMMUTABLE |
|
||||
DM_TARGET_PASSES_INTEGRITY,
|
||||
.module = THIS_MODULE,
|
||||
.ctr = multipath_ctr,
|
||||
.dtr = multipath_dtr,
|
||||
|
Loading…
Reference in New Issue
Block a user