All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [PATCH] block: Invalidate the cache for a parent block-device
@ 2012-01-20  1:58 Mikulas Patocka
  2012-01-20  9:35 ` Niels de Vos
  0 siblings, 1 reply; 23+ messages in thread
From: Mikulas Patocka @ 2012-01-20  1:58 UTC (permalink / raw)
  To: ndevos; +Cc: linux-kernel, bmr

Hi

This definitely doesn't belong to blkdev_issue_flush.

blkdev_issue_flush is called by filesystems each time they want to 
synchronize hardware disk cache (for example, when committing a journal).

The patch may cause serious performance regressions (each time a 
filesystem commits journal, the patch causes it to walk all buffers in the 
whole-disk device).

You should put this code into fsync_bdev (so that it is called only on 
fsync or BLKFLSBUF) and not to blkdev_issue_flush.

Mikulas

> Executing a BLKFLSBUF-ioctl on a partition flushes the caches for that
> partition but reading data through the parent device will still return
> the old cached data.
> 
> The cache for the block-device is not synced if the block-device is kept
> open (due to a mounted partition, for example). Only when all users for
> the disk have exited, the cache for the disk is made consistent again.
> 
> Calling invalidate_bdev() on the parent block-device in case
> blkdev_issue_flush() was called for a partition fixes this.
> 
> The problem can be worked around by forcing the caches to be flushed
> with either
>         # blockdev --flushbufs ${dev_disk}
> or
>         # echo 3 > /proc/sys/vm/drop_caches
> 
> CC: Bryn M. Reeves <bmr <at> redhat.com>
> Signed-off-by: Niels de Vos <ndevos <at> redhat.com>
> ---
>  block/blk-flush.c |    3 +++
>  1 files changed, 3 insertions(+), 0 deletions(-)
> 
> diff --git a/block/blk-flush.c b/block/blk-flush.c
> index 720ad60..e876f8e 100644
> --- a/block/blk-flush.c
> +++ b/block/blk-flush.c
> @@ -448,6 +448,9 @@ int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_
> 
>         if (!bio_flagged(bio, BIO_UPTODATE))
>                 ret = -EIO;
> +       else if (bdev != bdev->bd_contains)
> +               /* invalidate parent block_device */
> +               invalidate_bdev(bdev->bd_contains);
> 
>         bio_put(bio);
>         return ret;
> --
> 1.7.6.5
> 

^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2012-01-31 19:48 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-01-20  1:58 [PATCH] block: Invalidate the cache for a parent block-device Mikulas Patocka
2012-01-20  9:35 ` Niels de Vos
2012-01-23 10:38   ` [PATCH v2] fs: Invalidate the cache for a parent block-device if fsync() is called for a partition Niels de Vos
2012-01-23 16:27     ` Jeff Moyer
2012-01-23 16:46       ` Niels de Vos
2012-01-23 19:23     ` Mikulas Patocka
2012-01-23 20:04     ` Jeff Moyer
2012-01-26 10:03     ` Andrew Morton
2012-01-26 11:50       ` Niels de Vos
2012-01-26 13:33         ` [PATCH v3] " Niels de Vos
2012-01-26 21:40           ` Andrew Morton
2012-01-26 21:45             ` Christoph Hellwig
2012-01-26 21:50               ` Mikulas Patocka
2012-01-27 12:19                 ` Ric Wheeler
2012-01-31 16:00               ` Niels de Vos
2012-01-31 18:58                 ` Andrew Morton
2012-01-31 19:04                   ` Christoph Hellwig
2012-01-31 19:32                     ` Andrew Morton
2012-01-31 19:37                       ` Christoph Hellwig
2012-01-31 19:48                         ` Andrew Morton
2012-01-26 21:49             ` Jeff Moyer
2012-01-26 22:13             ` Mikulas Patocka
2012-01-26 22:26               ` Kernel Oops report (Android gingerbread) Fan Zhang

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.