Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e9688f6a authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4: (44 commits)
  ext4: fix trimming starting with block 0 with small blocksize
  ext4: revert buggy trim overflow patch
  ext4: don't pass entire map to check_eofblocks_fl
  ext4: fix memory leak in ext4_free_branches
  ext4: remove ext4_mb_return_to_preallocation()
  ext4: flush the i_completed_io_list during ext4_truncate
  ext4: add error checking to calls to ext4_handle_dirty_metadata()
  ext4: fix trimming of a single group
  ext4: fix uninitialized variable in ext4_register_li_request
  ext4: dynamically allocate the jbd2_inode in ext4_inode_info as necessary
  ext4: drop i_state_flags on architectures with 64-bit longs
  ext4: reorder ext4_inode_info structure elements to remove unneeded padding
  ext4: drop ec_type from the ext4_ext_cache structure
  ext4: use ext4_lblk_t instead of sector_t for logical blocks
  ext4: replace i_delalloc_reserved_flag with EXT4_STATE_DELALLOC_RESERVED
  ext4: fix 32bit overflow in ext4_ext_find_goal()
  ext4: add more error checks to ext4_mkdir()
  ext4: ext4_ext_migrate should use NULL not 0
  ext4: Use ext4_error_file() to print the pathname to the corrupted inode
  ext4: use IS_ERR() to check for errors in ext4_error_file
  ...
parents 40c73abb 0f0a25bf
Loading
Loading
Loading
Loading
+1 −9
Original line number Original line Diff line number Diff line
@@ -199,14 +199,6 @@ bad_block: ext2_error(inode->i_sb, "ext2_xattr_get",
			goto found;
			goto found;
		entry = next;
		entry = next;
	}
	}
	/* Check the remaining name entries */
	while (!IS_LAST_ENTRY(entry)) {
		struct ext2_xattr_entry *next =
			EXT2_XATTR_NEXT(entry);
		if ((char *)next >= end)
			goto bad_block;
		entry = next;
	}
	if (ext2_xattr_cache_insert(bh))
	if (ext2_xattr_cache_insert(bh))
		ea_idebug(inode, "cache insert failed");
		ea_idebug(inode, "cache insert failed");
	error = -ENODATA;
	error = -ENODATA;
@@ -355,7 +347,7 @@ static void ext2_xattr_update_super_block(struct super_block *sb)
/*
/*
 * ext2_xattr_set()
 * ext2_xattr_set()
 *
 *
 * Create, replace or remove an extended attribute for this inode. Buffer
 * Create, replace or remove an extended attribute for this inode.  Value
 * is NULL to remove an existing extended attribute, and non-NULL to
 * is NULL to remove an existing extended attribute, and non-NULL to
 * either replace an existing extended attribute, or create a new extended
 * either replace an existing extended attribute, or create a new extended
 * attribute. The flags XATTR_REPLACE and XATTR_CREATE
 * attribute. The flags XATTR_REPLACE and XATTR_CREATE
+1 −1
Original line number Original line Diff line number Diff line
@@ -925,7 +925,7 @@ ext3_xattr_ibody_set(handle_t *handle, struct inode *inode,
/*
/*
 * ext3_xattr_set_handle()
 * ext3_xattr_set_handle()
 *
 *
 * Create, replace or remove an extended attribute for this inode. Buffer
 * Create, replace or remove an extended attribute for this inode.  Value
 * is NULL to remove an existing extended attribute, and non-NULL to
 * is NULL to remove an existing extended attribute, and non-NULL to
 * either replace an existing extended attribute, or create a new extended
 * either replace an existing extended attribute, or create a new extended
 * attribute. The flags XATTR_REPLACE and XATTR_CREATE
 * attribute. The flags XATTR_REPLACE and XATTR_CREATE
+2 −1
Original line number Original line Diff line number Diff line
@@ -592,7 +592,8 @@ ext4_fsblk_t ext4_new_meta_blocks(handle_t *handle, struct inode *inode,
	 * Account for the allocated meta blocks.  We will never
	 * Account for the allocated meta blocks.  We will never
	 * fail EDQUOT for metdata, but we do account for it.
	 * fail EDQUOT for metdata, but we do account for it.
	 */
	 */
	if (!(*errp) && EXT4_I(inode)->i_delalloc_reserved_flag) {
	if (!(*errp) &&
	    ext4_test_inode_state(inode, EXT4_STATE_DELALLOC_RESERVED)) {
		spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
		spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
		EXT4_I(inode)->i_allocated_meta_blocks += ar.len;
		EXT4_I(inode)->i_allocated_meta_blocks += ar.len;
		spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
		spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
+36 −20
Original line number Original line Diff line number Diff line
@@ -60,9 +60,13 @@ static unsigned char get_dtype(struct super_block *sb, int filetype)
	return (ext4_filetype_table[filetype]);
	return (ext4_filetype_table[filetype]);
}
}



/*
 * Return 0 if the directory entry is OK, and 1 if there is a problem
 *
 * Note: this is the opposite of what ext2 and ext3 historically returned...
 */
int __ext4_check_dir_entry(const char *function, unsigned int line,
int __ext4_check_dir_entry(const char *function, unsigned int line,
			   struct inode *dir,
			   struct inode *dir, struct file *filp,
			   struct ext4_dir_entry_2 *de,
			   struct ext4_dir_entry_2 *de,
			   struct buffer_head *bh,
			   struct buffer_head *bh,
			   unsigned int offset)
			   unsigned int offset)
@@ -71,26 +75,37 @@ int __ext4_check_dir_entry(const char *function, unsigned int line,
	const int rlen = ext4_rec_len_from_disk(de->rec_len,
	const int rlen = ext4_rec_len_from_disk(de->rec_len,
						dir->i_sb->s_blocksize);
						dir->i_sb->s_blocksize);


	if (rlen < EXT4_DIR_REC_LEN(1))
	if (unlikely(rlen < EXT4_DIR_REC_LEN(1)))
		error_msg = "rec_len is smaller than minimal";
		error_msg = "rec_len is smaller than minimal";
	else if (rlen % 4 != 0)
	else if (unlikely(rlen % 4 != 0))
		error_msg = "rec_len % 4 != 0";
		error_msg = "rec_len % 4 != 0";
	else if (rlen < EXT4_DIR_REC_LEN(de->name_len))
	else if (unlikely(rlen < EXT4_DIR_REC_LEN(de->name_len)))
		error_msg = "rec_len is too small for name_len";
		error_msg = "rec_len is too small for name_len";
	else if (((char *) de - bh->b_data) + rlen > dir->i_sb->s_blocksize)
	else if (unlikely(((char *) de - bh->b_data) + rlen >
			  dir->i_sb->s_blocksize))
		error_msg = "directory entry across blocks";
		error_msg = "directory entry across blocks";
	else if (le32_to_cpu(de->inode) >
	else if (unlikely(le32_to_cpu(de->inode) >
			le32_to_cpu(EXT4_SB(dir->i_sb)->s_es->s_inodes_count))
			le32_to_cpu(EXT4_SB(dir->i_sb)->s_es->s_inodes_count)))
		error_msg = "inode out of bounds";
		error_msg = "inode out of bounds";
	else
		return 0;


	if (error_msg != NULL)
	if (filp)
		ext4_error_inode(dir, function, line, bh->b_blocknr,
		ext4_error_file(filp, function, line, bh ? bh->b_blocknr : 0,
			"bad entry in directory: %s - "
				"bad entry in directory: %s - offset=%u(%u), "
			"offset=%u(%u), inode=%u, rec_len=%d, name_len=%d",
				"inode=%u, rec_len=%d, name_len=%d",
			error_msg, (unsigned) (offset%bh->b_size), offset,
				error_msg, (unsigned) (offset%bh->b_size),
			le32_to_cpu(de->inode),
				offset, le32_to_cpu(de->inode),
				rlen, de->name_len);
				rlen, de->name_len);
	return error_msg == NULL ? 1 : 0;
	else
		ext4_error_inode(dir, function, line, bh ? bh->b_blocknr : 0,
				"bad entry in directory: %s - offset=%u(%u), "
				"inode=%u, rec_len=%d, name_len=%d",
				error_msg, (unsigned) (offset%bh->b_size),
				offset, le32_to_cpu(de->inode),
				rlen, de->name_len);

	return 1;
}
}


static int ext4_readdir(struct file *filp,
static int ext4_readdir(struct file *filp,
@@ -152,8 +167,9 @@ static int ext4_readdir(struct file *filp,
		 */
		 */
		if (!bh) {
		if (!bh) {
			if (!dir_has_error) {
			if (!dir_has_error) {
				EXT4_ERROR_INODE(inode, "directory "
				EXT4_ERROR_FILE(filp, 0,
					   "contains a hole at offset %Lu",
						"directory contains a "
						"hole at offset %llu",
					   (unsigned long long) filp->f_pos);
					   (unsigned long long) filp->f_pos);
				dir_has_error = 1;
				dir_has_error = 1;
			}
			}
@@ -194,7 +210,7 @@ static int ext4_readdir(struct file *filp,
		while (!error && filp->f_pos < inode->i_size
		while (!error && filp->f_pos < inode->i_size
		       && offset < sb->s_blocksize) {
		       && offset < sb->s_blocksize) {
			de = (struct ext4_dir_entry_2 *) (bh->b_data + offset);
			de = (struct ext4_dir_entry_2 *) (bh->b_data + offset);
			if (!ext4_check_dir_entry(inode, de,
			if (ext4_check_dir_entry(inode, filp, de,
						 bh, offset)) {
						 bh, offset)) {
				/*
				/*
				 * On error, skip the f_pos to the next block
				 * On error, skip the f_pos to the next block
+56 −37
Original line number Original line Diff line number Diff line
@@ -62,8 +62,8 @@
#define EXT4_ERROR_INODE_BLOCK(inode, block, fmt, a...)			\
#define EXT4_ERROR_INODE_BLOCK(inode, block, fmt, a...)			\
	ext4_error_inode((inode), __func__, __LINE__, (block), (fmt), ## a)
	ext4_error_inode((inode), __func__, __LINE__, (block), (fmt), ## a)


#define EXT4_ERROR_FILE(file, fmt, a...)	\
#define EXT4_ERROR_FILE(file, block, fmt, a...)				\
	ext4_error_file(__func__, __LINE__, (file), (fmt), ## a)
	ext4_error_file((file), __func__, __LINE__, (block), (fmt), ## a)


/* data type for block offset of block group */
/* data type for block offset of block group */
typedef int ext4_grpblk_t;
typedef int ext4_grpblk_t;
@@ -561,22 +561,6 @@ struct ext4_new_group_data {
#define EXT4_IOC32_SETVERSION_OLD	FS_IOC32_SETVERSION
#define EXT4_IOC32_SETVERSION_OLD	FS_IOC32_SETVERSION
#endif
#endif



/*
 *  Mount options
 */
struct ext4_mount_options {
	unsigned long s_mount_opt;
	uid_t s_resuid;
	gid_t s_resgid;
	unsigned long s_commit_interval;
	u32 s_min_batch_time, s_max_batch_time;
#ifdef CONFIG_QUOTA
	int s_jquota_fmt;
	char *s_qf_names[MAXQUOTAS];
#endif
};

/* Max physical block we can addres w/o extents */
/* Max physical block we can addres w/o extents */
#define EXT4_MAX_BLOCK_FILE_PHYS	0xFFFFFFFF
#define EXT4_MAX_BLOCK_FILE_PHYS	0xFFFFFFFF


@@ -709,6 +693,8 @@ do { \
	if (EXT4_FITS_IN_INODE(raw_inode, EXT4_I(inode), xtime ## _extra))     \
	if (EXT4_FITS_IN_INODE(raw_inode, EXT4_I(inode), xtime ## _extra))     \
		ext4_decode_extra_time(&(inode)->xtime,			       \
		ext4_decode_extra_time(&(inode)->xtime,			       \
				       raw_inode->xtime ## _extra);	       \
				       raw_inode->xtime ## _extra);	       \
	else								       \
		(inode)->xtime.tv_nsec = 0;				       \
} while (0)
} while (0)


#define EXT4_EINODE_GET_XTIME(xtime, einode, raw_inode)			       \
#define EXT4_EINODE_GET_XTIME(xtime, einode, raw_inode)			       \
@@ -719,6 +705,8 @@ do { \
	if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime ## _extra))	       \
	if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime ## _extra))	       \
		ext4_decode_extra_time(&(einode)->xtime,		       \
		ext4_decode_extra_time(&(einode)->xtime,		       \
				       raw_inode->xtime ## _extra);	       \
				       raw_inode->xtime ## _extra);	       \
	else								       \
		(einode)->xtime.tv_nsec = 0;				       \
} while (0)
} while (0)


#define i_disk_version osd1.linux1.l_i_version
#define i_disk_version osd1.linux1.l_i_version
@@ -750,12 +738,13 @@ do { \


/*
/*
 * storage for cached extent
 * storage for cached extent
 * If ec_len == 0, then the cache is invalid.
 * If ec_start == 0, then the cache represents a gap (null mapping)
 */
 */
struct ext4_ext_cache {
struct ext4_ext_cache {
	ext4_fsblk_t	ec_start;
	ext4_fsblk_t	ec_start;
	ext4_lblk_t	ec_block;
	ext4_lblk_t	ec_block;
	__u32		ec_len; /* must be 32bit to return holes */
	__u32		ec_len; /* must be 32bit to return holes */
	__u32		ec_type;
};
};


/*
/*
@@ -774,10 +763,12 @@ struct ext4_inode_info {
	 * near to their parent directory's inode.
	 * near to their parent directory's inode.
	 */
	 */
	ext4_group_t	i_block_group;
	ext4_group_t	i_block_group;
	ext4_lblk_t	i_dir_start_lookup;
#if (BITS_PER_LONG < 64)
	unsigned long	i_state_flags;		/* Dynamic state flags */
	unsigned long	i_state_flags;		/* Dynamic state flags */
#endif
	unsigned long	i_flags;
	unsigned long	i_flags;


	ext4_lblk_t		i_dir_start_lookup;
#ifdef CONFIG_EXT4_FS_XATTR
#ifdef CONFIG_EXT4_FS_XATTR
	/*
	/*
	 * Extended attributes can be read independently of the main file
	 * Extended attributes can be read independently of the main file
@@ -820,7 +811,7 @@ struct ext4_inode_info {
	 */
	 */
	struct rw_semaphore i_data_sem;
	struct rw_semaphore i_data_sem;
	struct inode vfs_inode;
	struct inode vfs_inode;
	struct jbd2_inode jinode;
	struct jbd2_inode *jinode;


	struct ext4_ext_cache i_cached_extent;
	struct ext4_ext_cache i_cached_extent;
	/*
	/*
@@ -840,14 +831,12 @@ struct ext4_inode_info {
	unsigned int i_reserved_data_blocks;
	unsigned int i_reserved_data_blocks;
	unsigned int i_reserved_meta_blocks;
	unsigned int i_reserved_meta_blocks;
	unsigned int i_allocated_meta_blocks;
	unsigned int i_allocated_meta_blocks;
	unsigned short i_delalloc_reserved_flag;
	ext4_lblk_t i_da_metadata_calc_last_lblock;
	sector_t i_da_metadata_calc_last_lblock;
	int i_da_metadata_calc_len;
	int i_da_metadata_calc_len;


	/* on-disk additional length */
	/* on-disk additional length */
	__u16 i_extra_isize;
	__u16 i_extra_isize;


	spinlock_t i_block_reservation_lock;
#ifdef CONFIG_QUOTA
#ifdef CONFIG_QUOTA
	/* quota space reservation, managed internally by quota code */
	/* quota space reservation, managed internally by quota code */
	qsize_t i_reserved_quota;
	qsize_t i_reserved_quota;
@@ -856,9 +845,11 @@ struct ext4_inode_info {
	/* completed IOs that might need unwritten extents handling */
	/* completed IOs that might need unwritten extents handling */
	struct list_head i_completed_io_list;
	struct list_head i_completed_io_list;
	spinlock_t i_completed_io_lock;
	spinlock_t i_completed_io_lock;
	atomic_t i_ioend_count;	/* Number of outstanding io_end structs */
	/* current io_end structure for async DIO write*/
	/* current io_end structure for async DIO write*/
	ext4_io_end_t *cur_aio_dio;
	ext4_io_end_t *cur_aio_dio;
	atomic_t i_ioend_count;	/* Number of outstanding io_end structs */

	spinlock_t i_block_reservation_lock;


	/*
	/*
	 * Transactions that contain inode's metadata needed to complete
	 * Transactions that contain inode's metadata needed to complete
@@ -917,11 +908,20 @@ struct ext4_inode_info {
#define EXT4_MOUNT_DISCARD		0x40000000 /* Issue DISCARD requests */
#define EXT4_MOUNT_DISCARD		0x40000000 /* Issue DISCARD requests */
#define EXT4_MOUNT_INIT_INODE_TABLE	0x80000000 /* Initialize uninitialized itables */
#define EXT4_MOUNT_INIT_INODE_TABLE	0x80000000 /* Initialize uninitialized itables */


#define clear_opt(o, opt)		o &= ~EXT4_MOUNT_##opt
#define clear_opt(sb, opt)		EXT4_SB(sb)->s_mount_opt &= \
#define set_opt(o, opt)			o |= EXT4_MOUNT_##opt
						~EXT4_MOUNT_##opt
#define set_opt(sb, opt)		EXT4_SB(sb)->s_mount_opt |= \
						EXT4_MOUNT_##opt
#define test_opt(sb, opt)		(EXT4_SB(sb)->s_mount_opt & \
#define test_opt(sb, opt)		(EXT4_SB(sb)->s_mount_opt & \
					 EXT4_MOUNT_##opt)
					 EXT4_MOUNT_##opt)


#define clear_opt2(sb, opt)		EXT4_SB(sb)->s_mount_opt2 &= \
						~EXT4_MOUNT2_##opt
#define set_opt2(sb, opt)		EXT4_SB(sb)->s_mount_opt2 |= \
						EXT4_MOUNT2_##opt
#define test_opt2(sb, opt)		(EXT4_SB(sb)->s_mount_opt2 & \
					 EXT4_MOUNT2_##opt)

#define ext4_set_bit			ext2_set_bit
#define ext4_set_bit			ext2_set_bit
#define ext4_set_bit_atomic		ext2_set_bit_atomic
#define ext4_set_bit_atomic		ext2_set_bit_atomic
#define ext4_clear_bit			ext2_clear_bit
#define ext4_clear_bit			ext2_clear_bit
@@ -1087,6 +1087,7 @@ struct ext4_sb_info {
	struct ext4_super_block *s_es;	/* Pointer to the super block in the buffer */
	struct ext4_super_block *s_es;	/* Pointer to the super block in the buffer */
	struct buffer_head **s_group_desc;
	struct buffer_head **s_group_desc;
	unsigned int s_mount_opt;
	unsigned int s_mount_opt;
	unsigned int s_mount_opt2;
	unsigned int s_mount_flags;
	unsigned int s_mount_flags;
	ext4_fsblk_t s_sb_block;
	ext4_fsblk_t s_sb_block;
	uid_t s_resuid;
	uid_t s_resuid;
@@ -1237,24 +1238,39 @@ enum {
	EXT4_STATE_EXT_MIGRATE,		/* Inode is migrating */
	EXT4_STATE_EXT_MIGRATE,		/* Inode is migrating */
	EXT4_STATE_DIO_UNWRITTEN,	/* need convert on dio done*/
	EXT4_STATE_DIO_UNWRITTEN,	/* need convert on dio done*/
	EXT4_STATE_NEWENTRY,		/* File just added to dir */
	EXT4_STATE_NEWENTRY,		/* File just added to dir */
	EXT4_STATE_DELALLOC_RESERVED,	/* blks already reserved for delalloc */
};
};


#define EXT4_INODE_BIT_FNS(name, field)					\
#define EXT4_INODE_BIT_FNS(name, field, offset)				\
static inline int ext4_test_inode_##name(struct inode *inode, int bit)	\
static inline int ext4_test_inode_##name(struct inode *inode, int bit)	\
{									\
{									\
	return test_bit(bit, &EXT4_I(inode)->i_##field);		\
	return test_bit(bit + (offset), &EXT4_I(inode)->i_##field);	\
}									\
}									\
static inline void ext4_set_inode_##name(struct inode *inode, int bit)	\
static inline void ext4_set_inode_##name(struct inode *inode, int bit)	\
{									\
{									\
	set_bit(bit, &EXT4_I(inode)->i_##field);			\
	set_bit(bit + (offset), &EXT4_I(inode)->i_##field);		\
}									\
}									\
static inline void ext4_clear_inode_##name(struct inode *inode, int bit) \
static inline void ext4_clear_inode_##name(struct inode *inode, int bit) \
{									\
{									\
	clear_bit(bit, &EXT4_I(inode)->i_##field);			\
	clear_bit(bit + (offset), &EXT4_I(inode)->i_##field);		\
}
}


EXT4_INODE_BIT_FNS(flag, flags)
EXT4_INODE_BIT_FNS(flag, flags, 0)
EXT4_INODE_BIT_FNS(state, state_flags)
#if (BITS_PER_LONG < 64)
EXT4_INODE_BIT_FNS(state, state_flags, 0)

static inline void ext4_clear_state_flags(struct ext4_inode_info *ei)
{
	(ei)->i_state_flags = 0;
}
#else
EXT4_INODE_BIT_FNS(state, flags, 32)

static inline void ext4_clear_state_flags(struct ext4_inode_info *ei)
{
	/* We depend on the fact that callers will set i_flags */
}
#endif
#else
#else
/* Assume that user mode programs are passing in an ext4fs superblock, not
/* Assume that user mode programs are passing in an ext4fs superblock, not
 * a kernel struct super_block.  This will allow us to call the feature-test
 * a kernel struct super_block.  This will allow us to call the feature-test
@@ -1642,10 +1658,12 @@ extern unsigned ext4_init_block_bitmap(struct super_block *sb,


/* dir.c */
/* dir.c */
extern int __ext4_check_dir_entry(const char *, unsigned int, struct inode *,
extern int __ext4_check_dir_entry(const char *, unsigned int, struct inode *,
				  struct file *,
				  struct ext4_dir_entry_2 *,
				  struct ext4_dir_entry_2 *,
				  struct buffer_head *, unsigned int);
				  struct buffer_head *, unsigned int);
#define ext4_check_dir_entry(dir, de, bh, offset) \
#define ext4_check_dir_entry(dir, filp, de, bh, offset)			\
	__ext4_check_dir_entry(__func__, __LINE__, (dir), (de), (bh), (offset))
	unlikely(__ext4_check_dir_entry(__func__, __LINE__, (dir), (filp), \
					(de), (bh), (offset)))
extern int ext4_htree_store_dirent(struct file *dir_file, __u32 hash,
extern int ext4_htree_store_dirent(struct file *dir_file, __u32 hash,
				    __u32 minor_hash,
				    __u32 minor_hash,
				    struct ext4_dir_entry_2 *dirent);
				    struct ext4_dir_entry_2 *dirent);
@@ -1653,6 +1671,7 @@ extern void ext4_htree_free_dir_info(struct dir_private_info *p);


/* fsync.c */
/* fsync.c */
extern int ext4_sync_file(struct file *, int);
extern int ext4_sync_file(struct file *, int);
extern int ext4_flush_completed_IO(struct inode *);


/* hash.c */
/* hash.c */
extern int ext4fs_dirhash(const char *name, int len, struct
extern int ext4fs_dirhash(const char *name, int len, struct
@@ -1752,8 +1771,8 @@ extern void ext4_error_inode(struct inode *, const char *, unsigned int,
			     ext4_fsblk_t, const char *, ...)
			     ext4_fsblk_t, const char *, ...)
	__attribute__ ((format (printf, 5, 6)));
	__attribute__ ((format (printf, 5, 6)));
extern void ext4_error_file(struct file *, const char *, unsigned int,
extern void ext4_error_file(struct file *, const char *, unsigned int,
			    const char *, ...)
			    ext4_fsblk_t, const char *, ...)
	__attribute__ ((format (printf, 4, 5)));
	__attribute__ ((format (printf, 5, 6)));
extern void __ext4_std_error(struct super_block *, const char *,
extern void __ext4_std_error(struct super_block *, const char *,
			     unsigned int, int);
			     unsigned int, int);
extern void __ext4_abort(struct super_block *, const char *, unsigned int,
extern void __ext4_abort(struct super_block *, const char *, unsigned int,
Loading