diff options
-rw-r--r-- | block/blk-cgroup.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c index e4a4145926f6..1039fb9ff5f5 100644 --- a/block/blk-cgroup.c +++ b/block/blk-cgroup.c | |||
@@ -451,7 +451,20 @@ static int blkcg_reset_stats(struct cgroup_subsys_state *css, | |||
451 | struct blkcg_gq *blkg; | 451 | struct blkcg_gq *blkg; |
452 | int i; | 452 | int i; |
453 | 453 | ||
454 | mutex_lock(&blkcg_pol_mutex); | 454 | /* |
455 | * XXX: We invoke cgroup_add/rm_cftypes() under blkcg_pol_mutex | ||
456 | * which ends up putting cgroup's internal cgroup_tree_mutex under | ||
457 | * it; however, cgroup_tree_mutex is nested above cgroup file | ||
458 | * active protection and grabbing blkcg_pol_mutex from a cgroup | ||
459 | * file operation creates a possible circular dependency. cgroup | ||
460 | * internal locking is planned to go through further simplification | ||
461 | * and this issue should go away soon. For now, let's trylock | ||
462 | * blkcg_pol_mutex and restart the write on failure. | ||
463 | * | ||
464 | * http://lkml.kernel.org/g/5363C04B.4010400@oracle.com | ||
465 | */ | ||
466 | if (!mutex_trylock(&blkcg_pol_mutex)) | ||
467 | return restart_syscall(); | ||
455 | spin_lock_irq(&blkcg->lock); | 468 | spin_lock_irq(&blkcg->lock); |
456 | 469 | ||
457 | /* | 470 | /* |