Nick Piggin wrote: > On Thu, Nov 27, 2008 at 05:34:26PM +0300, Edward Shishkin wrote: > >> reiser4_write_{begin,end} works only in splice.c (i.e. only for >> loopback functionality) in the chunk of code which looks like this: >> >> pagecache_write_begin(); >> ... >> memcpy(.., to_page); >> ... >> pagecache_write_end(.., to_page, ..); >> >> i.e. there can not be short writes and everything is uptodate. >> > > Ah OK, indeed you are right. Although that's not to say that some > other kernel code may not be able to start doing interruptible > copies, although it would be fairly unlikely. Maybe if you just have > a BUG_ON(!(flags & AOP_FLAG_UNINTERRUPTIBLE)); or something to just > make sure? Yup, I would say, it's a must.. Thanks, Edward.
Make sure that reiser4_write_begin() is not called for interruptible copies. Signed-off-by: Edward Shishkin<edward.shishkin@xxxxxxxxx> --- linux-2.6.28-rc2-mm1/fs/reiser4/plugin/file/file_conversion.c | 6 ++++++ 1 file changed, 6 insertions(+) --- linux-2.6.28-rc2-mm1/fs/reiser4/plugin/file/file_conversion.c.orig +++ linux-2.6.28-rc2-mm1/fs/reiser4/plugin/file/file_conversion.c @@ -682,6 +682,12 @@ int reiser4_write_begin_careful(struct f reiser4_context *ctx; struct inode * inode = file->f_dentry->d_inode; + /** + * reiser4_write_end() can not cope with + * short writes for now + */ + BUG_ON(!(flags & AOP_FLAG_UNINTERRUPTIBLE)); + index = pos >> PAGE_CACHE_SHIFT; start = pos & (PAGE_CACHE_SIZE - 1); end = start + len;