Question regarding concurrent accesses through block device and fs

From: Francis Moreau
Date: Thu Feb 19 2009 - 06:08:01 EST


[ Resend to LKLM, hopping to get a wider audience ;) and to Andrew Morton since
he wrote that part of the code, I think ]

Hello,

I have a question regarding the page cache/buffer heads behaviour when
some blocks are accessed through a regular file and through the block
dev hosting this file.

First it looks like when accessing some blocks through a block device,
the same mechanisms are used as when reading a file through a file
system: the page cache is used.

That means that a block could be mapped by several buffers at the same
time.

I don't see any issues to this (if we agree that the behaviour is undefined
in that case) but looking at __block_prepare_write(), it seems that we don't
want this to happen since it does:

[...]
if (buffer_new(bh)) {
unmap_underlying_metadata(bh->b_bdev, bh->b_blocknr);
[...]
}

where unmap_underlying_metadata() unmaps the blockdev buffer
which maps b_blocknr block.

This code seems to catch only the case where the buffer is new (I don't
see why only this case is treated).

Also this call seems unneeded if __block_prepare_write() is called
when writing through the block dev since we already know that the buffer
doesn't exist (we are here to create it).

I already read the comment of the function unmap_underlying_metadata()
but I failed to understand it...

Could anybody tell me what is the actual policy ?


thanks
--
Francis
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/