[PATCH] reiser4: prevent system lockups

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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]);

[Index of Archives]     [Linux File System Development]     [Linux BTRFS]     [Linux NFS]     [Linux Filesystems]     [Ext4 Filesystem]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]     [Linux Resources]

  Powered by Linux