You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4
Pull ext4 updates from Ted Ts'o: "Major changes for 3.14 include support for the newly added ZERO_RANGE and COLLAPSE_RANGE fallocate operations, and scalability improvements in the jbd2 layer and in xattr handling when the extended attributes spill over into an external block. Other than that, the usual clean ups and minor bug fixes" * tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4: (42 commits) ext4: fix premature freeing of partial clusters split across leaf blocks ext4: remove unneeded test of ret variable ext4: fix comment typo ext4: make ext4_block_zero_page_range static ext4: atomically set inode->i_flags in ext4_set_inode_flags() ext4: optimize Hurd tests when reading/writing inodes ext4: kill i_version support for Hurd-castrated file systems ext4: each filesystem creates and uses its own mb_cache fs/mbcache.c: doucple the locking of local from global data fs/mbcache.c: change block and index hash chain to hlist_bl_node ext4: Introduce FALLOC_FL_ZERO_RANGE flag for fallocate ext4: refactor ext4_fallocate code ext4: Update inode i_size after the preallocation ext4: fix partial cluster handling for bigalloc file systems ext4: delete path dealloc code in ext4_ext_handle_uninitialized_extents ext4: only call sync_filesystm() when remounting read-only fs: push sync_filesystem() down to the file system's remount_fs() jbd2: improve error messages for inconsistent journal heads jbd2: minimize region locked by j_list_lock in jbd2_journal_forget() jbd2: minimize region locked by j_list_lock in journal_get_create_access() ...
This commit is contained in:
@@ -212,6 +212,7 @@ static int parse_options(struct super_block *sb, char *options)
|
|||||||
|
|
||||||
static int adfs_remount(struct super_block *sb, int *flags, char *data)
|
static int adfs_remount(struct super_block *sb, int *flags, char *data)
|
||||||
{
|
{
|
||||||
|
sync_filesystem(sb);
|
||||||
*flags |= MS_NODIRATIME;
|
*flags |= MS_NODIRATIME;
|
||||||
return parse_options(sb, data);
|
return parse_options(sb, data);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -530,6 +530,7 @@ affs_remount(struct super_block *sb, int *flags, char *data)
|
|||||||
|
|
||||||
pr_debug("AFFS: remount(flags=0x%x,opts=\"%s\")\n",*flags,data);
|
pr_debug("AFFS: remount(flags=0x%x,opts=\"%s\")\n",*flags,data);
|
||||||
|
|
||||||
|
sync_filesystem(sb);
|
||||||
*flags |= MS_NODIRATIME;
|
*flags |= MS_NODIRATIME;
|
||||||
|
|
||||||
memcpy(volume, sbi->s_volume, 32);
|
memcpy(volume, sbi->s_volume, 32);
|
||||||
|
|||||||
@@ -913,6 +913,7 @@ befs_fill_super(struct super_block *sb, void *data, int silent)
|
|||||||
static int
|
static int
|
||||||
befs_remount(struct super_block *sb, int *flags, char *data)
|
befs_remount(struct super_block *sb, int *flags, char *data)
|
||||||
{
|
{
|
||||||
|
sync_filesystem(sb);
|
||||||
if (!(*flags & MS_RDONLY))
|
if (!(*flags & MS_RDONLY))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -1380,6 +1380,7 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data)
|
|||||||
unsigned int old_metadata_ratio = fs_info->metadata_ratio;
|
unsigned int old_metadata_ratio = fs_info->metadata_ratio;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
sync_filesystem(sb);
|
||||||
btrfs_remount_prepare(fs_info);
|
btrfs_remount_prepare(fs_info);
|
||||||
|
|
||||||
ret = btrfs_parse_options(root, data);
|
ret = btrfs_parse_options(root, data);
|
||||||
|
|||||||
@@ -541,6 +541,7 @@ static int cifs_show_stats(struct seq_file *s, struct dentry *root)
|
|||||||
|
|
||||||
static int cifs_remount(struct super_block *sb, int *flags, char *data)
|
static int cifs_remount(struct super_block *sb, int *flags, char *data)
|
||||||
{
|
{
|
||||||
|
sync_filesystem(sb);
|
||||||
*flags |= MS_NODIRATIME;
|
*flags |= MS_NODIRATIME;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ void coda_destroy_inodecache(void)
|
|||||||
|
|
||||||
static int coda_remount(struct super_block *sb, int *flags, char *data)
|
static int coda_remount(struct super_block *sb, int *flags, char *data)
|
||||||
{
|
{
|
||||||
|
sync_filesystem(sb);
|
||||||
*flags |= MS_NOATIME;
|
*flags |= MS_NOATIME;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -243,6 +243,7 @@ static void cramfs_kill_sb(struct super_block *sb)
|
|||||||
|
|
||||||
static int cramfs_remount(struct super_block *sb, int *flags, char *data)
|
static int cramfs_remount(struct super_block *sb, int *flags, char *data)
|
||||||
{
|
{
|
||||||
|
sync_filesystem(sb);
|
||||||
*flags |= MS_RDONLY;
|
*flags |= MS_RDONLY;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -218,6 +218,7 @@ static int debugfs_remount(struct super_block *sb, int *flags, char *data)
|
|||||||
int err;
|
int err;
|
||||||
struct debugfs_fs_info *fsi = sb->s_fs_info;
|
struct debugfs_fs_info *fsi = sb->s_fs_info;
|
||||||
|
|
||||||
|
sync_filesystem(sb);
|
||||||
err = debugfs_parse_options(data, &fsi->mount_opts);
|
err = debugfs_parse_options(data, &fsi->mount_opts);
|
||||||
if (err)
|
if (err)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|||||||
@@ -313,6 +313,7 @@ static int devpts_remount(struct super_block *sb, int *flags, char *data)
|
|||||||
struct pts_fs_info *fsi = DEVPTS_SB(sb);
|
struct pts_fs_info *fsi = DEVPTS_SB(sb);
|
||||||
struct pts_mount_opts *opts = &fsi->mount_opts;
|
struct pts_mount_opts *opts = &fsi->mount_opts;
|
||||||
|
|
||||||
|
sync_filesystem(sb);
|
||||||
err = parse_mount_options(data, PARSE_REMOUNT, opts);
|
err = parse_mount_options(data, PARSE_REMOUNT, opts);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -114,6 +114,7 @@ static void destroy_inodecache(void)
|
|||||||
|
|
||||||
static int efs_remount(struct super_block *sb, int *flags, char *data)
|
static int efs_remount(struct super_block *sb, int *flags, char *data)
|
||||||
{
|
{
|
||||||
|
sync_filesystem(sb);
|
||||||
*flags |= MS_RDONLY;
|
*flags |= MS_RDONLY;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1254,6 +1254,7 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data)
|
|||||||
unsigned long old_sb_flags;
|
unsigned long old_sb_flags;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
sync_filesystem(sb);
|
||||||
spin_lock(&sbi->s_lock);
|
spin_lock(&sbi->s_lock);
|
||||||
|
|
||||||
/* Store the old options */
|
/* Store the old options */
|
||||||
|
|||||||
@@ -2649,6 +2649,8 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data)
|
|||||||
int i;
|
int i;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
sync_filesystem(sb);
|
||||||
|
|
||||||
/* Store the original options */
|
/* Store the original options */
|
||||||
old_sb_flags = sb->s_flags;
|
old_sb_flags = sb->s_flags;
|
||||||
old_opts.s_mount_opt = sbi->s_mount_opt;
|
old_opts.s_mount_opt = sbi->s_mount_opt;
|
||||||
|
|||||||
+9
-2
@@ -31,6 +31,7 @@
|
|||||||
#include <linux/percpu_counter.h>
|
#include <linux/percpu_counter.h>
|
||||||
#include <linux/ratelimit.h>
|
#include <linux/ratelimit.h>
|
||||||
#include <crypto/hash.h>
|
#include <crypto/hash.h>
|
||||||
|
#include <linux/falloc.h>
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
#include <linux/compat.h>
|
#include <linux/compat.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -567,6 +568,8 @@ enum {
|
|||||||
#define EXT4_GET_BLOCKS_NO_LOCK 0x0100
|
#define EXT4_GET_BLOCKS_NO_LOCK 0x0100
|
||||||
/* Do not put hole in extent cache */
|
/* Do not put hole in extent cache */
|
||||||
#define EXT4_GET_BLOCKS_NO_PUT_HOLE 0x0200
|
#define EXT4_GET_BLOCKS_NO_PUT_HOLE 0x0200
|
||||||
|
/* Convert written extents to unwritten */
|
||||||
|
#define EXT4_GET_BLOCKS_CONVERT_UNWRITTEN 0x0400
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The bit position of these flags must not overlap with any of the
|
* The bit position of these flags must not overlap with any of the
|
||||||
@@ -998,6 +1001,8 @@ struct ext4_inode_info {
|
|||||||
#define EXT4_MOUNT2_STD_GROUP_SIZE 0x00000002 /* We have standard group
|
#define EXT4_MOUNT2_STD_GROUP_SIZE 0x00000002 /* We have standard group
|
||||||
size of blocksize * 8
|
size of blocksize * 8
|
||||||
blocks */
|
blocks */
|
||||||
|
#define EXT4_MOUNT2_HURD_COMPAT 0x00000004 /* Support HURD-castrated
|
||||||
|
file systems */
|
||||||
|
|
||||||
#define clear_opt(sb, opt) EXT4_SB(sb)->s_mount_opt &= \
|
#define clear_opt(sb, opt) EXT4_SB(sb)->s_mount_opt &= \
|
||||||
~EXT4_MOUNT_##opt
|
~EXT4_MOUNT_##opt
|
||||||
@@ -1326,6 +1331,7 @@ struct ext4_sb_info {
|
|||||||
struct list_head s_es_lru;
|
struct list_head s_es_lru;
|
||||||
unsigned long s_es_last_sorted;
|
unsigned long s_es_last_sorted;
|
||||||
struct percpu_counter s_extent_cache_cnt;
|
struct percpu_counter s_extent_cache_cnt;
|
||||||
|
struct mb_cache *s_mb_cache;
|
||||||
spinlock_t s_es_lru_lock ____cacheline_aligned_in_smp;
|
spinlock_t s_es_lru_lock ____cacheline_aligned_in_smp;
|
||||||
|
|
||||||
/* Ratelimit ext4 messages. */
|
/* Ratelimit ext4 messages. */
|
||||||
@@ -2133,8 +2139,6 @@ extern int ext4_writepage_trans_blocks(struct inode *);
|
|||||||
extern int ext4_chunk_trans_blocks(struct inode *, int nrblocks);
|
extern int ext4_chunk_trans_blocks(struct inode *, int nrblocks);
|
||||||
extern int ext4_block_truncate_page(handle_t *handle,
|
extern int ext4_block_truncate_page(handle_t *handle,
|
||||||
struct address_space *mapping, loff_t from);
|
struct address_space *mapping, loff_t from);
|
||||||
extern int ext4_block_zero_page_range(handle_t *handle,
|
|
||||||
struct address_space *mapping, loff_t from, loff_t length);
|
|
||||||
extern int ext4_zero_partial_blocks(handle_t *handle, struct inode *inode,
|
extern int ext4_zero_partial_blocks(handle_t *handle, struct inode *inode,
|
||||||
loff_t lstart, loff_t lend);
|
loff_t lstart, loff_t lend);
|
||||||
extern int ext4_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf);
|
extern int ext4_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf);
|
||||||
@@ -2757,6 +2761,7 @@ extern int ext4_find_delalloc_cluster(struct inode *inode, ext4_lblk_t lblk);
|
|||||||
extern int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
extern int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
||||||
__u64 start, __u64 len);
|
__u64 start, __u64 len);
|
||||||
extern int ext4_ext_precache(struct inode *inode);
|
extern int ext4_ext_precache(struct inode *inode);
|
||||||
|
extern int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len);
|
||||||
|
|
||||||
/* move_extent.c */
|
/* move_extent.c */
|
||||||
extern void ext4_double_down_write_data_sem(struct inode *first,
|
extern void ext4_double_down_write_data_sem(struct inode *first,
|
||||||
@@ -2766,6 +2771,8 @@ extern void ext4_double_up_write_data_sem(struct inode *orig_inode,
|
|||||||
extern int ext4_move_extents(struct file *o_filp, struct file *d_filp,
|
extern int ext4_move_extents(struct file *o_filp, struct file *d_filp,
|
||||||
__u64 start_orig, __u64 start_donor,
|
__u64 start_orig, __u64 start_donor,
|
||||||
__u64 len, __u64 *moved_len);
|
__u64 len, __u64 *moved_len);
|
||||||
|
extern int mext_next_extent(struct inode *inode, struct ext4_ext_path *path,
|
||||||
|
struct ext4_extent **extent);
|
||||||
|
|
||||||
/* page-io.c */
|
/* page-io.c */
|
||||||
extern int __init ext4_init_pageio(void);
|
extern int __init ext4_init_pageio(void);
|
||||||
|
|||||||
@@ -259,6 +259,16 @@ int __ext4_handle_dirty_metadata(const char *where, unsigned int line,
|
|||||||
if (WARN_ON_ONCE(err)) {
|
if (WARN_ON_ONCE(err)) {
|
||||||
ext4_journal_abort_handle(where, line, __func__, bh,
|
ext4_journal_abort_handle(where, line, __func__, bh,
|
||||||
handle, err);
|
handle, err);
|
||||||
|
if (inode == NULL) {
|
||||||
|
pr_err("EXT4: jbd2_journal_dirty_metadata "
|
||||||
|
"failed: handle type %u started at "
|
||||||
|
"line %u, credits %u/%u, errcode %d",
|
||||||
|
handle->h_type,
|
||||||
|
handle->h_line_no,
|
||||||
|
handle->h_requested_credits,
|
||||||
|
handle->h_buffer_credits, err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
ext4_error_inode(inode, where, line,
|
ext4_error_inode(inode, where, line,
|
||||||
bh->b_blocknr,
|
bh->b_blocknr,
|
||||||
"journal_dirty_metadata failed: "
|
"journal_dirty_metadata failed: "
|
||||||
|
|||||||
+707
-113
File diff suppressed because it is too large
Load Diff
+13
-15
@@ -184,7 +184,7 @@ static void ext4_es_print_tree(struct inode *inode)
|
|||||||
while (node) {
|
while (node) {
|
||||||
struct extent_status *es;
|
struct extent_status *es;
|
||||||
es = rb_entry(node, struct extent_status, rb_node);
|
es = rb_entry(node, struct extent_status, rb_node);
|
||||||
printk(KERN_DEBUG " [%u/%u) %llu %llx",
|
printk(KERN_DEBUG " [%u/%u) %llu %x",
|
||||||
es->es_lblk, es->es_len,
|
es->es_lblk, es->es_len,
|
||||||
ext4_es_pblock(es), ext4_es_status(es));
|
ext4_es_pblock(es), ext4_es_status(es));
|
||||||
node = rb_next(node);
|
node = rb_next(node);
|
||||||
@@ -445,8 +445,8 @@ static void ext4_es_insert_extent_ext_check(struct inode *inode,
|
|||||||
pr_warn("ES insert assertion failed for "
|
pr_warn("ES insert assertion failed for "
|
||||||
"inode: %lu we can find an extent "
|
"inode: %lu we can find an extent "
|
||||||
"at block [%d/%d/%llu/%c], but we "
|
"at block [%d/%d/%llu/%c], but we "
|
||||||
"want to add an delayed/hole extent "
|
"want to add a delayed/hole extent "
|
||||||
"[%d/%d/%llu/%llx]\n",
|
"[%d/%d/%llu/%x]\n",
|
||||||
inode->i_ino, ee_block, ee_len,
|
inode->i_ino, ee_block, ee_len,
|
||||||
ee_start, ee_status ? 'u' : 'w',
|
ee_start, ee_status ? 'u' : 'w',
|
||||||
es->es_lblk, es->es_len,
|
es->es_lblk, es->es_len,
|
||||||
@@ -486,8 +486,8 @@ static void ext4_es_insert_extent_ext_check(struct inode *inode,
|
|||||||
if (!ext4_es_is_delayed(es) && !ext4_es_is_hole(es)) {
|
if (!ext4_es_is_delayed(es) && !ext4_es_is_hole(es)) {
|
||||||
pr_warn("ES insert assertion failed for inode: %lu "
|
pr_warn("ES insert assertion failed for inode: %lu "
|
||||||
"can't find an extent at block %d but we want "
|
"can't find an extent at block %d but we want "
|
||||||
"to add an written/unwritten extent "
|
"to add a written/unwritten extent "
|
||||||
"[%d/%d/%llu/%llx]\n", inode->i_ino,
|
"[%d/%d/%llu/%x]\n", inode->i_ino,
|
||||||
es->es_lblk, es->es_lblk, es->es_len,
|
es->es_lblk, es->es_lblk, es->es_len,
|
||||||
ext4_es_pblock(es), ext4_es_status(es));
|
ext4_es_pblock(es), ext4_es_status(es));
|
||||||
}
|
}
|
||||||
@@ -524,7 +524,7 @@ static void ext4_es_insert_extent_ind_check(struct inode *inode,
|
|||||||
*/
|
*/
|
||||||
pr_warn("ES insert assertion failed for inode: %lu "
|
pr_warn("ES insert assertion failed for inode: %lu "
|
||||||
"We can find blocks but we want to add a "
|
"We can find blocks but we want to add a "
|
||||||
"delayed/hole extent [%d/%d/%llu/%llx]\n",
|
"delayed/hole extent [%d/%d/%llu/%x]\n",
|
||||||
inode->i_ino, es->es_lblk, es->es_len,
|
inode->i_ino, es->es_lblk, es->es_len,
|
||||||
ext4_es_pblock(es), ext4_es_status(es));
|
ext4_es_pblock(es), ext4_es_status(es));
|
||||||
return;
|
return;
|
||||||
@@ -554,7 +554,7 @@ static void ext4_es_insert_extent_ind_check(struct inode *inode,
|
|||||||
if (ext4_es_is_written(es)) {
|
if (ext4_es_is_written(es)) {
|
||||||
pr_warn("ES insert assertion failed for inode: %lu "
|
pr_warn("ES insert assertion failed for inode: %lu "
|
||||||
"We can't find the block but we want to add "
|
"We can't find the block but we want to add "
|
||||||
"an written extent [%d/%d/%llu/%llx]\n",
|
"a written extent [%d/%d/%llu/%x]\n",
|
||||||
inode->i_ino, es->es_lblk, es->es_len,
|
inode->i_ino, es->es_lblk, es->es_len,
|
||||||
ext4_es_pblock(es), ext4_es_status(es));
|
ext4_es_pblock(es), ext4_es_status(es));
|
||||||
return;
|
return;
|
||||||
@@ -658,8 +658,7 @@ int ext4_es_insert_extent(struct inode *inode, ext4_lblk_t lblk,
|
|||||||
|
|
||||||
newes.es_lblk = lblk;
|
newes.es_lblk = lblk;
|
||||||
newes.es_len = len;
|
newes.es_len = len;
|
||||||
ext4_es_store_pblock(&newes, pblk);
|
ext4_es_store_pblock_status(&newes, pblk, status);
|
||||||
ext4_es_store_status(&newes, status);
|
|
||||||
trace_ext4_es_insert_extent(inode, &newes);
|
trace_ext4_es_insert_extent(inode, &newes);
|
||||||
|
|
||||||
ext4_es_insert_extent_check(inode, &newes);
|
ext4_es_insert_extent_check(inode, &newes);
|
||||||
@@ -699,8 +698,7 @@ void ext4_es_cache_extent(struct inode *inode, ext4_lblk_t lblk,
|
|||||||
|
|
||||||
newes.es_lblk = lblk;
|
newes.es_lblk = lblk;
|
||||||
newes.es_len = len;
|
newes.es_len = len;
|
||||||
ext4_es_store_pblock(&newes, pblk);
|
ext4_es_store_pblock_status(&newes, pblk, status);
|
||||||
ext4_es_store_status(&newes, status);
|
|
||||||
trace_ext4_es_cache_extent(inode, &newes);
|
trace_ext4_es_cache_extent(inode, &newes);
|
||||||
|
|
||||||
if (!len)
|
if (!len)
|
||||||
@@ -812,13 +810,13 @@ retry:
|
|||||||
|
|
||||||
newes.es_lblk = end + 1;
|
newes.es_lblk = end + 1;
|
||||||
newes.es_len = len2;
|
newes.es_len = len2;
|
||||||
|
block = 0x7FDEADBEEF;
|
||||||
if (ext4_es_is_written(&orig_es) ||
|
if (ext4_es_is_written(&orig_es) ||
|
||||||
ext4_es_is_unwritten(&orig_es)) {
|
ext4_es_is_unwritten(&orig_es))
|
||||||
block = ext4_es_pblock(&orig_es) +
|
block = ext4_es_pblock(&orig_es) +
|
||||||
orig_es.es_len - len2;
|
orig_es.es_len - len2;
|
||||||
ext4_es_store_pblock(&newes, block);
|
ext4_es_store_pblock_status(&newes, block,
|
||||||
}
|
ext4_es_status(&orig_es));
|
||||||
ext4_es_store_status(&newes, ext4_es_status(&orig_es));
|
|
||||||
err = __es_insert_extent(inode, &newes);
|
err = __es_insert_extent(inode, &newes);
|
||||||
if (err) {
|
if (err) {
|
||||||
es->es_lblk = orig_es.es_lblk;
|
es->es_lblk = orig_es.es_lblk;
|
||||||
|
|||||||
@@ -129,6 +129,15 @@ static inline void ext4_es_store_status(struct extent_status *es,
|
|||||||
(es->es_pblk & ~ES_MASK));
|
(es->es_pblk & ~ES_MASK));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void ext4_es_store_pblock_status(struct extent_status *es,
|
||||||
|
ext4_fsblk_t pb,
|
||||||
|
unsigned int status)
|
||||||
|
{
|
||||||
|
es->es_pblk = (((ext4_fsblk_t)
|
||||||
|
(status & EXTENT_STATUS_FLAGS) << ES_SHIFT) |
|
||||||
|
(pb & ~ES_MASK));
|
||||||
|
}
|
||||||
|
|
||||||
extern void ext4_es_register_shrinker(struct ext4_sb_info *sbi);
|
extern void ext4_es_register_shrinker(struct ext4_sb_info *sbi);
|
||||||
extern void ext4_es_unregister_shrinker(struct ext4_sb_info *sbi);
|
extern void ext4_es_unregister_shrinker(struct ext4_sb_info *sbi);
|
||||||
extern void ext4_es_lru_add(struct inode *inode);
|
extern void ext4_es_lru_add(struct inode *inode);
|
||||||
|
|||||||
+75
-45
@@ -504,6 +504,7 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode,
|
|||||||
{
|
{
|
||||||
struct extent_status es;
|
struct extent_status es;
|
||||||
int retval;
|
int retval;
|
||||||
|
int ret = 0;
|
||||||
#ifdef ES_AGGRESSIVE_TEST
|
#ifdef ES_AGGRESSIVE_TEST
|
||||||
struct ext4_map_blocks orig_map;
|
struct ext4_map_blocks orig_map;
|
||||||
|
|
||||||
@@ -515,6 +516,12 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode,
|
|||||||
"logical block %lu\n", inode->i_ino, flags, map->m_len,
|
"logical block %lu\n", inode->i_ino, flags, map->m_len,
|
||||||
(unsigned long) map->m_lblk);
|
(unsigned long) map->m_lblk);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ext4_map_blocks returns an int, and m_len is an unsigned int
|
||||||
|
*/
|
||||||
|
if (unlikely(map->m_len > INT_MAX))
|
||||||
|
map->m_len = INT_MAX;
|
||||||
|
|
||||||
/* Lookup extent status tree firstly */
|
/* Lookup extent status tree firstly */
|
||||||
if (ext4_es_lookup_extent(inode, map->m_lblk, &es)) {
|
if (ext4_es_lookup_extent(inode, map->m_lblk, &es)) {
|
||||||
ext4_es_lru_add(inode);
|
ext4_es_lru_add(inode);
|
||||||
@@ -553,7 +560,6 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode,
|
|||||||
EXT4_GET_BLOCKS_KEEP_SIZE);
|
EXT4_GET_BLOCKS_KEEP_SIZE);
|
||||||
}
|
}
|
||||||
if (retval > 0) {
|
if (retval > 0) {
|
||||||
int ret;
|
|
||||||
unsigned int status;
|
unsigned int status;
|
||||||
|
|
||||||
if (unlikely(retval != map->m_len)) {
|
if (unlikely(retval != map->m_len)) {
|
||||||
@@ -580,7 +586,7 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode,
|
|||||||
|
|
||||||
found:
|
found:
|
||||||
if (retval > 0 && map->m_flags & EXT4_MAP_MAPPED) {
|
if (retval > 0 && map->m_flags & EXT4_MAP_MAPPED) {
|
||||||
int ret = check_block_validity(inode, map);
|
ret = check_block_validity(inode, map);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -597,7 +603,13 @@ found:
|
|||||||
* with buffer head unmapped.
|
* with buffer head unmapped.
|
||||||
*/
|
*/
|
||||||
if (retval > 0 && map->m_flags & EXT4_MAP_MAPPED)
|
if (retval > 0 && map->m_flags & EXT4_MAP_MAPPED)
|
||||||
return retval;
|
/*
|
||||||
|
* If we need to convert extent to unwritten
|
||||||
|
* we continue and do the actual work in
|
||||||
|
* ext4_ext_map_blocks()
|
||||||
|
*/
|
||||||
|
if (!(flags & EXT4_GET_BLOCKS_CONVERT_UNWRITTEN))
|
||||||
|
return retval;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Here we clear m_flags because after allocating an new extent,
|
* Here we clear m_flags because after allocating an new extent,
|
||||||
@@ -653,7 +665,6 @@ found:
|
|||||||
ext4_clear_inode_state(inode, EXT4_STATE_DELALLOC_RESERVED);
|
ext4_clear_inode_state(inode, EXT4_STATE_DELALLOC_RESERVED);
|
||||||
|
|
||||||
if (retval > 0) {
|
if (retval > 0) {
|
||||||
int ret;
|
|
||||||
unsigned int status;
|
unsigned int status;
|
||||||
|
|
||||||
if (unlikely(retval != map->m_len)) {
|
if (unlikely(retval != map->m_len)) {
|
||||||
@@ -688,7 +699,7 @@ found:
|
|||||||
has_zeroout:
|
has_zeroout:
|
||||||
up_write((&EXT4_I(inode)->i_data_sem));
|
up_write((&EXT4_I(inode)->i_data_sem));
|
||||||
if (retval > 0 && map->m_flags & EXT4_MAP_MAPPED) {
|
if (retval > 0 && map->m_flags & EXT4_MAP_MAPPED) {
|
||||||
int ret = check_block_validity(inode, map);
|
ret = check_block_validity(inode, map);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -3312,26 +3323,6 @@ void ext4_set_aops(struct inode *inode)
|
|||||||
inode->i_mapping->a_ops = &ext4_aops;
|
inode->i_mapping->a_ops = &ext4_aops;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* ext4_block_truncate_page() zeroes out a mapping from file offset `from'
|
|
||||||
* up to the end of the block which corresponds to `from'.
|
|
||||||
* This required during truncate. We need to physically zero the tail end
|
|
||||||
* of that block so it doesn't yield old data if the file is later grown.
|
|
||||||
*/
|
|
||||||
int ext4_block_truncate_page(handle_t *handle,
|
|
||||||
struct address_space *mapping, loff_t from)
|
|
||||||
{
|
|
||||||
unsigned offset = from & (PAGE_CACHE_SIZE-1);
|
|
||||||
unsigned length;
|
|
||||||
unsigned blocksize;
|
|
||||||
struct inode *inode = mapping->host;
|
|
||||||
|
|
||||||
blocksize = inode->i_sb->s_blocksize;
|
|
||||||
length = blocksize - (offset & (blocksize - 1));
|
|
||||||
|
|
||||||
return ext4_block_zero_page_range(handle, mapping, from, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ext4_block_zero_page_range() zeros out a mapping of length 'length'
|
* ext4_block_zero_page_range() zeros out a mapping of length 'length'
|
||||||
* starting from file offset 'from'. The range to be zero'd must
|
* starting from file offset 'from'. The range to be zero'd must
|
||||||
@@ -3339,7 +3330,7 @@ int ext4_block_truncate_page(handle_t *handle,
|
|||||||
* the end of the block it will be shortened to end of the block
|
* the end of the block it will be shortened to end of the block
|
||||||
* that cooresponds to 'from'
|
* that cooresponds to 'from'
|
||||||
*/
|
*/
|
||||||
int ext4_block_zero_page_range(handle_t *handle,
|
static int ext4_block_zero_page_range(handle_t *handle,
|
||||||
struct address_space *mapping, loff_t from, loff_t length)
|
struct address_space *mapping, loff_t from, loff_t length)
|
||||||
{
|
{
|
||||||
ext4_fsblk_t index = from >> PAGE_CACHE_SHIFT;
|
ext4_fsblk_t index = from >> PAGE_CACHE_SHIFT;
|
||||||
@@ -3429,6 +3420,26 @@ unlock:
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ext4_block_truncate_page() zeroes out a mapping from file offset `from'
|
||||||
|
* up to the end of the block which corresponds to `from'.
|
||||||
|
* This required during truncate. We need to physically zero the tail end
|
||||||
|
* of that block so it doesn't yield old data if the file is later grown.
|
||||||
|
*/
|
||||||
|
int ext4_block_truncate_page(handle_t *handle,
|
||||||
|
struct address_space *mapping, loff_t from)
|
||||||
|
{
|
||||||
|
unsigned offset = from & (PAGE_CACHE_SIZE-1);
|
||||||
|
unsigned length;
|
||||||
|
unsigned blocksize;
|
||||||
|
struct inode *inode = mapping->host;
|
||||||
|
|
||||||
|
blocksize = inode->i_sb->s_blocksize;
|
||||||
|
length = blocksize - (offset & (blocksize - 1));
|
||||||
|
|
||||||
|
return ext4_block_zero_page_range(handle, mapping, from, length);
|
||||||
|
}
|
||||||
|
|
||||||
int ext4_zero_partial_blocks(handle_t *handle, struct inode *inode,
|
int ext4_zero_partial_blocks(handle_t *handle, struct inode *inode,
|
||||||
loff_t lstart, loff_t length)
|
loff_t lstart, loff_t length)
|
||||||
{
|
{
|
||||||
@@ -3502,7 +3513,7 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length)
|
|||||||
if (!S_ISREG(inode->i_mode))
|
if (!S_ISREG(inode->i_mode))
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
trace_ext4_punch_hole(inode, offset, length);
|
trace_ext4_punch_hole(inode, offset, length, 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Write out all dirty pages to avoid race conditions
|
* Write out all dirty pages to avoid race conditions
|
||||||
@@ -3609,6 +3620,12 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length)
|
|||||||
up_write(&EXT4_I(inode)->i_data_sem);
|
up_write(&EXT4_I(inode)->i_data_sem);
|
||||||
if (IS_SYNC(inode))
|
if (IS_SYNC(inode))
|
||||||
ext4_handle_sync(handle);
|
ext4_handle_sync(handle);
|
||||||
|
|
||||||
|
/* Now release the pages again to reduce race window */
|
||||||
|
if (last_block_offset > first_block_offset)
|
||||||
|
truncate_pagecache_range(inode, first_block_offset,
|
||||||
|
last_block_offset);
|
||||||
|
|
||||||
inode->i_mtime = inode->i_ctime = ext4_current_time(inode);
|
inode->i_mtime = inode->i_ctime = ext4_current_time(inode);
|
||||||
ext4_mark_inode_dirty(handle, inode);
|
ext4_mark_inode_dirty(handle, inode);
|
||||||
out_stop:
|
out_stop:
|
||||||
@@ -3682,7 +3699,7 @@ void ext4_truncate(struct inode *inode)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* There is a possibility that we're either freeing the inode
|
* There is a possibility that we're either freeing the inode
|
||||||
* or it completely new indode. In those cases we might not
|
* or it's a completely new inode. In those cases we might not
|
||||||
* have i_mutex locked because it's not necessary.
|
* have i_mutex locked because it's not necessary.
|
||||||
*/
|
*/
|
||||||
if (!(inode->i_state & (I_NEW|I_FREEING)))
|
if (!(inode->i_state & (I_NEW|I_FREEING)))
|
||||||
@@ -3934,8 +3951,8 @@ void ext4_set_inode_flags(struct inode *inode)
|
|||||||
new_fl |= S_NOATIME;
|
new_fl |= S_NOATIME;
|
||||||
if (flags & EXT4_DIRSYNC_FL)
|
if (flags & EXT4_DIRSYNC_FL)
|
||||||
new_fl |= S_DIRSYNC;
|
new_fl |= S_DIRSYNC;
|
||||||
set_mask_bits(&inode->i_flags,
|
inode_set_flags(inode, new_fl,
|
||||||
S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC, new_fl);
|
S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Propagate flags from i_flags to EXT4_I(inode)->i_flags */
|
/* Propagate flags from i_flags to EXT4_I(inode)->i_flags */
|
||||||
@@ -4154,11 +4171,13 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino)
|
|||||||
EXT4_INODE_GET_XTIME(i_atime, inode, raw_inode);
|
EXT4_INODE_GET_XTIME(i_atime, inode, raw_inode);
|
||||||
EXT4_EINODE_GET_XTIME(i_crtime, ei, raw_inode);
|
EXT4_EINODE_GET_XTIME(i_crtime, ei, raw_inode);
|
||||||
|
|
||||||
inode->i_version = le32_to_cpu(raw_inode->i_disk_version);
|
if (likely(!test_opt2(inode->i_sb, HURD_COMPAT))) {
|
||||||
if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) {
|
inode->i_version = le32_to_cpu(raw_inode->i_disk_version);
|
||||||
if (EXT4_FITS_IN_INODE(raw_inode, ei, i_version_hi))
|
if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) {
|
||||||
inode->i_version |=
|
if (EXT4_FITS_IN_INODE(raw_inode, ei, i_version_hi))
|
||||||
(__u64)(le32_to_cpu(raw_inode->i_version_hi)) << 32;
|
inode->i_version |=
|
||||||
|
(__u64)(le32_to_cpu(raw_inode->i_version_hi)) << 32;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
@@ -4328,8 +4347,7 @@ static int ext4_do_update_inode(handle_t *handle,
|
|||||||
goto out_brelse;
|
goto out_brelse;
|
||||||
raw_inode->i_dtime = cpu_to_le32(ei->i_dtime);
|
raw_inode->i_dtime = cpu_to_le32(ei->i_dtime);
|
||||||
raw_inode->i_flags = cpu_to_le32(ei->i_flags & 0xFFFFFFFF);
|
raw_inode->i_flags = cpu_to_le32(ei->i_flags & 0xFFFFFFFF);
|
||||||
if (EXT4_SB(inode->i_sb)->s_es->s_creator_os !=
|
if (likely(!test_opt2(inode->i_sb, HURD_COMPAT)))
|
||||||
cpu_to_le32(EXT4_OS_HURD))
|
|
||||||
raw_inode->i_file_acl_high =
|
raw_inode->i_file_acl_high =
|
||||||
cpu_to_le16(ei->i_file_acl >> 32);
|
cpu_to_le16(ei->i_file_acl >> 32);
|
||||||
raw_inode->i_file_acl_lo = cpu_to_le32(ei->i_file_acl);
|
raw_inode->i_file_acl_lo = cpu_to_le32(ei->i_file_acl);
|
||||||
@@ -4374,12 +4392,15 @@ static int ext4_do_update_inode(handle_t *handle,
|
|||||||
raw_inode->i_block[block] = ei->i_data[block];
|
raw_inode->i_block[block] = ei->i_data[block];
|
||||||
}
|
}
|
||||||
|
|
||||||
raw_inode->i_disk_version = cpu_to_le32(inode->i_version);
|
if (likely(!test_opt2(inode->i_sb, HURD_COMPAT))) {
|
||||||
if (ei->i_extra_isize) {
|
raw_inode->i_disk_version = cpu_to_le32(inode->i_version);
|
||||||
if (EXT4_FITS_IN_INODE(raw_inode, ei, i_version_hi))
|
if (ei->i_extra_isize) {
|
||||||
raw_inode->i_version_hi =
|
if (EXT4_FITS_IN_INODE(raw_inode, ei, i_version_hi))
|
||||||
cpu_to_le32(inode->i_version >> 32);
|
raw_inode->i_version_hi =
|
||||||
raw_inode->i_extra_isize = cpu_to_le16(ei->i_extra_isize);
|
cpu_to_le32(inode->i_version >> 32);
|
||||||
|
raw_inode->i_extra_isize =
|
||||||
|
cpu_to_le16(ei->i_extra_isize);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ext4_inode_csum_set(inode, raw_inode, ei);
|
ext4_inode_csum_set(inode, raw_inode, ei);
|
||||||
@@ -4446,7 +4467,12 @@ int ext4_write_inode(struct inode *inode, struct writeback_control *wbc)
|
|||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wbc->sync_mode != WB_SYNC_ALL)
|
/*
|
||||||
|
* No need to force transaction in WB_SYNC_NONE mode. Also
|
||||||
|
* ext4_sync_fs() will force the commit after everything is
|
||||||
|
* written.
|
||||||
|
*/
|
||||||
|
if (wbc->sync_mode != WB_SYNC_ALL || wbc->for_sync)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err = ext4_force_commit(inode->i_sb);
|
err = ext4_force_commit(inode->i_sb);
|
||||||
@@ -4456,7 +4482,11 @@ int ext4_write_inode(struct inode *inode, struct writeback_control *wbc)
|
|||||||
err = __ext4_get_inode_loc(inode, &iloc, 0);
|
err = __ext4_get_inode_loc(inode, &iloc, 0);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
if (wbc->sync_mode == WB_SYNC_ALL)
|
/*
|
||||||
|
* sync(2) will flush the whole buffer cache. No need to do
|
||||||
|
* it here separately for each inode.
|
||||||
|
*/
|
||||||
|
if (wbc->sync_mode == WB_SYNC_ALL && !wbc->for_sync)
|
||||||
sync_dirty_buffer(iloc.bh);
|
sync_dirty_buffer(iloc.bh);
|
||||||
if (buffer_req(iloc.bh) && !buffer_uptodate(iloc.bh)) {
|
if (buffer_req(iloc.bh) && !buffer_uptodate(iloc.bh)) {
|
||||||
EXT4_ERROR_INODE_BLOCK(inode, iloc.bh->b_blocknr,
|
EXT4_ERROR_INODE_BLOCK(inode, iloc.bh->b_blocknr,
|
||||||
|
|||||||
+6
-18
@@ -104,21 +104,15 @@ static long swap_inode_boot_loader(struct super_block *sb,
|
|||||||
struct ext4_inode_info *ei_bl;
|
struct ext4_inode_info *ei_bl;
|
||||||
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
||||||
|
|
||||||
if (inode->i_nlink != 1 || !S_ISREG(inode->i_mode)) {
|
if (inode->i_nlink != 1 || !S_ISREG(inode->i_mode))
|
||||||
err = -EINVAL;
|
return -EINVAL;
|
||||||
goto swap_boot_out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!inode_owner_or_capable(inode) || !capable(CAP_SYS_ADMIN)) {
|
if (!inode_owner_or_capable(inode) || !capable(CAP_SYS_ADMIN))
|
||||||
err = -EPERM;
|
return -EPERM;
|
||||||
goto swap_boot_out;
|
|
||||||
}
|
|
||||||
|
|
||||||
inode_bl = ext4_iget(sb, EXT4_BOOT_LOADER_INO);
|
inode_bl = ext4_iget(sb, EXT4_BOOT_LOADER_INO);
|
||||||
if (IS_ERR(inode_bl)) {
|
if (IS_ERR(inode_bl))
|
||||||
err = PTR_ERR(inode_bl);
|
return PTR_ERR(inode_bl);
|
||||||
goto swap_boot_out;
|
|
||||||
}
|
|
||||||
ei_bl = EXT4_I(inode_bl);
|
ei_bl = EXT4_I(inode_bl);
|
||||||
|
|
||||||
filemap_flush(inode->i_mapping);
|
filemap_flush(inode->i_mapping);
|
||||||
@@ -193,20 +187,14 @@ static long swap_inode_boot_loader(struct super_block *sb,
|
|||||||
ext4_mark_inode_dirty(handle, inode);
|
ext4_mark_inode_dirty(handle, inode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ext4_journal_stop(handle);
|
ext4_journal_stop(handle);
|
||||||
|
|
||||||
ext4_double_up_write_data_sem(inode, inode_bl);
|
ext4_double_up_write_data_sem(inode, inode_bl);
|
||||||
|
|
||||||
journal_err_out:
|
journal_err_out:
|
||||||
ext4_inode_resume_unlocked_dio(inode);
|
ext4_inode_resume_unlocked_dio(inode);
|
||||||
ext4_inode_resume_unlocked_dio(inode_bl);
|
ext4_inode_resume_unlocked_dio(inode_bl);
|
||||||
|
|
||||||
unlock_two_nondirectories(inode, inode_bl);
|
unlock_two_nondirectories(inode, inode_bl);
|
||||||
|
|
||||||
iput(inode_bl);
|
iput(inode_bl);
|
||||||
|
|
||||||
swap_boot_out:
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-3
@@ -1808,6 +1808,7 @@ int ext4_mb_find_by_goal(struct ext4_allocation_context *ac,
|
|||||||
ext4_lock_group(ac->ac_sb, group);
|
ext4_lock_group(ac->ac_sb, group);
|
||||||
max = mb_find_extent(e4b, ac->ac_g_ex.fe_start,
|
max = mb_find_extent(e4b, ac->ac_g_ex.fe_start,
|
||||||
ac->ac_g_ex.fe_len, &ex);
|
ac->ac_g_ex.fe_len, &ex);
|
||||||
|
ex.fe_logical = 0xDEADFA11; /* debug value */
|
||||||
|
|
||||||
if (max >= ac->ac_g_ex.fe_len && ac->ac_g_ex.fe_len == sbi->s_stripe) {
|
if (max >= ac->ac_g_ex.fe_len && ac->ac_g_ex.fe_len == sbi->s_stripe) {
|
||||||
ext4_fsblk_t start;
|
ext4_fsblk_t start;
|
||||||
@@ -1936,7 +1937,7 @@ void ext4_mb_complex_scan_group(struct ext4_allocation_context *ac,
|
|||||||
*/
|
*/
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
ex.fe_logical = 0xDEADC0DE; /* debug value */
|
||||||
ext4_mb_measure_extent(ac, &ex, e4b);
|
ext4_mb_measure_extent(ac, &ex, e4b);
|
||||||
|
|
||||||
i += ex.fe_len;
|
i += ex.fe_len;
|
||||||
@@ -1977,6 +1978,7 @@ void ext4_mb_scan_aligned(struct ext4_allocation_context *ac,
|
|||||||
max = mb_find_extent(e4b, i, sbi->s_stripe, &ex);
|
max = mb_find_extent(e4b, i, sbi->s_stripe, &ex);
|
||||||
if (max >= sbi->s_stripe) {
|
if (max >= sbi->s_stripe) {
|
||||||
ac->ac_found++;
|
ac->ac_found++;
|
||||||
|
ex.fe_logical = 0xDEADF00D; /* debug value */
|
||||||
ac->ac_b_ex = ex;
|
ac->ac_b_ex = ex;
|
||||||
ext4_mb_use_best_found(ac, e4b);
|
ext4_mb_use_best_found(ac, e4b);
|
||||||
break;
|
break;
|
||||||
@@ -4006,8 +4008,7 @@ static void ext4_mb_show_ac(struct ext4_allocation_context *ac)
|
|||||||
(unsigned long)ac->ac_b_ex.fe_len,
|
(unsigned long)ac->ac_b_ex.fe_len,
|
||||||
(unsigned long)ac->ac_b_ex.fe_logical,
|
(unsigned long)ac->ac_b_ex.fe_logical,
|
||||||
(int)ac->ac_criteria);
|
(int)ac->ac_criteria);
|
||||||
ext4_msg(ac->ac_sb, KERN_ERR, "%lu scanned, %d found",
|
ext4_msg(ac->ac_sb, KERN_ERR, "%d found", ac->ac_found);
|
||||||
ac->ac_ex_scanned, ac->ac_found);
|
|
||||||
ext4_msg(ac->ac_sb, KERN_ERR, "groups: ");
|
ext4_msg(ac->ac_sb, KERN_ERR, "groups: ");
|
||||||
ngroups = ext4_get_groups_count(sb);
|
ngroups = ext4_get_groups_count(sb);
|
||||||
for (i = 0; i < ngroups; i++) {
|
for (i = 0; i < ngroups; i++) {
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user