Commit 73adb8c5 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'for-4.13/dm-fixes-2' of...

Merge tag 'for-4.13/dm-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm

Pull device mapper fixes from Mike Snitzer:

 - A couple fixes for bugs introduced as part of the blk_status_t block
   layer changes during the 4.13 merge window

 - A printk throttling fix to use discrete rate limiting state for each
   DM log level

 - A stable@ fix for DM multipath that delays request requeueing to
   avoid CPU lockup if/when the request queue is "dying"

* tag 'for-4.13/dm-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm:
  dm mpath: do not lock up a CPU with requeuing activity
  dm: fix printk() rate limiting code
  dm mpath: retry BLK_STS_RESOURCE errors
  dm: fix the second dec_pending() argument in __split_and_process_bio()
parents 1b2614f1 1c23484c
...@@ -504,7 +504,6 @@ static int multipath_clone_and_map(struct dm_target *ti, struct request *rq, ...@@ -504,7 +504,6 @@ static int multipath_clone_and_map(struct dm_target *ti, struct request *rq,
if (queue_dying) { if (queue_dying) {
atomic_inc(&m->pg_init_in_progress); atomic_inc(&m->pg_init_in_progress);
activate_or_offline_path(pgpath); activate_or_offline_path(pgpath);
return DM_MAPIO_REQUEUE;
} }
return DM_MAPIO_DELAY_REQUEUE; return DM_MAPIO_DELAY_REQUEUE;
} }
...@@ -1458,7 +1457,6 @@ static int noretry_error(blk_status_t error) ...@@ -1458,7 +1457,6 @@ static int noretry_error(blk_status_t error)
case BLK_STS_TARGET: case BLK_STS_TARGET:
case BLK_STS_NEXUS: case BLK_STS_NEXUS:
case BLK_STS_MEDIUM: case BLK_STS_MEDIUM:
case BLK_STS_RESOURCE:
return 1; return 1;
} }
......
...@@ -27,16 +27,6 @@ ...@@ -27,16 +27,6 @@
#define DM_MSG_PREFIX "core" #define DM_MSG_PREFIX "core"
#ifdef CONFIG_PRINTK
/*
* ratelimit state to be used in DMXXX_LIMIT().
*/
DEFINE_RATELIMIT_STATE(dm_ratelimit_state,
DEFAULT_RATELIMIT_INTERVAL,
DEFAULT_RATELIMIT_BURST);
EXPORT_SYMBOL(dm_ratelimit_state);
#endif
/* /*
* Cookies are numeric values sent with CHANGE and REMOVE * Cookies are numeric values sent with CHANGE and REMOVE
* uevents while resuming, removing or renaming the device. * uevents while resuming, removing or renaming the device.
...@@ -1523,7 +1513,7 @@ static void __split_and_process_bio(struct mapped_device *md, ...@@ -1523,7 +1513,7 @@ static void __split_and_process_bio(struct mapped_device *md,
} }
/* drop the extra reference count */ /* drop the extra reference count */
dec_pending(ci.io, error); dec_pending(ci.io, errno_to_blk_status(error));
} }
/*----------------------------------------------------------------- /*-----------------------------------------------------------------
* CRUD END * CRUD END
......
...@@ -549,46 +549,29 @@ void *dm_vcalloc(unsigned long nmemb, unsigned long elem_size); ...@@ -549,46 +549,29 @@ void *dm_vcalloc(unsigned long nmemb, unsigned long elem_size);
*---------------------------------------------------------------*/ *---------------------------------------------------------------*/
#define DM_NAME "device-mapper" #define DM_NAME "device-mapper"
#ifdef CONFIG_PRINTK #define DM_RATELIMIT(pr_func, fmt, ...) \
extern struct ratelimit_state dm_ratelimit_state; do { \
static DEFINE_RATELIMIT_STATE(rs, DEFAULT_RATELIMIT_INTERVAL, \
#define dm_ratelimit() __ratelimit(&dm_ratelimit_state) DEFAULT_RATELIMIT_BURST); \
#else \
#define dm_ratelimit() 0 if (__ratelimit(&rs)) \
#endif pr_func(DM_FMT(fmt), ##__VA_ARGS__); \
} while (0)
#define DM_FMT(fmt) DM_NAME ": " DM_MSG_PREFIX ": " fmt "\n" #define DM_FMT(fmt) DM_NAME ": " DM_MSG_PREFIX ": " fmt "\n"
#define DMCRIT(fmt, ...) pr_crit(DM_FMT(fmt), ##__VA_ARGS__) #define DMCRIT(fmt, ...) pr_crit(DM_FMT(fmt), ##__VA_ARGS__)
#define DMERR(fmt, ...) pr_err(DM_FMT(fmt), ##__VA_ARGS__) #define DMERR(fmt, ...) pr_err(DM_FMT(fmt), ##__VA_ARGS__)
#define DMERR_LIMIT(fmt, ...) \ #define DMERR_LIMIT(fmt, ...) DM_RATELIMIT(pr_err, fmt, ##__VA_ARGS__)
do { \
if (dm_ratelimit()) \
DMERR(fmt, ##__VA_ARGS__); \
} while (0)
#define DMWARN(fmt, ...) pr_warn(DM_FMT(fmt), ##__VA_ARGS__) #define DMWARN(fmt, ...) pr_warn(DM_FMT(fmt), ##__VA_ARGS__)
#define DMWARN_LIMIT(fmt, ...) \ #define DMWARN_LIMIT(fmt, ...) DM_RATELIMIT(pr_warn, fmt, ##__VA_ARGS__)
do { \
if (dm_ratelimit()) \
DMWARN(fmt, ##__VA_ARGS__); \
} while (0)
#define DMINFO(fmt, ...) pr_info(DM_FMT(fmt), ##__VA_ARGS__) #define DMINFO(fmt, ...) pr_info(DM_FMT(fmt), ##__VA_ARGS__)
#define DMINFO_LIMIT(fmt, ...) \ #define DMINFO_LIMIT(fmt, ...) DM_RATELIMIT(pr_info, fmt, ##__VA_ARGS__)
do { \
if (dm_ratelimit()) \
DMINFO(fmt, ##__VA_ARGS__); \
} while (0)
#ifdef CONFIG_DM_DEBUG #ifdef CONFIG_DM_DEBUG
#define DMDEBUG(fmt, ...) printk(KERN_DEBUG DM_FMT(fmt), ##__VA_ARGS__) #define DMDEBUG(fmt, ...) printk(KERN_DEBUG DM_FMT(fmt), ##__VA_ARGS__)
#define DMDEBUG_LIMIT(fmt, ...) \ #define DMDEBUG_LIMIT(fmt, ...) DM_RATELIMIT(pr_debug, fmt, ##__VA_ARGS__)
do { \
if (dm_ratelimit()) \
DMDEBUG(fmt, ##__VA_ARGS__); \
} while (0)
#else #else
#define DMDEBUG(fmt, ...) no_printk(fmt, ##__VA_ARGS__) #define DMDEBUG(fmt, ...) no_printk(fmt, ##__VA_ARGS__)
#define DMDEBUG_LIMIT(fmt, ...) no_printk(fmt, ##__VA_ARGS__) #define DMDEBUG_LIMIT(fmt, ...) no_printk(fmt, ##__VA_ARGS__)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment