From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vivek Goyal Subject: [PATCH] fs/block_dev.c: Remove WARN_ON() when inode writeback fails Date: Mon, 22 Jun 2015 14:41:18 -0400 Message-ID: <20150622184118.GA11277@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org To: Tejun Heo , Jens Axboe Cc: Christoph Hellwig , Mike Snitzer , dm-devel@redhat.com, Andi Kleen , linux-kernel@vger.kernel.org List-Id: dm-devel.ids If a block device is hot removed and later last reference to devices is put, we try to writeback the dirty inode. But device is gone and that writeback fails. Currently we do a WARN_ON() which does not seem to be the right thing. Convert it to a ratelimited kernel warning. Reported-by: Andi Kleen Signed-off-by: Vivek Goyal --- fs/block_dev.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) Index: rhvgoyal-linux/fs/block_dev.c =================================================================== --- rhvgoyal-linux.orig/fs/block_dev.c 2015-06-18 15:54:52.339383237 -0400 +++ rhvgoyal-linux/fs/block_dev.c 2015-06-22 14:32:29.112594493 -0400 @@ -48,12 +48,20 @@ inline struct block_device *I_BDEV(struc } EXPORT_SYMBOL(I_BDEV); -static void bdev_write_inode(struct inode *inode) +static void bdev_write_inode(struct block_device *bdev) { + struct inode *inode = bdev->bd_inode; + int ret; + spin_lock(&inode->i_lock); while (inode->i_state & I_DIRTY) { spin_unlock(&inode->i_lock); - WARN_ON_ONCE(write_inode_now(inode, true)); + ret = write_inode_now(inode, true); + if (ret) { + char name[BDEVNAME_SIZE] = ""; + pr_warn_ratelimited("VFS: Dirty inode writeback failed for block device %s (err= %d).\n", + bdevname(bdev, name), ret); + } spin_lock(&inode->i_lock); } spin_unlock(&inode->i_lock); @@ -1489,7 +1497,7 @@ static void __blkdev_put(struct block_de * ->release can cause the queue to disappear, so flush all * dirty data before. */ - bdev_write_inode(bdev->bd_inode); + bdev_write_inode(bdev); } if (bdev->bd_contains == bdev) { if (disk->fops->release) From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751810AbbFVSl0 (ORCPT ); Mon, 22 Jun 2015 14:41:26 -0400 Received: from mx1.redhat.com ([209.132.183.28]:46018 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751172AbbFVSlU (ORCPT ); Mon, 22 Jun 2015 14:41:20 -0400 Date: Mon, 22 Jun 2015 14:41:18 -0400 From: Vivek Goyal To: Tejun Heo , Jens Axboe Cc: Christoph Hellwig , Mike Snitzer , dm-devel@redhat.com, Andi Kleen , linux-kernel@vger.kernel.org Subject: [PATCH] fs/block_dev.c: Remove WARN_ON() when inode writeback fails Message-ID: <20150622184118.GA11277@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If a block device is hot removed and later last reference to devices is put, we try to writeback the dirty inode. But device is gone and that writeback fails. Currently we do a WARN_ON() which does not seem to be the right thing. Convert it to a ratelimited kernel warning. Reported-by: Andi Kleen Signed-off-by: Vivek Goyal --- fs/block_dev.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) Index: rhvgoyal-linux/fs/block_dev.c =================================================================== --- rhvgoyal-linux.orig/fs/block_dev.c 2015-06-18 15:54:52.339383237 -0400 +++ rhvgoyal-linux/fs/block_dev.c 2015-06-22 14:32:29.112594493 -0400 @@ -48,12 +48,20 @@ inline struct block_device *I_BDEV(struc } EXPORT_SYMBOL(I_BDEV); -static void bdev_write_inode(struct inode *inode) +static void bdev_write_inode(struct block_device *bdev) { + struct inode *inode = bdev->bd_inode; + int ret; + spin_lock(&inode->i_lock); while (inode->i_state & I_DIRTY) { spin_unlock(&inode->i_lock); - WARN_ON_ONCE(write_inode_now(inode, true)); + ret = write_inode_now(inode, true); + if (ret) { + char name[BDEVNAME_SIZE] = ""; + pr_warn_ratelimited("VFS: Dirty inode writeback failed for block device %s (err= %d).\n", + bdevname(bdev, name), ret); + } spin_lock(&inode->i_lock); } spin_unlock(&inode->i_lock); @@ -1489,7 +1497,7 @@ static void __blkdev_put(struct block_de * ->release can cause the queue to disappear, so flush all * dirty data before. */ - bdev_write_inode(bdev->bd_inode); + bdev_write_inode(bdev); } if (bdev->bd_contains == bdev) { if (disk->fops->release) -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/