The commit is pushed to "branch-rh9-5.14.vz9.1.x-ovz" and will appear at 
https://src.openvz.org/scm/ovz/vzkernel.git
after ark-5.14
------>
commit 93b69a8cd104e61d587988c2b9fa0f3ae19a4a73
Author: Kirill Tkhai <ktk...@virtuozzo.com>
Date:   Mon Sep 20 19:59:23 2021 +0300

    ext4: Care about reserves in case of IO thread
    
    Kthread has root permittions, and it may exceed
    ext4 reserves (see ext4_has_free_clusters(),
    also see tune2fs -r).
    
    Introduce a new flag PF_IO_THREAD, which indicates
    a thread of *loop blocks devices, and care about
    it in ext4_has_free_clusters().
    
    Loop is the first user.
    
    Note, that ms kernel (06.2021) still has free PF_xxx
    bits, so I choosed to use one in 4.18.
    
    https://jira.sw.ru/browse/PSBM-127225
    
    Signed-off-by: Kirill Tkhai <ktk...@virtuozzo.com>
---
 drivers/block/loop.c  | 2 +-
 fs/ext4/balloc.c      | 4 ++--
 include/linux/sched.h | 1 +
 3 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index f0cdff0c5fbf..6a6b2c265fdb 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -2233,7 +2233,7 @@ static void loop_process_work(struct loop_worker *worker,
        int orig_flags = current->flags;
        struct loop_cmd *cmd;
 
-       current->flags |= PF_LOCAL_THROTTLE | PF_MEMALLOC_NOIO;
+       current->flags |= PF_LOCAL_THROTTLE | PF_MEMALLOC_NOIO | PF_IO_THREAD;
        spin_lock_irq(&lo->lo_work_lock);
        while (!list_empty(cmd_list)) {
                cmd = container_of(
diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c
index 9dc6e74b265c..4f04d6706a0b 100644
--- a/fs/ext4/balloc.c
+++ b/fs/ext4/balloc.c
@@ -596,9 +596,9 @@ static int ext4_has_free_clusters(struct ext4_sb_info *sbi,
                return 1;
 
        /* Hm, nope.  Are (enough) root reserved clusters available? */
-       if (uid_eq(sbi->s_resuid, current_fsuid()) ||
+       if (((uid_eq(sbi->s_resuid, current_fsuid()) ||
            (!gid_eq(sbi->s_resgid, GLOBAL_ROOT_GID) && 
in_group_p(sbi->s_resgid)) ||
-           capable(CAP_SYS_RESOURCE) ||
+           capable(CAP_SYS_RESOURCE)) && !(current->flags & PF_IO_THREAD)) ||
            (flags & EXT4_MB_USE_ROOT_BLOCKS)) {
 
                if (free_clusters >= (nclusters + dirty_clusters +
diff --git a/include/linux/sched.h b/include/linux/sched.h
index d4b45fe3c971..7d8d66996ac6 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1580,6 +1580,7 @@ extern struct pid *cad_pid;
 #define PF_VCPU                        0x00000001      /* I'm a virtual CPU */
 #define PF_IDLE                        0x00000002      /* I am an IDLE thread 
*/
 #define PF_EXITING             0x00000004      /* Getting shut down */
+#define PF_IO_THREAD            0x00000008      /* I'm IO thread */
 #define PF_IO_WORKER           0x00000010      /* Task is an IO worker */
 #define PF_WQ_WORKER           0x00000020      /* I'm a workqueue worker */
 #define PF_FORKNOEXEC          0x00000040      /* Forked but didn't exec */
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to