loop: remove the incorrect write_begin/write_end shortcut
authorChristoph Hellwig <hch@infradead.org>
Mon, 17 Oct 2011 10:57:20 +0000 (12:57 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 17 Oct 2011 10:57:20 +0000 (12:57 +0200)
commit456be1484ffc72a24bdb4200b5847c4fa90139d9
tree570f0818bd6cfa245ab23d0121853b7b1e5a649b
parent8bc03e8f3a334e09e89a7dffb486ee97a5ce84ae
loop: remove the incorrect write_begin/write_end shortcut

Currently the loop device tries to call directly into write_begin/write_end
instead of going through ->write if it can.  This is a fairly nasty shortcut
as write_begin and write_end are only callbacks for the generic write code
and expect to be called with filesystem specific locks held.

This code currently causes various issues for clustered filesystems as it
doesn't take the required cluster locks, and it also causes issues for XFS
as it doesn't properly lock against the swapext ioctl as called by the
defragmentation tools.  This in case causes data corruption if
defragmentation hits a busy loop device in the wrong time window, as
reported by RH QA.

The reason why we have this shortcut is that it saves a data copy when
doing a transformation on the loop device, which is the technical term
for using cryptoloop (or an XOR transformation).  Given that cryptoloop
has been deprecated in favour of dm-crypt my opinion is that we should
simply drop this shortcut instead of finding complicated ways to to
introduce a formal interface for this shortcut.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/loop.c
include/linux/loop.h