Tag: "VFS"

  • [PATCH] reiser4: prevent system lockups.

    From reiserfs-devel Wed Feb 05 00:28:06 2020
    From: Edward Shishkin <edward.shishkin () gmail ! com>
    Date: Wed, 05 Feb 2020 00:28:06 +0000
    To: reiserfs-devel
    Subject: [PATCH] reiser4: prevent system lockups
    Message-Id: <94861335-0ff3-a8cf-8d73-e0f521fa0ffa () gmail ! com>
    X-MARC-Message: https://marc.info/?l=reiserfs-devel&m=158086248927420
    MIME-Version: 1
    Content-Type: multipart/mixed; boundary="--------------F3FF70D4737419259F49BAF5"

    This is a multi-part message in MIME format.
    --------------F3FF70D4737419259F49BAF5
    Content-Type: text/plain; charset=utf-8; format=flowed
    Content-Transfer-Encoding: 7bit

    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.

    --------------F3FF70D4737419259F49BAF5
    Content-Type: text/x-patch;
    name="reiser4-fix-lockup.patch"
    Content-Transfer-Encoding: 7bit
    Content-Disposition: attachment;
    filename="reiser4-fix-lockup.patch"

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

    --------------F3FF70D4737419259F49BAF5--