forked from Minki/linux
Only miscellaneous cleanups and bug fixes for ext4 this cycle.
-----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEK2m5VNv+CHkogTfJ8vlZVpUNgaMFAlp16xMACgkQ8vlZVpUN gaP1IAf8C48AKVnqy6ftFphzV1CdeGHDwJLL63lChs97fNr1mxo5TZE/6vdYB55j k7C7huQ582cEiGWQJ0U4/+En0hF85zkAk5mTfnSao5BqxLr9ANsAocwBUNBXdFSp B7IyMo4Dct7NCkwfmKLPRcEqZ49vwyv99TqM/9wUkgUStkTjPT7bhHgarB6VPbhp BxoXVnFYgU0sZN0y71IBt8ngWqCK6j7fjw3gsl37oEenG3/h3SO0H9ih1FrysX8S VOwwLJq6vfAgEwQvZACnBwWKDYsZpH7akNp9WGeDMByo28t514RNRjIi0mvLHEZa h72I8Sb3bwHO9MJNvHFe/0b1Say4vw== =dxAX -----END PGP SIGNATURE----- Merge tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4 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
This commit is contained in:
commit
23aedc4b9b
@ -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.
|
||||
|
9
fs/dax.c
9
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:
|
||||
|
@ -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)
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
File: fs/ext4/acl.h
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
*/
|
||||
|
||||
|
@ -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-
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* fs/ext4/extents_status.h
|
||||
*
|
||||
|
@ -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);
|
||||
|
@ -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>
|
||||
|
@ -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__
|
||||
|
@ -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>
|
||||
|
@ -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);
|
||||
|
@ -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>
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* fs/ext4/mballoc.h
|
||||
*
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
if (ret)
|
||||
return ret;
|
||||
ext4_kset = kzalloc(sizeof(*ext4_kset), GFP_KERNEL);
|
||||
if (!ext4_kset)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = kobject_init_and_add(&ext4_feat, &ext4_feat_ktype,
|
||||
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)
|
||||
goto kset_err;
|
||||
|
||||
ext4_feat = kzalloc(sizeof(*ext4_feat), GFP_KERNEL);
|
||||
if (!ext4_feat) {
|
||||
ret = -ENOMEM;
|
||||
goto kset_err;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* linux/fs/ext4/truncate.h
|
||||
*
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
File: fs/ext4/xattr.h
|
||||
|
||||
|
@ -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.
|
||||
*
|
||||
|
@ -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.
|
||||
*/
|
||||
|
@ -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.
|
||||
*
|
||||
|
@ -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.
|
||||
*/
|
||||
|
@ -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.
|
||||
*
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user