fs: Fix hang with BSD accounting on frozen filesystem
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / kernel / acct.c
index b9bd7f098ee5d17fc8fa41bb823b80e0b94df3d6..8d6e145138bb9d2e39e93933177f63536d73d018 100644 (file)
@@ -539,6 +539,12 @@ static void do_acct_process(struct bsd_acct_struct *acct,
        ac.ac_rw = encode_comp_t(ac.ac_io / 1024);
        ac.ac_swaps = encode_comp_t(0);
 
+       /*
+        * Get freeze protection. If the fs is frozen, just skip the write
+        * as we could deadlock the system otherwise.
+        */
+       if (!file_start_write_trylock(file))
+               goto out;
        /*
         * Kernel segment override to datasegment and write it
         * to the accounting file.
@@ -554,6 +560,7 @@ static void do_acct_process(struct bsd_acct_struct *acct,
                               sizeof(acct_t), &file->f_pos);
        current->signal->rlim[RLIMIT_FSIZE].rlim_cur = flim;
        set_fs(fs);
+       file_end_write(file);
 out:
        revert_creds(orig_cred);
 }