FAILED: patch "[PATCH] bcache: register_bcache(): call blkdev_put() when" failed to apply to 4.7-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.7-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
d9dc1702b297ec4a6bb9c0326a70641b322ba886Mon Sep 17 00:00:00 2001
From: Eric Wheeler <[email protected]>
Date: Fri, 17 Jun 2016 15:01:54 -0700
Subject: [PATCH] bcache: register_bcache(): call blkdev_put() when
cache_alloc() fails
register_cache() is supposed to return an error string on error so that register_bcache() will will blkdev_put and cleanup other user counters, but it does not set 'char *err' when cache_alloc() fails (eg, due to memory pressure) and thus register_bcache() performs no cleanup.
register_bcache() <----------\ <- no jump to err_close, no blkdev_put()
| |
+->register_cache() | <- fails to set char *err
| |
+->cache_alloc() ---/ <- returns errorThis patch sets char *err for this failure case so that register_cache() will cause register_bcache() to correctly jump to err_close and do cleanup. This was tested under OOM conditions that triggered the bug.
drivers/md/bcache/super.c +7 -2
@@ -1844,7 +1844,7 @@ static int register_cache(struct cache_sb *sb, struct page *sb_page, struct block_device *bdev, struct cache *ca) { char name[BDEVNAME_SIZE]; -const char *err =NULL ; +const char *err =NULL ;/* must be set for any error case */ int ret =0 ;memcpy (&ca->sb, sb,sizeof (struct cache_sb ));
@@ -1861,8 +1861,13 @@ static int register_cache(struct cache_sb *sb, struct page *sb_page, ca->discard =CACHE_DISCARD (&ca->sb); ret =cache_alloc (ca); -if (ret !=0 ) +if (ret !=0 ) { +if (ret == -ENOMEM ) + err ="cache_alloc(): -ENOMEM" ; +else + err ="cache_alloc(): unknown error" ; goto err; + }if (kobject_add (&ca->kobj, &part_to_dev (bdev->bd_part)->kobj,"bcache" )) { err ="error calling kobject_add" ;