Btrfs: pin buffers during write_dev_supers
authorHisashi Hifumi <hifumi.hisashi@oss.ntt.co.jp>
Wed, 10 Jun 2009 19:28:55 +0000 (15:28 -0400)
committerChris Mason <chris.mason@oracle.com>
Wed, 10 Jun 2009 20:49:25 +0000 (16:49 -0400)
commit4eedeb75e7f15ffdb12d1ad559b565e7505bdbaf
tree2f78c56c30d5f4f96b85d012bcb412262f6a735c
parente5e9a5206a171b2c467e494aebcdcf70c47289bc
Btrfs: pin buffers during write_dev_supers

write_dev_supers is called in sequence.  First is it called with wait == 0,
which starts IO on all of the super blocks for a given device.  Then it is
called with wait == 1 to make sure they all reach the disk.

It doesn't currently pin the buffers between the two calls, and it also
assumes the buffers won't go away between the two calls, leading to
an oops if the VM manages to free the buffers in the middle of the sync.

This fixes that assumption and updates the code to return an error if things
are not up to date when the wait == 1 run is done.

Signed-off-by: Hisashi Hifumi <hifumi.hisashi@oss.ntt.co.jp>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/disk-io.c