Hi all, Starting from Linux-4.15, VFS introduces optimizations, which are incompatible with Reiser4 (as well as with any FS possessing an advanced transaction manager). Here is the problematic commit: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=aa65c29ce1b6e1990cd2c7d8004bbea7ff3aff38 The attached patch fixes the problem. This patch is against Linux-5.4+reiser4. Please, apply. Later I'll prepare backports for all the mentioned kernels and will put them on Sourceforge. If someone urgently needs a backport, then let me know. Thanks, Edward.
diff -urN linux-5.4.6/fs/reiser4/page_cache.c linux-5.4.6.patched/fs/reiser4/page_cache.c --- linux-5.4.6/fs/reiser4/page_cache.c 2020-02-05 00:08:07.121592727 +0100 +++ linux-5.4.6.patched/fs/reiser4/page_cache.c 2020-02-05 00:09:44.508645047 +0100 @@ -549,7 +549,8 @@ */ .releasepage = reiser4_releasepage, .direct_IO = NULL, - .migratepage = reiser4_migratepage + .migratepage = reiser4_migratepage, + .batch_lock_tabu = 1 }; /* called just before page is released (no longer used by reiser4). Callers: diff -urN linux-5.4.6/fs/reiser4/plugin/object.c linux-5.4.6.patched/fs/reiser4/plugin/object.c --- linux-5.4.6/fs/reiser4/plugin/object.c 2020-02-05 00:08:07.129592814 +0100 +++ linux-5.4.6.patched/fs/reiser4/plugin/object.c 2020-02-05 00:09:44.508645047 +0100 @@ -150,7 +150,8 @@ .bmap = reiser4_bmap_dispatch, .invalidatepage = reiser4_invalidatepage, .releasepage = reiser4_releasepage, - .migratepage = reiser4_migratepage + .migratepage = reiser4_migratepage, + .batch_lock_tabu = 1 }; /* VFS methods for symlink files */ diff -urN linux-5.4.6/include/linux/fs.h linux-5.4.6.patched/include/linux/fs.h --- linux-5.4.6/include/linux/fs.h 2020-02-05 00:08:07.135592878 +0100 +++ linux-5.4.6.patched/include/linux/fs.h 2020-02-05 00:09:21.339394689 +0100 @@ -409,6 +409,7 @@ int (*swap_activate)(struct swap_info_struct *sis, struct file *file, sector_t *span); void (*swap_deactivate)(struct file *file); + int batch_lock_tabu; }; extern const struct address_space_operations empty_aops; diff -urN linux-5.4.6/mm/truncate.c linux-5.4.6.patched/mm/truncate.c --- linux-5.4.6/mm/truncate.c 2019-12-21 11:05:23.000000000 +0100 +++ linux-5.4.6.patched/mm/truncate.c 2020-02-05 00:09:21.339394689 +0100 @@ -360,6 +360,13 @@ continue; } pagevec_add(&locked_pvec, page); + if (mapping->a_ops->batch_lock_tabu) + /* + * the file system doesn't allow to hold + * many pages locked, while calling + * ->invalidatepage() for one of them + */ + break; } for (i = 0; i < pagevec_count(&locked_pvec); i++) truncate_cleanup_page(mapping, locked_pvec.pages[i]);