Message ID | 20150622174648.GA2965@redhat.com (mailing list archive) |
---|---|
State | Superseded, archived |
Delegated to: | Mike Snitzer |
Headers | show |
Hello, On Mon, Jun 22, 2015 at 01:46:48PM -0400, Vivek Goyal wrote: > Subject: fs/block_dev.c: Warn on inode writeback failure instead of WARN_ON() > > 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. Yeah, looks good to me. Just one nit. ... > + if (write_inode_now(inode, true)) { > + char name[BDEVNAME_SIZE] = ""; > + pr_warn_ratelimited("VFS: Dirty inode writeback failed for block device %s.\n", bdevname(bdev, name)); This wasn't reported before either but maybe we wanna report the errno too? Also, don't we usually break the line for parameters? pr_..("long format string going over 80 col...\n", param0, param1, ...); Thanks.
On Mon, Jun 22, 2015 at 01:52:55PM -0400, Tejun Heo wrote: > Hello, > > On Mon, Jun 22, 2015 at 01:46:48PM -0400, Vivek Goyal wrote: > > Subject: fs/block_dev.c: Warn on inode writeback failure instead of WARN_ON() > > > > 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. > > Yeah, looks good to me. Just one nit. > > ... > > + if (write_inode_now(inode, true)) { > > + char name[BDEVNAME_SIZE] = ""; > > + pr_warn_ratelimited("VFS: Dirty inode writeback failed for block device %s.\n", bdevname(bdev, name)); > > This wasn't reported before either but maybe we wanna report the errno > too? Also, don't we usually break the line for parameters? > > pr_..("long format string going over 80 col...\n", > param0, param1, ...); Hi Tejun, Will do. I have been doing some go programming in docker recently and this has been a side effect of that. :-) Will format it correctly. Thanks Vivek -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel
Looks good,
Reviewed-by: Christoph Hellwig <hch@lst.de>
--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel
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 12:55:47.642504742 -0400 @@ -48,12 +48,17 @@ 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; + spin_lock(&inode->i_lock); while (inode->i_state & I_DIRTY) { spin_unlock(&inode->i_lock); - WARN_ON_ONCE(write_inode_now(inode, true)); + if (write_inode_now(inode, true)) { + char name[BDEVNAME_SIZE] = ""; + pr_warn_ratelimited("VFS: Dirty inode writeback failed for block device %s.\n", bdevname(bdev, name)); + } spin_lock(&inode->i_lock); } spin_unlock(&inode->i_lock); @@ -1489,7 +1494,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)