Merge tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 3 Feb 2018 21:49:22 +0000 (13:49 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 3 Feb 2018 21:49:22 +0000 (13:49 -0800)
Pull ext4 updates from Ted Ts'o:
 "Only miscellaneous cleanups and bug fixes for ext4 this cycle"

* tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4:
  ext4: create ext4_kset dynamically
  ext4: create ext4_feat kobject dynamically
  ext4: release kobject/kset even when init/register fail
  ext4: fix incorrect indentation of if statement
  ext4: correct documentation for grpid mount option
  ext4: use 'sbi' instead of 'EXT4_SB(sb)'
  ext4: save error to disk in __ext4_grp_locked_error()
  jbd2: fix sphinx kernel-doc build warnings
  ext4: fix a race in the ext4 shutdown path
  mbcache: make sure c_entry_count is not decremented past zero
  ext4: no need flush workqueue before destroying it
  ext4: fixed alignment and minor code cleanup in ext4.h
  ext4: fix ENOSPC handling in DAX page fault handler
  dax: pass detailed error code from dax_iomap_fault()
  mbcache: revert "fs/mbcache.c: make count_objects() more robust"
  mbcache: initialize entry->e_referenced in mb_cache_entry_create()
  ext4: fix up remaining files with SPDX cleanups

38 files changed:
Documentation/filesystems/ext4.txt
fs/dax.c
fs/ext2/file.c
fs/ext4/acl.h
fs/ext4/balloc.c
fs/ext4/block_validity.c
fs/ext4/ext4.h
fs/ext4/ext4_extents.h
fs/ext4/ext4_jbd2.h
fs/ext4/extents.c
fs/ext4/extents_status.h
fs/ext4/file.c
fs/ext4/fsmap.c
fs/ext4/fsmap.h
fs/ext4/hash.c
fs/ext4/ialloc.c
fs/ext4/inline.c
fs/ext4/inode.c
fs/ext4/mballoc.c
fs/ext4/mballoc.h
fs/ext4/migrate.c
fs/ext4/move_extent.c
fs/ext4/namei.c
fs/ext4/resize.c
fs/ext4/super.c
fs/ext4/sysfs.c
fs/ext4/truncate.h
fs/ext4/xattr.h
fs/jbd2/checkpoint.c
fs/jbd2/commit.c
fs/jbd2/journal.c
fs/jbd2/recovery.c
fs/jbd2/revoke.c
fs/jbd2/transaction.c
fs/mbcache.c
fs/xfs/xfs_file.c
include/linux/dax.h
include/linux/jbd2.h

index 8cd63e16f171c5dbcede0e53ea3a955a07fc05a8..7f628b9f7c4b4821589f357ec92b0ee91fa41b7b 100644 (file)
@@ -232,7 +232,7 @@ data_err=ignore(*)  Just print an error message if an error occurs
 data_err=abort         Abort the journal if an error occurs in a file
                        data buffer in ordered mode.
 
-grpid                  Give objects the same group ID as their creator.
+grpid                  New objects have the group ID of their parent.
 bsdgroups
 
 nogrpid                (*)     New objects have the group ID of their creator.
index 6ee6f7e24f5a4b8f90a35cde75f0987d63eeb152..0276df90e86c588f1908409fee23c0152e0d63a6 100644 (file)
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -1095,7 +1095,7 @@ static bool dax_fault_is_synchronous(unsigned long flags,
 }
 
 static int dax_iomap_pte_fault(struct vm_fault *vmf, pfn_t *pfnp,
-                              const struct iomap_ops *ops)
+                              int *iomap_errp, const struct iomap_ops *ops)
 {
        struct vm_area_struct *vma = vmf->vma;
        struct address_space *mapping = vma->vm_file->f_mapping;
@@ -1148,6 +1148,8 @@ static int dax_iomap_pte_fault(struct vm_fault *vmf, pfn_t *pfnp,
         * that we never have to deal with more than a single extent here.
         */
        error = ops->iomap_begin(inode, pos, PAGE_SIZE, flags, &iomap);
+       if (iomap_errp)
+               *iomap_errp = error;
        if (error) {
                vmf_ret = dax_fault_return(error);
                goto unlock_entry;
@@ -1481,6 +1483,7 @@ static int dax_iomap_pmd_fault(struct vm_fault *vmf, pfn_t *pfnp,
  * @vmf: The description of the fault
  * @pe_size: Size of the page to fault in
  * @pfnp: PFN to insert for synchronous faults if fsync is required
+ * @iomap_errp: Storage for detailed error code in case of error
  * @ops: Iomap ops passed from the file system
  *
  * When a page fault occurs, filesystems may call this helper in
@@ -1489,11 +1492,11 @@ static int dax_iomap_pmd_fault(struct vm_fault *vmf, pfn_t *pfnp,
  * successfully.
  */
 int dax_iomap_fault(struct vm_fault *vmf, enum page_entry_size pe_size,
-                   pfn_t *pfnp, const struct iomap_ops *ops)
+                   pfn_t *pfnp, int *iomap_errp, const struct iomap_ops *ops)
 {
        switch (pe_size) {
        case PE_SIZE_PTE:
-               return dax_iomap_pte_fault(vmf, pfnp, ops);
+               return dax_iomap_pte_fault(vmf, pfnp, iomap_errp, ops);
        case PE_SIZE_PMD:
                return dax_iomap_pmd_fault(vmf, pfnp, ops);
        default:
index 2da67699dc33b7d2e9835accf55b235307665302..09640220fda8a5388c84fcd31e63b251b478bb8e 100644 (file)
@@ -100,7 +100,7 @@ static int ext2_dax_fault(struct vm_fault *vmf)
        }
        down_read(&ei->dax_sem);
 
-       ret = dax_iomap_fault(vmf, PE_SIZE_PTE, NULL, &ext2_iomap_ops);
+       ret = dax_iomap_fault(vmf, PE_SIZE_PTE, NULL, NULL, &ext2_iomap_ops);
 
        up_read(&ei->dax_sem);
        if (vmf->flags & FAULT_FLAG_WRITE)
index a48fc5ae2701b16136cdb0efabbed87f3155855d..9b63f5416a2f057d1dd7000b41d43e1b56e32b49 100644 (file)
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+// SPDX-License-Identifier: GPL-2.0
 /*
   File: fs/ext4/acl.h
 
index a943e568292e95b9f57c2aee3078c3f2baf6d948..f9b3e0a83526a333241e8b5410103b999aae1e23 100644 (file)
@@ -355,10 +355,10 @@ static ext4_fsblk_t ext4_valid_block_bitmap(struct super_block *sb,
        blk = ext4_inode_table(sb, desc);
        offset = blk - group_first_block;
        next_zero_bit = ext4_find_next_zero_bit(bh->b_data,
-                       EXT4_B2C(sbi, offset + EXT4_SB(sb)->s_itb_per_group),
+                       EXT4_B2C(sbi, offset + sbi->s_itb_per_group),
                        EXT4_B2C(sbi, offset));
        if (next_zero_bit <
-           EXT4_B2C(sbi, offset + EXT4_SB(sb)->s_itb_per_group))
+           EXT4_B2C(sbi, offset + sbi->s_itb_per_group))
                /* bad bitmap for inode tables */
                return blk;
        return 0;
index bee888e0e2db3e7ae415ab9d7f67c45b6a29061a..913061c0de1b35f358f2dcbe8ffd5baad7c3ed04 100644 (file)
@@ -147,11 +147,11 @@ int ext4_setup_system_zone(struct super_block *sb)
        int ret;
 
        if (!test_opt(sb, BLOCK_VALIDITY)) {
-               if (EXT4_SB(sb)->system_blks.rb_node)
+               if (sbi->system_blks.rb_node)
                        ext4_release_system_zone(sb);
                return 0;
        }
-       if (EXT4_SB(sb)->system_blks.rb_node)
+       if (sbi->system_blks.rb_node)
                return 0;
 
        for (i=0; i < ngroups; i++) {
@@ -173,7 +173,7 @@ int ext4_setup_system_zone(struct super_block *sb)
        }
 
        if (test_opt(sb, DEBUG))
-               debug_print_tree(EXT4_SB(sb));
+               debug_print_tree(sbi);
        return 0;
 }
 
index 4e091eae38b17f6dde7603425da4767590295c53..3241475a1733492e8c88a58dfd9668ad330bbcb9 100644 (file)
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+// SPDX-License-Identifier: GPL-2.0
 /*
  *  ext4.h
  *
@@ -611,10 +611,10 @@ enum {
 /*
  * Flags used by ext4_free_blocks
  */
-#define EXT4_FREE_BLOCKS_METADATA      0x0001
-#define EXT4_FREE_BLOCKS_FORGET                0x0002
-#define EXT4_FREE_BLOCKS_VALIDATED     0x0004
-#define EXT4_FREE_BLOCKS_NO_QUOT_UPDATE        0x0008
+#define EXT4_FREE_BLOCKS_METADATA              0x0001
+#define EXT4_FREE_BLOCKS_FORGET                        0x0002
+#define EXT4_FREE_BLOCKS_VALIDATED             0x0004
+#define EXT4_FREE_BLOCKS_NO_QUOT_UPDATE                0x0008
 #define EXT4_FREE_BLOCKS_NOFREE_FIRST_CLUSTER  0x0010
 #define EXT4_FREE_BLOCKS_NOFREE_LAST_CLUSTER   0x0020
 
@@ -1986,10 +1986,10 @@ static inline __le16 ext4_rec_len_to_disk(unsigned len, unsigned blocksize)
 
 /* Legal values for the dx_root hash_version field: */
 
-#define DX_HASH_LEGACY         0
-#define DX_HASH_HALF_MD4       1
-#define DX_HASH_TEA            2
-#define DX_HASH_LEGACY_UNSIGNED        3
+#define DX_HASH_LEGACY                 0
+#define DX_HASH_HALF_MD4               1
+#define DX_HASH_TEA                    2
+#define DX_HASH_LEGACY_UNSIGNED                3
 #define DX_HASH_HALF_MD4_UNSIGNED      4
 #define DX_HASH_TEA_UNSIGNED           5
 
@@ -2000,7 +2000,6 @@ static inline u32 ext4_chksum(struct ext4_sb_info *sbi, u32 crc,
                struct shash_desc shash;
                char ctx[4];
        } desc;
-       int err;
 
        BUG_ON(crypto_shash_descsize(sbi->s_chksum_driver)!=sizeof(desc.ctx));
 
@@ -2008,8 +2007,7 @@ static inline u32 ext4_chksum(struct ext4_sb_info *sbi, u32 crc,
        desc.shash.flags = 0;
        *(u32 *)desc.ctx = crc;
 
-       err = crypto_shash_update(&desc.shash, address, length);
-       BUG_ON(err);
+       BUG_ON(crypto_shash_update(&desc.shash, address, length));
 
        return *(u32 *)desc.ctx;
 }
index 8ecf84b8f5a14a9159a53c69a0f170ec406e1bd7..98fb0c119c6827dd50b86ac3521f216bba41170c 100644 (file)
@@ -1,19 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Copyright (c) 2003-2006, Cluster File Systems, Inc, info@clusterfs.com
  * Written by Alex Tomas <alex@clusterfs.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-
  */
 
 #ifndef _EXT4_EXTENTS
index 48143e32411c4cabfdd56bebe41c8fdc522c9665..15b6dd7337805ba51bc39606d6ab6c9212ba5db7 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * ext4_jbd2.h
  *
@@ -5,10 +6,6 @@
  *
  * Copyright 1998--1999 Red Hat corp --- All Rights Reserved
  *
- * This file is part of the Linux kernel and is made available under
- * the terms of the GNU General Public License, version 2, or at your
- * option, any later version, incorporated herein by reference.
- *
  * Ext4-specific journaling extensions.
  */
 
index c941251ac0c008587b1aaee10fb52e27a50e684a..054416e9d827129d335561999c6c1988b1993df2 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Copyright (c) 2003-2006, Cluster File Systems, Inc, info@clusterfs.com
  * Written by Alex Tomas <alex@clusterfs.com>
@@ -5,19 +6,6 @@
  * Architecture independence:
  *   Copyright (c) 2005, Bull S.A.
  *   Written by Pierre Peiffer <pierre.peiffer@bull.net>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-
  */
 
 /*
index ca90fc96f47e25f10d3ffa7fecbf1bf1d4d3085a..8efdeb903d6ba2104aa79c5c303d2a2873901541 100644 (file)
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+// SPDX-License-Identifier: GPL-2.0
 /*
  *  fs/ext4/extents_status.h
  *
index a0ae27b1bc6635d0ea9ec713e0079fdeff6e331a..fb6f023622fe116d1af3a8604fb33783f3fdf662 100644 (file)
@@ -280,7 +280,8 @@ out:
 static int ext4_dax_huge_fault(struct vm_fault *vmf,
                enum page_entry_size pe_size)
 {
-       int result;
+       int result, error = 0;
+       int retries = 0;
        handle_t *handle = NULL;
        struct inode *inode = file_inode(vmf->vma->vm_file);
        struct super_block *sb = inode->i_sb;
@@ -304,6 +305,7 @@ static int ext4_dax_huge_fault(struct vm_fault *vmf,
                sb_start_pagefault(sb);
                file_update_time(vmf->vma->vm_file);
                down_read(&EXT4_I(inode)->i_mmap_sem);
+retry:
                handle = ext4_journal_start_sb(sb, EXT4_HT_WRITE_PAGE,
                                               EXT4_DATA_TRANS_BLOCKS(sb));
                if (IS_ERR(handle)) {
@@ -314,9 +316,13 @@ static int ext4_dax_huge_fault(struct vm_fault *vmf,
        } else {
                down_read(&EXT4_I(inode)->i_mmap_sem);
        }
-       result = dax_iomap_fault(vmf, pe_size, &pfn, &ext4_iomap_ops);
+       result = dax_iomap_fault(vmf, pe_size, &pfn, &error, &ext4_iomap_ops);
        if (write) {
                ext4_journal_stop(handle);
+
+               if ((result & VM_FAULT_ERROR) && error == -ENOSPC &&
+                   ext4_should_retry_alloc(sb, &retries))
+                       goto retry;
                /* Handling synchronous page fault? */
                if (result & VM_FAULT_NEEDDSYNC)
                        result = dax_finish_sync_fault(vmf, pe_size, pfn);
index 7ec340898598081e4322b190dce3372d6b14095d..e871c4bf18e9f7fb55ce93d14cef4643cdfc0d92 100644 (file)
@@ -1,21 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright (C) 2017 Oracle.  All Rights Reserved.
  *
  * Author: Darrick J. Wong <darrick.wong@oracle.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it would be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write the Free Software Foundation,
- * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 #include "ext4.h"
 #include <linux/fsmap.h>
index 9a2cd367cc66bd0b6ee97cade916cbc801051a7a..68c8001fee8545f65eb52c3c90e03ac274e69f81 100644 (file)
@@ -1,21 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright (C) 2017 Oracle.  All Rights Reserved.
  *
  * Author: Darrick J. Wong <darrick.wong@oracle.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it would be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write the Free Software Foundation,
- * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 #ifndef __EXT4_FSMAP_H__
 #define        __EXT4_FSMAP_H__
index 00c6dd29e621f91a0adab2c1acfef4096347f810..e22dcfab308bcc529e32218507ffea5c648c8edd 100644 (file)
@@ -1,12 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *  linux/fs/ext4/hash.c
  *
  * Copyright (C) 2002 by Theodore Ts'o
- *
- * This file is released under the GPL v2.
- *
- * This file may be redistributed under the terms of the GNU Public
- * License.
  */
 
 #include <linux/fs.h>
index b32cf263750d1d3b2024847e78bf1c6181e8a44f..7830d28df331d8eb69374851ba59163c36f0eaa7 100644 (file)
@@ -303,7 +303,7 @@ void ext4_free_inode(handle_t *handle, struct inode *inode)
        /* Do this BEFORE marking the inode not in use or returning an error */
        ext4_clear_inode(inode);
 
-       es = EXT4_SB(sb)->s_es;
+       es = sbi->s_es;
        if (ino < EXT4_FIRST_INO(sb) || ino > le32_to_cpu(es->s_inodes_count)) {
                ext4_error(sb, "reserved or nonexistent inode %lu", ino);
                goto error_return;
@@ -1157,7 +1157,7 @@ got:
        ext4_clear_state_flags(ei); /* Only relevant on 32-bit archs */
        ext4_set_inode_state(inode, EXT4_STATE_NEW);
 
-       ei->i_extra_isize = EXT4_SB(sb)->s_want_extra_isize;
+       ei->i_extra_isize = sbi->s_want_extra_isize;
        ei->i_inline_off = 0;
        if (ext4_has_feature_inline_data(sb))
                ext4_set_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA);
index a8b987b7117356cfee659fe57b9b9379a4fc3751..7c4165b8850516f027530b0b71b9ef080d050219 100644 (file)
@@ -1,15 +1,7 @@
+// SPDX-License-Identifier: LGPL-2.1
 /*
  * Copyright (c) 2012 Taobao.
  * Written by Tao Ma <boyu.mt@taobao.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2.1 of the GNU Lesser General Public License
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
  */
 
 #include <linux/iomap.h>
index 0eff5b761c6e0687a91daf716b44c683f06a5b47..c94780075b04f752b1cfdec9ccf6f631bd874116 100644 (file)
@@ -3768,10 +3768,18 @@ static ssize_t ext4_direct_IO_write(struct kiocb *iocb, struct iov_iter *iter)
                /* Credits for sb + inode write */
                handle = ext4_journal_start(inode, EXT4_HT_INODE, 2);
                if (IS_ERR(handle)) {
-                       /* This is really bad luck. We've written the data
-                        * but cannot extend i_size. Bail out and pretend
-                        * the write failed... */
-                       ret = PTR_ERR(handle);
+                       /*
+                        * We wrote the data but cannot extend
+                        * i_size. Bail out. In async io case, we do
+                        * not return error here because we have
+                        * already submmitted the corresponding
+                        * bio. Returning error here makes the caller
+                        * think that this IO is done and failed
+                        * resulting in race with bio's completion
+                        * handler.
+                        */
+                       if (!ret)
+                               ret = PTR_ERR(handle);
                        if (inode->i_nlink)
                                ext4_orphan_del(NULL, inode);
 
index d9f8b90a93edcb2a685375479c9227ed99463003..769a62708b1cf64168e884159f9cb554dff816bc 100644 (file)
@@ -1,19 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Copyright (c) 2003-2006, Cluster File Systems, Inc, info@clusterfs.com
  * Written by Alex Tomas <alex@clusterfs.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-
  */
 
 
@@ -769,10 +757,10 @@ void ext4_mb_generate_buddy(struct super_block *sb,
        clear_bit(EXT4_GROUP_INFO_NEED_INIT_BIT, &(grp->bb_state));
 
        period = get_cycles() - period;
-       spin_lock(&EXT4_SB(sb)->s_bal_lock);
-       EXT4_SB(sb)->s_mb_buddies_generated++;
-       EXT4_SB(sb)->s_mb_generation_time += period;
-       spin_unlock(&EXT4_SB(sb)->s_bal_lock);
+       spin_lock(&sbi->s_bal_lock);
+       sbi->s_mb_buddies_generated++;
+       sbi->s_mb_generation_time += period;
+       spin_unlock(&sbi->s_bal_lock);
 }
 
 static void mb_regenerate_buddy(struct ext4_buddy *e4b)
@@ -1459,7 +1447,7 @@ static void mb_free_blocks(struct inode *inode, struct ext4_buddy *e4b,
                ext4_fsblk_t blocknr;
 
                blocknr = ext4_group_first_block_no(sb, e4b->bd_group);
-               blocknr += EXT4_C2B(EXT4_SB(sb), block);
+               blocknr += EXT4_C2B(sbi, block);
                ext4_grp_locked_error(sb, e4b->bd_group,
                                      inode ? inode->i_ino : 0,
                                      blocknr,
@@ -4850,9 +4838,9 @@ do_more:
        if (in_range(ext4_block_bitmap(sb, gdp), block, count) ||
            in_range(ext4_inode_bitmap(sb, gdp), block, count) ||
            in_range(block, ext4_inode_table(sb, gdp),
-                    EXT4_SB(sb)->s_itb_per_group) ||
+                    sbi->s_itb_per_group) ||
            in_range(block + count - 1, ext4_inode_table(sb, gdp),
-                    EXT4_SB(sb)->s_itb_per_group)) {
+                    sbi->s_itb_per_group)) {
 
                ext4_error(sb, "Freeing blocks in system zone - "
                           "Block = %llu, count = %lu", block, count);
index dcf52540f379c63af743eb5bd0539deb7923ad3d..88c98f17e3d9eea879d25fd7e360a61297753c51 100644 (file)
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+// SPDX-License-Identifier: GPL-2.0
 /*
  *  fs/ext4/mballoc.h
  *
index cf5181b62df17ef203e6068d99e51c9bb34e5199..61a9d19278172f346b3225e38e5a6acd58be0287 100644 (file)
@@ -1,15 +1,8 @@
+// SPDX-License-Identifier: LGPL-2.1
 /*
  * Copyright IBM Corporation, 2007
  * Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
  *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2.1 of the GNU Lesser General Public License
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
  */
 
 #include <linux/slab.h>
index 9bb36909ec92066a9b74f612b100212eaa68dddd..b96e4bd3b3ec42b750fbd23f942c6ca8072c9285 100644 (file)
@@ -1,16 +1,8 @@
+// SPDX-License-Identifier: LGPL-2.1
 /*
  * Copyright (c) 2008,2009 NEC Software Tohoku, Ltd.
  * Written by Takashi Sato <t-sato@yk.jp.nec.com>
  *            Akira Fujita <a-fujita@rs.jp.nec.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2.1 of the GNU Lesser General Public License
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
  */
 
 #include <linux/fs.h>
index 6660686e505a394818aa38cd4bb9fece1129fef4..9aa1deb1a5256daf58dddf15b9c269b6c0969a9b 100644 (file)
@@ -3222,9 +3222,9 @@ static int ext4_link(struct dentry *old_dentry,
        if (err)
                return err;
 
-       if ((ext4_test_inode_flag(dir, EXT4_INODE_PROJINHERIT)) &&
-          (!projid_eq(EXT4_I(dir)->i_projid,
-                      EXT4_I(old_dentry->d_inode)->i_projid)))
+       if ((ext4_test_inode_flag(dir, EXT4_INODE_PROJINHERIT)) &&
+           (!projid_eq(EXT4_I(dir)->i_projid,
+                       EXT4_I(old_dentry->d_inode)->i_projid)))
                return -EXDEV;
 
        err = dquot_initialize(dir);
index 50443bda8e98fb9c5e6fa3f2433e95b1f327e7c3..b6bec270a8e48a340d5223e120f50f45429b14c1 100644 (file)
@@ -1477,7 +1477,7 @@ static int ext4_flex_group_add(struct super_block *sb,
                goto exit_journal;
 
        group = flex_gd->groups[0].group;
-       BUG_ON(group != EXT4_SB(sb)->s_groups_count);
+       BUG_ON(group != sbi->s_groups_count);
        err = ext4_add_new_descs(handle, sb, group,
                                resize_inode, flex_gd->count);
        if (err)
index 5de959fb0244291b2b29874a242c049fd8e6bcf0..82eead1c8b84a62e50f77b6547a515bff1c72084 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *  linux/fs/ext4/super.c
  *
@@ -743,6 +744,7 @@ __acquires(bitlock)
        }
 
        ext4_unlock_group(sb, grp);
+       ext4_commit_super(sb, 1);
        ext4_handle_error(sb);
        /*
         * We only get here in the ERRORS_RO case; relocking the group
@@ -871,7 +873,6 @@ static void ext4_put_super(struct super_block *sb)
        ext4_unregister_li_request(sb);
        ext4_quota_off_umount(sb);
 
-       flush_workqueue(sbi->rsv_conversion_wq);
        destroy_workqueue(sbi->rsv_conversion_wq);
 
        if (sbi->s_journal) {
@@ -2677,7 +2678,7 @@ static ext4_fsblk_t descriptor_loc(struct super_block *sb,
         * compensate.
         */
        if (sb->s_blocksize == 1024 && nr == 0 &&
-           le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block) == 0)
+           le32_to_cpu(sbi->s_es->s_first_data_block) == 0)
                has_super++;
 
        return (has_super + ext4_group_first_block_no(sb, bg));
@@ -3122,7 +3123,7 @@ int ext4_register_li_request(struct super_block *sb,
 {
        struct ext4_sb_info *sbi = EXT4_SB(sb);
        struct ext4_li_request *elr = NULL;
-       ext4_group_t ngroups = EXT4_SB(sb)->s_groups_count;
+       ext4_group_t ngroups = sbi->s_groups_count;
        int ret = 0;
 
        mutex_lock(&ext4_li_mtx);
@@ -4837,7 +4838,7 @@ static int ext4_sync_fs(struct super_block *sb, int wait)
        bool needs_barrier = false;
        struct ext4_sb_info *sbi = EXT4_SB(sb);
 
-       if (unlikely(ext4_forced_shutdown(EXT4_SB(sb))))
+       if (unlikely(ext4_forced_shutdown(sbi)))
                return 0;
 
        trace_ext4_sync_fs(sb, wait);
index e21afd52e7d7906bd1ff473b090a1d938307c492..1205261f130cbfa8ae82632399aa7beb73e4cc6a 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/time.h>
 #include <linux/fs.h>
 #include <linux/seq_file.h>
+#include <linux/slab.h>
 #include <linux/proc_fs.h>
 
 #include "ext4.h"
@@ -329,6 +330,13 @@ static void ext4_sb_release(struct kobject *kobj)
        complete(&sbi->s_kobj_unregister);
 }
 
+static void ext4_kset_release(struct kobject *kobj)
+{
+       struct kset *kset = container_of(kobj, struct kset, kobj);
+
+       kfree(kset);
+}
+
 static const struct sysfs_ops ext4_attr_ops = {
        .show   = ext4_attr_show,
        .store  = ext4_attr_store,
@@ -342,20 +350,18 @@ static struct kobj_type ext4_sb_ktype = {
 
 static struct kobj_type ext4_ktype = {
        .sysfs_ops      = &ext4_attr_ops,
+       .release        = ext4_kset_release,
 };
 
-static struct kset ext4_kset = {
-       .kobj   = {.ktype = &ext4_ktype},
-};
+static struct kset *ext4_kset;
 
 static struct kobj_type ext4_feat_ktype = {
        .default_attrs  = ext4_feat_attrs,
        .sysfs_ops      = &ext4_attr_ops,
+       .release        = (void (*)(struct kobject *))kfree,
 };
 
-static struct kobject ext4_feat = {
-       .kset   = &ext4_kset,
-};
+static struct kobject *ext4_feat;
 
 #define PROC_FILE_SHOW_DEFN(name) \
 static int name##_open(struct inode *inode, struct file *file) \
@@ -392,12 +398,15 @@ int ext4_register_sysfs(struct super_block *sb)
        const struct ext4_proc_files *p;
        int err;
 
-       sbi->s_kobj.kset = &ext4_kset;
+       sbi->s_kobj.kset = ext4_kset;
        init_completion(&sbi->s_kobj_unregister);
        err = kobject_init_and_add(&sbi->s_kobj, &ext4_sb_ktype, NULL,
                                   "%s", sb->s_id);
-       if (err)
+       if (err) {
+               kobject_put(&sbi->s_kobj);
+               wait_for_completion(&sbi->s_kobj_unregister);
                return err;
+       }
 
        if (ext4_proc_root)
                sbi->s_proc = proc_mkdir(sb->s_id, ext4_proc_root);
@@ -427,25 +436,45 @@ int __init ext4_init_sysfs(void)
 {
        int ret;
 
-       kobject_set_name(&ext4_kset.kobj, "ext4");
-       ext4_kset.kobj.parent = fs_kobj;
-       ret = kset_register(&ext4_kset);
+       ext4_kset = kzalloc(sizeof(*ext4_kset), GFP_KERNEL);
+       if (!ext4_kset)
+               return -ENOMEM;
+
+       kobject_set_name(&ext4_kset->kobj, "ext4");
+       ext4_kset->kobj.parent = fs_kobj;
+       ext4_kset->kobj.ktype = &ext4_ktype;
+       ret = kset_register(ext4_kset);
        if (ret)
-               return ret;
+               goto kset_err;
+
+       ext4_feat = kzalloc(sizeof(*ext4_feat), GFP_KERNEL);
+       if (!ext4_feat) {
+               ret = -ENOMEM;
+               goto kset_err;
+       }
 
-       ret = kobject_init_and_add(&ext4_feat, &ext4_feat_ktype,
+       ext4_feat->kset = ext4_kset;
+       ret = kobject_init_and_add(ext4_feat, &ext4_feat_ktype,
                                   NULL, "features");
        if (ret)
-               kset_unregister(&ext4_kset);
-       else
-               ext4_proc_root = proc_mkdir(proc_dirname, NULL);
+               goto feat_err;
+
+       ext4_proc_root = proc_mkdir(proc_dirname, NULL);
+       return ret;
+
+feat_err:
+       kobject_put(ext4_feat);
+kset_err:
+       kset_unregister(ext4_kset);
+       ext4_kset = NULL;
        return ret;
 }
 
 void ext4_exit_sysfs(void)
 {
-       kobject_put(&ext4_feat);
-       kset_unregister(&ext4_kset);
+       kobject_put(ext4_feat);
+       kset_unregister(ext4_kset);
+       ext4_kset = NULL;
        remove_proc_entry(proc_dirname, NULL);
        ext4_proc_root = NULL;
 }
index b64a9fa0ff41d1d9cc431342e43fbc5aaca10129..0cb13badf473cb3864d96dea548ef9ba921cc32b 100644 (file)
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+// SPDX-License-Identifier: GPL-2.0
 /*
  * linux/fs/ext4/truncate.h
  *
index f8cc07588ac91ce449017f4d354a90edd0f1f336..dd54c4f995c8d0439c7647963cd8394b3f5e94e0 100644 (file)
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+// SPDX-License-Identifier: GPL-2.0
 /*
   File: fs/ext4/xattr.h
 
index 4055f51617eff973345a887e7df41259090f49ec..c125d662777c6737e33b9a605973f0808aeb33f3 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * linux/fs/jbd2/checkpoint.c
  *
@@ -5,10 +6,6 @@
  *
  * Copyright 1999 Red Hat Software --- All Rights Reserved
  *
- * This file is part of the Linux kernel and is made available under
- * the terms of the GNU General Public License, version 2, or at your
- * option, any later version, incorporated herein by reference.
- *
  * Checkpoint routines for the generic filesystem journaling code.
  * Part of the ext2fs journaling system.
  *
index 3c1c31321d9bdde030191cae31cadd9856d597fe..8de0e7723316c266ca752336c6bc48f6ac56cc3d 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * linux/fs/jbd2/commit.c
  *
@@ -5,10 +6,6 @@
  *
  * Copyright 1998 Red Hat corp --- All Rights Reserved
  *
- * This file is part of the Linux kernel and is made available under
- * the terms of the GNU General Public License, version 2, or at your
- * option, any later version, incorporated herein by reference.
- *
  * Journal commit routines for the generic filesystem journaling code;
  * part of the ext2fs journaling system.
  */
index 67546c7ad473bda16bd6f430e3f0f558c3a63107..3fbf48ec21881698325f3b84c4b2654485d7711b 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * linux/fs/jbd2/journal.c
  *
@@ -5,10 +6,6 @@
  *
  * Copyright 1998 Red Hat corp --- All Rights Reserved
  *
- * This file is part of the Linux kernel and is made available under
- * the terms of the GNU General Public License, version 2, or at your
- * option, any later version, incorporated herein by reference.
- *
  * Generic filesystem journal-writing code; part of the ext2fs
  * journaling system.
  *
index 02dd3360cb20cb39eb37b13e0f8eb4627d6ad1a9..f99910b69c78d6e37854a82689a4cadc9b4d3e1d 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * linux/fs/jbd2/recovery.c
  *
@@ -5,10 +6,6 @@
  *
  * Copyright 1999-2000 Red Hat Software --- All Rights Reserved
  *
- * This file is part of the Linux kernel and is made available under
- * the terms of the GNU General Public License, version 2, or at your
- * option, any later version, incorporated herein by reference.
- *
  * Journal recovery routines for the generic filesystem journaling code;
  * part of the ext2fs journaling system.
  */
index f9aefcda585418abcc37e58226eb39f3ac883172..696ef15ec9428ab63e025786e7075c180ad6f8ad 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * linux/fs/jbd2/revoke.c
  *
@@ -5,10 +6,6 @@
  *
  * Copyright 2000 Red Hat corp --- All Rights Reserved
  *
- * This file is part of the Linux kernel and is made available under
- * the terms of the GNU General Public License, version 2, or at your
- * option, any later version, incorporated herein by reference.
- *
  * Journal revoke routines for the generic filesystem journaling code;
  * part of the ext2fs journaling system.
  *
index 8b08044b31209fbed735ccfbe2771154a2e9185a..ac311037d7a59b03d6403a65c56c7978697463c6 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * linux/fs/jbd2/transaction.c
  *
@@ -5,10 +6,6 @@
  *
  * Copyright 1998 Red Hat corp --- All Rights Reserved
  *
- * This file is part of the Linux kernel and is made available under
- * the terms of the GNU General Public License, version 2, or at your
- * option, any later version, incorporated herein by reference.
- *
  * Generic filesystem transaction handling code; part of the ext2fs
  * journaling system.
  *
@@ -495,8 +492,10 @@ void jbd2_journal_free_reserved(handle_t *handle)
 EXPORT_SYMBOL(jbd2_journal_free_reserved);
 
 /**
- * int jbd2_journal_start_reserved(handle_t *handle) - start reserved handle
+ * int jbd2_journal_start_reserved() - start reserved handle
  * @handle: handle to start
+ * @type: for handle statistics
+ * @line_no: for handle statistics
  *
  * Start handle that has been previously reserved with jbd2_journal_reserve().
  * This attaches @handle to the running transaction (or creates one if there's
@@ -626,6 +625,7 @@ error_out:
  * int jbd2_journal_restart() - restart a handle .
  * @handle:  handle to restart
  * @nblocks: nr credits requested
+ * @gfp_mask: memory allocation flags (for start_this_handle)
  *
  * Restart a handle for a multi-transaction filesystem
  * operation.
index b8b8b9ced9f81c47a1f76da3ef61c2f9d4645c78..bf41e2e72c1883b7fba884a8f7006ecc50bcf768 100644 (file)
@@ -94,6 +94,7 @@ int mb_cache_entry_create(struct mb_cache *cache, gfp_t mask, u32 key,
        entry->e_key = key;
        entry->e_value = value;
        entry->e_reusable = reusable;
+       entry->e_referenced = 0;
        head = mb_cache_entry_head(cache, key);
        hlist_bl_lock(head);
        hlist_bl_for_each_entry(dup, dup_node, head, e_hash_list) {
@@ -238,7 +239,9 @@ void mb_cache_entry_delete(struct mb_cache *cache, u32 key, u64 value)
                        spin_lock(&cache->c_list_lock);
                        if (!list_empty(&entry->e_list)) {
                                list_del_init(&entry->e_list);
-                               cache->c_entry_count--;
+                               if (!WARN_ONCE(cache->c_entry_count == 0,
+               "mbcache: attempt to decrement c_entry_count past zero"))
+                                       cache->c_entry_count--;
                                atomic_dec(&entry->e_refcnt);
                        }
                        spin_unlock(&cache->c_list_lock);
@@ -269,9 +272,6 @@ static unsigned long mb_cache_count(struct shrinker *shrink,
        struct mb_cache *cache = container_of(shrink, struct mb_cache,
                                              c_shrink);
 
-       /* Unlikely, but not impossible */
-       if (unlikely(cache->c_entry_count < 0))
-               return 0;
        return cache->c_entry_count;
 }
 
index 8601275cc5e67cbb11db415688a04065d461ea27..9ea08326f876be556298d966f4ab193de0eba937 100644 (file)
@@ -1048,7 +1048,7 @@ __xfs_filemap_fault(
        if (IS_DAX(inode)) {
                pfn_t pfn;
 
-               ret = dax_iomap_fault(vmf, pe_size, &pfn, &xfs_iomap_ops);
+               ret = dax_iomap_fault(vmf, pe_size, &pfn, NULL, &xfs_iomap_ops);
                if (ret & VM_FAULT_NEEDDSYNC)
                        ret = dax_finish_sync_fault(vmf, pe_size, pfn);
        } else {
index 5258346c558c783b22bc5352e05e2042e2f20afb..0185ecdae1352d53f073d398b239c543c4d367d5 100644 (file)
@@ -96,7 +96,7 @@ bool dax_write_cache_enabled(struct dax_device *dax_dev);
 ssize_t dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter,
                const struct iomap_ops *ops);
 int dax_iomap_fault(struct vm_fault *vmf, enum page_entry_size pe_size,
-                   pfn_t *pfnp, const struct iomap_ops *ops);
+                   pfn_t *pfnp, int *errp, const struct iomap_ops *ops);
 int dax_finish_sync_fault(struct vm_fault *vmf, enum page_entry_size pe_size,
                          pfn_t pfn);
 int dax_delete_mapping_entry(struct address_space *mapping, pgoff_t index);
index 296d1e0ea87b14ffd8830d00c7ed38422fdd7d38..b708e5169d1df9657bfafa76f929addce88d5c85 100644 (file)
@@ -418,26 +418,41 @@ static inline void jbd_unlock_bh_journal_head(struct buffer_head *bh)
 #define JI_WAIT_DATA (1 << __JI_WAIT_DATA)
 
 /**
- * struct jbd_inode is the structure linking inodes in ordered mode
- *   present in a transaction so that we can sync them during commit.
+ * struct jbd_inode - The jbd_inode type is the structure linking inodes in
+ * ordered mode present in a transaction so that we can sync them during commit.
  */
 struct jbd2_inode {
-       /* Which transaction does this inode belong to? Either the running
-        * transaction or the committing one. [j_list_lock] */
+       /**
+        * @i_transaction:
+        *
+        * Which transaction does this inode belong to? Either the running
+        * transaction or the committing one. [j_list_lock]
+        */
        transaction_t *i_transaction;
 
-       /* Pointer to the running transaction modifying inode's data in case
-        * there is already a committing transaction touching it. [j_list_lock] */
+       /**
+        * @i_next_transaction:
+        *
+        * Pointer to the running transaction modifying inode's data in case
+        * there is already a committing transaction touching it. [j_list_lock]
+        */
        transaction_t *i_next_transaction;
 
-       /* List of inodes in the i_transaction [j_list_lock] */
+       /**
+        * @i_list: List of inodes in the i_transaction [j_list_lock]
+        */
        struct list_head i_list;
 
-       /* VFS inode this inode belongs to [constant during the lifetime
-        * of the structure] */
+       /**
+        * @i_vfs_inode:
+        *
+        * VFS inode this inode belongs to [constant for lifetime of structure]
+        */
        struct inode *i_vfs_inode;
 
-       /* Flags of inode [j_list_lock] */
+       /**
+        * @i_flags: Flags of inode [j_list_lock]
+        */
        unsigned long i_flags;
 };
 
@@ -447,12 +462,20 @@ struct jbd2_revoke_table_s;
  * struct handle_s - The handle_s type is the concrete type associated with
  *     handle_t.
  * @h_transaction: Which compound transaction is this update a part of?
+ * @h_journal: Which journal handle belongs to - used iff h_reserved set.
+ * @h_rsv_handle: Handle reserved for finishing the logical operation.
  * @h_buffer_credits: Number of remaining buffers we are allowed to dirty.
- * @h_ref: Reference count on this handle
- * @h_err: Field for caller's use to track errors through large fs operations
- * @h_sync: flag for sync-on-close
- * @h_jdata: flag to force data journaling
- * @h_aborted: flag indicating fatal error on handle
+ * @h_ref: Reference count on this handle.
+ * @h_err: Field for caller's use to track errors through large fs operations.
+ * @h_sync: Flag for sync-on-close.
+ * @h_jdata: Flag to force data journaling.
+ * @h_reserved: Flag for handle for reserved credits.
+ * @h_aborted: Flag indicating fatal error on handle.
+ * @h_type: For handle statistics.
+ * @h_line_no: For handle statistics.
+ * @h_start_jiffies: Handle Start time.
+ * @h_requested_credits: Holds @h_buffer_credits after handle is started.
+ * @saved_alloc_context: Saved context while transaction is open.
  **/
 
 /* Docbook can't yet cope with the bit fields, but will leave the documentation
@@ -462,32 +485,23 @@ struct jbd2_revoke_table_s;
 struct jbd2_journal_handle
 {
        union {
-               /* Which compound transaction is this update a part of? */
                transaction_t   *h_transaction;
                /* Which journal handle belongs to - used iff h_reserved set */
                journal_t       *h_journal;
        };
 
-       /* Handle reserved for finishing the logical operation */
        handle_t                *h_rsv_handle;
-
-       /* Number of remaining buffers we are allowed to dirty: */
        int                     h_buffer_credits;
-
-       /* Reference count on this handle */
        int                     h_ref;
-
-       /* Field for caller's use to track errors through large fs */
-       /* operations */
        int                     h_err;
 
        /* Flags [no locking] */
-       unsigned int    h_sync:         1;      /* sync-on-close */
-       unsigned int    h_jdata:        1;      /* force data journaling */
-       unsigned int    h_reserved:     1;      /* handle with reserved credits */
-       unsigned int    h_aborted:      1;      /* fatal error on handle */
-       unsigned int    h_type:         8;      /* for handle statistics */
-       unsigned int    h_line_no:      16;     /* for handle statistics */
+       unsigned int    h_sync:         1;
+       unsigned int    h_jdata:        1;
+       unsigned int    h_reserved:     1;
+       unsigned int    h_aborted:      1;
+       unsigned int    h_type:         8;
+       unsigned int    h_line_no:      16;
 
        unsigned long           h_start_jiffies;
        unsigned int            h_requested_credits;
@@ -729,228 +743,253 @@ jbd2_time_diff(unsigned long start, unsigned long end)
 /**
  * struct journal_s - The journal_s type is the concrete type associated with
  *     journal_t.
- * @j_flags:  General journaling state flags
- * @j_errno:  Is there an outstanding uncleared error on the journal (from a
- *     prior abort)?
- * @j_sb_buffer: First part of superblock buffer
- * @j_superblock: Second part of superblock buffer
- * @j_format_version: Version of the superblock format
- * @j_state_lock: Protect the various scalars in the journal
- * @j_barrier_count:  Number of processes waiting to create a barrier lock
- * @j_barrier: The barrier lock itself
- * @j_running_transaction: The current running transaction..
- * @j_committing_transaction: the transaction we are pushing to disk
- * @j_checkpoint_transactions: a linked circular list of all transactions
- *  waiting for checkpointing
- * @j_wait_transaction_locked: Wait queue for waiting for a locked transaction
- *  to start committing, or for a barrier lock to be released
- * @j_wait_done_commit: Wait queue for waiting for commit to complete
- * @j_wait_commit: Wait queue to trigger commit
- * @j_wait_updates: Wait queue to wait for updates to complete
- * @j_wait_reserved: Wait queue to wait for reserved buffer credits to drop
- * @j_checkpoint_mutex: Mutex for locking against concurrent checkpoints
- * @j_head: Journal head - identifies the first unused block in the journal
- * @j_tail: Journal tail - identifies the oldest still-used block in the
- *  journal.
- * @j_free: Journal free - how many free blocks are there in the journal?
- * @j_first: The block number of the first usable block
- * @j_last: The block number one beyond the last usable block
- * @j_dev: Device where we store the journal
- * @j_blocksize: blocksize for the location where we store the journal.
- * @j_blk_offset: starting block offset for into the device where we store the
- *     journal
- * @j_fs_dev: Device which holds the client fs.  For internal journal this will
- *     be equal to j_dev
- * @j_reserved_credits: Number of buffers reserved from the running transaction
- * @j_maxlen: Total maximum capacity of the journal region on disk.
- * @j_list_lock: Protects the buffer lists and internal buffer state.
- * @j_inode: Optional inode where we store the journal.  If present, all journal
- *     block numbers are mapped into this inode via bmap().
- * @j_tail_sequence:  Sequence number of the oldest transaction in the log
- * @j_transaction_sequence: Sequence number of the next transaction to grant
- * @j_commit_sequence: Sequence number of the most recently committed
- *  transaction
- * @j_commit_request: Sequence number of the most recent transaction wanting
- *     commit
- * @j_uuid: Uuid of client object.
- * @j_task: Pointer to the current commit thread for this journal
- * @j_max_transaction_buffers:  Maximum number of metadata buffers to allow in a
- *     single compound commit transaction
- * @j_commit_interval: What is the maximum transaction lifetime before we begin
- *  a commit?
- * @j_commit_timer:  The timer used to wakeup the commit thread
- * @j_revoke_lock: Protect the revoke table
- * @j_revoke: The revoke table - maintains the list of revoked blocks in the
- *     current transaction.
- * @j_revoke_table: alternate revoke tables for j_revoke
- * @j_wbuf: array of buffer_heads for jbd2_journal_commit_transaction
- * @j_wbufsize: maximum number of buffer_heads allowed in j_wbuf, the
- *     number that will fit in j_blocksize
- * @j_last_sync_writer: most recent pid which did a synchronous write
- * @j_history_lock: Protect the transactions statistics history
- * @j_proc_entry: procfs entry for the jbd statistics directory
- * @j_stats: Overall statistics
- * @j_private: An opaque pointer to fs-private information.
- * @j_trans_commit_map: Lockdep entity to track transaction commit dependencies
  */
-
 struct journal_s
 {
-       /* General journaling state flags [j_state_lock] */
+       /**
+        * @j_flags: General journaling state flags [j_state_lock]
+        */
        unsigned long           j_flags;
 
-       /*
+       /**
+        * @j_errno:
+        *
         * Is there an outstanding uncleared error on the journal (from a prior
         * abort)? [j_state_lock]
         */
        int                     j_errno;
 
-       /* The superblock buffer */
+       /**
+        * @j_sb_buffer: The first part of the superblock buffer.
+        */
        struct buffer_head      *j_sb_buffer;
+
+       /**
+        * @j_superblock: The second part of the superblock buffer.
+        */
        journal_superblock_t    *j_superblock;
 
-       /* Version of the superblock format */
+       /**
+        * @j_format_version: Version of the superblock format.
+        */
        int                     j_format_version;
 
-       /*
-        * Protect the various scalars in the journal
+       /**
+        * @j_state_lock: Protect the various scalars in the journal.
         */
        rwlock_t                j_state_lock;
 
-       /*
+       /**
+        * @j_barrier_count:
+        *
         * Number of processes waiting to create a barrier lock [j_state_lock]
         */
        int                     j_barrier_count;
 
-       /* The barrier lock itself */
+       /**
+        * @j_barrier: The barrier lock itself.
+        */
        struct mutex            j_barrier;
 
-       /*
+       /**
+        * @j_running_transaction:
+        *
         * Transactions: The current running transaction...
         * [j_state_lock] [caller holding open handle]
         */
        transaction_t           *j_running_transaction;
 
-       /*
+       /**
+        * @j_committing_transaction:
+        *
         * the transaction we are pushing to disk
         * [j_state_lock] [caller holding open handle]
         */
        transaction_t           *j_committing_transaction;
 
-       /*
+       /**
+        * @j_checkpoint_transactions:
+        *
         * ... and a linked circular list of all transactions waiting for
         * checkpointing. [j_list_lock]
         */
        transaction_t           *j_checkpoint_transactions;
 
-       /*
+       /**
+        * @j_wait_transaction_locked:
+        *
         * Wait queue for waiting for a locked transaction to start committing,
-        * or for a barrier lock to be released
+        * or for a barrier lock to be released.
         */
        wait_queue_head_t       j_wait_transaction_locked;
 
-       /* Wait queue for waiting for commit to complete */
+       /**
+        * @j_wait_done_commit: Wait queue for waiting for commit to complete.
+        */
        wait_queue_head_t       j_wait_done_commit;
 
-       /* Wait queue to trigger commit */
+       /**
+        * @j_wait_commit: Wait queue to trigger commit.
+        */
        wait_queue_head_t       j_wait_commit;
 
-       /* Wait queue to wait for updates to complete */
+       /**
+        * @j_wait_updates: Wait queue to wait for updates to complete.
+        */
        wait_queue_head_t       j_wait_updates;
 
-       /* Wait queue to wait for reserved buffer credits to drop */
+       /**
+        * @j_wait_reserved:
+        *
+        * Wait queue to wait for reserved buffer credits to drop.
+        */
        wait_queue_head_t       j_wait_reserved;
 
-       /* Semaphore for locking against concurrent checkpoints */
+       /**
+        * @j_checkpoint_mutex:
+        *
+        * Semaphore for locking against concurrent checkpoints.
+        */
        struct mutex            j_checkpoint_mutex;
 
-       /*
+       /**
+        * @j_chkpt_bhs:
+        *
         * List of buffer heads used by the checkpoint routine.  This
         * was moved from jbd2_log_do_checkpoint() to reduce stack
         * usage.  Access to this array is controlled by the
-        * j_checkpoint_mutex.  [j_checkpoint_mutex]
+        * @j_checkpoint_mutex.  [j_checkpoint_mutex]
         */
        struct buffer_head      *j_chkpt_bhs[JBD2_NR_BATCH];
-       
-       /*
+
+       /**
+        * @j_head:
+        *
         * Journal head: identifies the first unused block in the journal.
         * [j_state_lock]
         */
        unsigned long           j_head;
 
-       /*
+       /**
+        * @j_tail:
+        *
         * Journal tail: identifies the oldest still-used block in the journal.
         * [j_state_lock]
         */
        unsigned long           j_tail;
 
-       /*
+       /**
+        * @j_free:
+        *
         * Journal free: how many free blocks are there in the journal?
         * [j_state_lock]
         */
        unsigned long           j_free;
 
-       /*
-        * Journal start and end: the block numbers of the first usable block
-        * and one beyond the last usable block in the journal. [j_state_lock]
+       /**
+        * @j_first:
+        *
+        * The block number of the first usable block in the journal
+        * [j_state_lock].
         */
        unsigned long           j_first;
+
+       /**
+        * @j_last:
+        *
+        * The block number one beyond the last usable block in the journal
+        * [j_state_lock].
+        */
        unsigned long           j_last;
 
-       /*
-        * Device, blocksize and starting block offset for the location where we
-        * store the journal.
+       /**
+        * @j_dev: Device where we store the journal.
         */
        struct block_device     *j_dev;
+
+       /**
+        * @j_blocksize: Block size for the location where we store the journal.
+        */
        int                     j_blocksize;
+
+       /**
+        * @j_blk_offset:
+        *
+        * Starting block offset into the device where we store the journal.
+        */
        unsigned long long      j_blk_offset;
+
+       /**
+        * @j_devname: Journal device name.
+        */
        char                    j_devname[BDEVNAME_SIZE+24];
 
-       /*
+       /**
+        * @j_fs_dev:
+        *
         * Device which holds the client fs.  For internal journal this will be
         * equal to j_dev.
         */
        struct block_device     *j_fs_dev;
 
-       /* Total maximum capacity of the journal region on disk. */
+       /**
+        * @j_maxlen: Total maximum capacity of the journal region on disk.
+        */
        unsigned int            j_maxlen;
 
-       /* Number of buffers reserved from the running transaction */
+       /**
+        * @j_reserved_credits:
+        *
+        * Number of buffers reserved from the running transaction.
+        */
        atomic_t                j_reserved_credits;
 
-       /*
-        * Protects the buffer lists and internal buffer state.
+       /**
+        * @j_list_lock: Protects the buffer lists and internal buffer state.
         */
        spinlock_t              j_list_lock;
 
-       /* Optional inode where we store the journal.  If present, all */
-       /* journal block numbers are mapped into this inode via */
-       /* bmap(). */
+       /**
+        * @j_inode:
+        *
+        * Optional inode where we store the journal.  If present, all
+        * journal block numbers are mapped into this inode via bmap().
+        */
        struct inode            *j_inode;
 
-       /*
+       /**
+        * @j_tail_sequence:
+        *
         * Sequence number of the oldest transaction in the log [j_state_lock]
         */
        tid_t                   j_tail_sequence;
 
-       /*
+       /**
+        * @j_transaction_sequence:
+        *
         * Sequence number of the next transaction to grant [j_state_lock]
         */
        tid_t                   j_transaction_sequence;
 
-       /*
+       /**
+        * @j_commit_sequence:
+        *
         * Sequence number of the most recently committed transaction
         * [j_state_lock].
         */
        tid_t                   j_commit_sequence;
 
-       /*
+       /**
+        * @j_commit_request:
+        *
         * Sequence number of the most recent transaction wanting commit
         * [j_state_lock]
         */
        tid_t                   j_commit_request;
 
-       /*
+       /**
+        * @j_uuid:
+        *
         * Journal uuid: identifies the object (filesystem, LVM volume etc)
         * backed by this journal.  This will eventually be replaced by an array
         * of uuids, allowing us to index multiple devices within a single
@@ -958,85 +997,151 @@ struct journal_s
         */
        __u8                    j_uuid[16];
 
-       /* Pointer to the current commit thread for this journal */
+       /**
+        * @j_task: Pointer to the current commit thread for this journal.
+        */
        struct task_struct      *j_task;
 
-       /*
+       /**
+        * @j_max_transaction_buffers:
+        *
         * Maximum number of metadata buffers to allow in a single compound
-        * commit transaction
+        * commit transaction.
         */
        int                     j_max_transaction_buffers;
 
-       /*
+       /**
+        * @j_commit_interval:
+        *
         * What is the maximum transaction lifetime before we begin a commit?
         */
        unsigned long           j_commit_interval;
 
-       /* The timer used to wakeup the commit thread: */
+       /**
+        * @j_commit_timer: The timer used to wakeup the commit thread.
+        */
        struct timer_list       j_commit_timer;
 
-       /*
-        * The revoke table: maintains the list of revoked blocks in the
-        * current transaction.  [j_revoke_lock]
+       /**
+        * @j_revoke_lock: Protect the revoke table.
         */
        spinlock_t              j_revoke_lock;
+
+       /**
+        * @j_revoke:
+        *
+        * The revoke table - maintains the list of revoked blocks in the
+        * current transaction.
+        */
        struct jbd2_revoke_table_s *j_revoke;
+
+       /**
+        * @j_revoke_table: Alternate revoke tables for j_revoke.
+        */
        struct jbd2_revoke_table_s *j_revoke_table[2];
 
-       /*
-        * array of bhs for jbd2_journal_commit_transaction
+       /**
+        * @j_wbuf: Array of bhs for jbd2_journal_commit_transaction.
         */
        struct buffer_head      **j_wbuf;
+
+       /**
+        * @j_wbufsize:
+        *
+        * Size of @j_wbuf array.
+        */
        int                     j_wbufsize;
 
-       /*
-        * this is the pid of hte last person to run a synchronous operation
-        * through the journal
+       /**
+        * @j_last_sync_writer:
+        *
+        * The pid of the last person to run a synchronous operation
+        * through the journal.
         */
        pid_t                   j_last_sync_writer;
 
-       /*
-        * the average amount of time in nanoseconds it takes to commit a
+       /**
+        * @j_average_commit_time:
+        *
+        * The average amount of time in nanoseconds it takes to commit a
         * transaction to disk. [j_state_lock]
         */
        u64                     j_average_commit_time;
 
-       /*
-        * minimum and maximum times that we should wait for
-        * additional filesystem operations to get batched into a
-        * synchronous handle in microseconds
+       /**
+        * @j_min_batch_time:
+        *
+        * Minimum time that we should wait for additional filesystem operations
+        * to get batched into a synchronous handle in microseconds.
         */
        u32                     j_min_batch_time;
+
+       /**
+        * @j_max_batch_time:
+        *
+        * Maximum time that we should wait for additional filesystem operations
+        * to get batched into a synchronous handle in microseconds.
+        */
        u32                     j_max_batch_time;
 
-       /* This function is called when a transaction is closed */
+       /**
+        * @j_commit_callback:
+        *
+        * This function is called when a transaction is closed.
+        */
        void                    (*j_commit_callback)(journal_t *,
                                                     transaction_t *);
 
        /*
         * Journal statistics
         */
+
+       /**
+        * @j_history_lock: Protect the transactions statistics history.
+        */
        spinlock_t              j_history_lock;
+
+       /**
+        * @j_proc_entry: procfs entry for the jbd statistics directory.
+        */
        struct proc_dir_entry   *j_proc_entry;
+
+       /**
+        * @j_stats: Overall statistics.
+        */
        struct transaction_stats_s j_stats;
 
-       /* Failed journal commit ID */
+       /**
+        * @j_failed_commit: Failed journal commit ID.
+        */
        unsigned int            j_failed_commit;
 
-       /*
+       /**
+        * @j_private:
+        *
         * An opaque pointer to fs-private information.  ext3 puts its
-        * superblock pointer here
+        * superblock pointer here.
         */
        void *j_private;
 
-       /* Reference to checksum algorithm driver via cryptoapi */
+       /**
+        * @j_chksum_driver:
+        *
+        * Reference to checksum algorithm driver via cryptoapi.
+        */
        struct crypto_shash *j_chksum_driver;
 
-       /* Precomputed journal UUID checksum for seeding other checksums */
+       /**
+        * @j_csum_seed:
+        *
+        * Precomputed journal UUID checksum for seeding other checksums.
+        */
        __u32 j_csum_seed;
 
 #ifdef CONFIG_DEBUG_LOCK_ALLOC
-       /*
+       /**
+        * @j_trans_commit_map:
+        *
         * Lockdep entity to track transaction commit dependencies. Handles
         * hold this "lock" for read, when we wait for commit, we acquire the
         * "lock" for writing. This matches the properties of jbd2 journalling