Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
Pull ext2, ext3, udf updates from Jan Kara: "Several UDF fixes, a support for UDF extent cache, and couple of ext2 and ext3 cleanups and minor fixes" * 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs: Ext2: remove the static function release_blocks to optimize the kernel Ext2: mark inode dirty after the function dquot_free_block_nodirty is called Ext2: remove the overhead check about sb in the function ext2_new_blocks udf: Remove unused s_extLength from udf_bitmap udf: Make s_block_bitmap standard array udf: Fix bitmap overflow on large filesystems with small block size udf: add extent cache support in case of file reading udf: Write LVID to disk after opening / closing Ext3: return ENOMEM rather than EIO if sb_getblk fails Ext2: return ENOMEM rather than EIO if sb_getblk fails Ext3: use unlikely to improve the efficiency of the kernel Ext2: use unlikely to improve the efficiency of the kernel Ext3: add necessary check in case IO error happens Ext2: free memory allocated and forget buffer head when io error happens ext3: Fix memory leak when quota options are specified multiple times ext3, ext4, ocfs2: remove unused macro NAMEI_RA_INDEX
This commit is contained in:
+10
-6
@@ -676,6 +676,10 @@ static int ext3_alloc_branch(handle_t *handle, struct inode *inode,
|
||||
* parent to disk.
|
||||
*/
|
||||
bh = sb_getblk(inode->i_sb, new_blocks[n-1]);
|
||||
if (unlikely(!bh)) {
|
||||
err = -ENOMEM;
|
||||
goto failed;
|
||||
}
|
||||
branch[n].bh = bh;
|
||||
lock_buffer(bh);
|
||||
BUFFER_TRACE(bh, "call get_create_access");
|
||||
@@ -717,7 +721,7 @@ failed:
|
||||
BUFFER_TRACE(branch[i].bh, "call journal_forget");
|
||||
ext3_journal_forget(handle, branch[i].bh);
|
||||
}
|
||||
for (i = 0; i <indirect_blks; i++)
|
||||
for (i = 0; i < indirect_blks; i++)
|
||||
ext3_free_blocks(handle, inode, new_blocks[i], 1);
|
||||
|
||||
ext3_free_blocks(handle, inode, new_blocks[i], num);
|
||||
@@ -1078,8 +1082,8 @@ struct buffer_head *ext3_getblk(handle_t *handle, struct inode *inode,
|
||||
if (!err && buffer_mapped(&dummy)) {
|
||||
struct buffer_head *bh;
|
||||
bh = sb_getblk(inode->i_sb, dummy.b_blocknr);
|
||||
if (!bh) {
|
||||
*errp = -EIO;
|
||||
if (unlikely(!bh)) {
|
||||
*errp = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
if (buffer_new(&dummy)) {
|
||||
@@ -2729,12 +2733,12 @@ static int __ext3_get_inode_loc(struct inode *inode,
|
||||
return -EIO;
|
||||
|
||||
bh = sb_getblk(inode->i_sb, block);
|
||||
if (!bh) {
|
||||
if (unlikely(!bh)) {
|
||||
ext3_error (inode->i_sb, "ext3_get_inode_loc",
|
||||
"unable to read inode block - "
|
||||
"inode=%lu, block="E3FSBLK,
|
||||
inode->i_ino, block);
|
||||
return -EIO;
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!buffer_uptodate(bh)) {
|
||||
lock_buffer(bh);
|
||||
@@ -2783,7 +2787,7 @@ static int __ext3_get_inode_loc(struct inode *inode,
|
||||
|
||||
bitmap_bh = sb_getblk(inode->i_sb,
|
||||
le32_to_cpu(desc->bg_inode_bitmap));
|
||||
if (!bitmap_bh)
|
||||
if (unlikely(!bitmap_bh))
|
||||
goto make_io;
|
||||
|
||||
/*
|
||||
|
||||
@@ -36,7 +36,6 @@
|
||||
#define NAMEI_RA_CHUNKS 2
|
||||
#define NAMEI_RA_BLOCKS 4
|
||||
#define NAMEI_RA_SIZE (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS)
|
||||
#define NAMEI_RA_INDEX(c,b) (((c) * NAMEI_RA_BLOCKS) + (b))
|
||||
|
||||
static struct buffer_head *ext3_append(handle_t *handle,
|
||||
struct inode *inode,
|
||||
|
||||
+6
-6
@@ -116,8 +116,8 @@ static struct buffer_head *bclean(handle_t *handle, struct super_block *sb,
|
||||
int err;
|
||||
|
||||
bh = sb_getblk(sb, blk);
|
||||
if (!bh)
|
||||
return ERR_PTR(-EIO);
|
||||
if (unlikely(!bh))
|
||||
return ERR_PTR(-ENOMEM);
|
||||
if ((err = ext3_journal_get_write_access(handle, bh))) {
|
||||
brelse(bh);
|
||||
bh = ERR_PTR(err);
|
||||
@@ -234,8 +234,8 @@ static int setup_new_group_blocks(struct super_block *sb,
|
||||
goto exit_bh;
|
||||
|
||||
gdb = sb_getblk(sb, block);
|
||||
if (!gdb) {
|
||||
err = -EIO;
|
||||
if (unlikely(!gdb)) {
|
||||
err = -ENOMEM;
|
||||
goto exit_bh;
|
||||
}
|
||||
if ((err = ext3_journal_get_write_access(handle, gdb))) {
|
||||
@@ -722,8 +722,8 @@ static void update_backups(struct super_block *sb,
|
||||
break;
|
||||
|
||||
bh = sb_getblk(sb, group * bpg + blk_off);
|
||||
if (!bh) {
|
||||
err = -EIO;
|
||||
if (unlikely(!bh)) {
|
||||
err = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
ext3_debug("update metadata backup %#04lx\n",
|
||||
|
||||
+31
-22
@@ -916,21 +916,24 @@ static int set_qf_name(struct super_block *sb, int qtype, substring_t *args)
|
||||
"Not enough memory for storing quotafile name");
|
||||
return 0;
|
||||
}
|
||||
if (sbi->s_qf_names[qtype] &&
|
||||
strcmp(sbi->s_qf_names[qtype], qname)) {
|
||||
if (sbi->s_qf_names[qtype]) {
|
||||
int same = !strcmp(sbi->s_qf_names[qtype], qname);
|
||||
|
||||
kfree(qname);
|
||||
if (!same) {
|
||||
ext3_msg(sb, KERN_ERR,
|
||||
"%s quota file already specified",
|
||||
QTYPE2NAME(qtype));
|
||||
}
|
||||
return same;
|
||||
}
|
||||
if (strchr(qname, '/')) {
|
||||
ext3_msg(sb, KERN_ERR,
|
||||
"%s quota file already specified", QTYPE2NAME(qtype));
|
||||
"quotafile must be on filesystem root");
|
||||
kfree(qname);
|
||||
return 0;
|
||||
}
|
||||
sbi->s_qf_names[qtype] = qname;
|
||||
if (strchr(sbi->s_qf_names[qtype], '/')) {
|
||||
ext3_msg(sb, KERN_ERR,
|
||||
"quotafile must be on filesystem root");
|
||||
kfree(sbi->s_qf_names[qtype]);
|
||||
sbi->s_qf_names[qtype] = NULL;
|
||||
return 0;
|
||||
}
|
||||
set_opt(sbi->s_mount_opt, QUOTA);
|
||||
return 1;
|
||||
}
|
||||
@@ -945,11 +948,10 @@ static int clear_qf_name(struct super_block *sb, int qtype) {
|
||||
" when quota turned on");
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
* The space will be released later when all options are confirmed
|
||||
* to be correct
|
||||
*/
|
||||
sbi->s_qf_names[qtype] = NULL;
|
||||
if (sbi->s_qf_names[qtype]) {
|
||||
kfree(sbi->s_qf_names[qtype]);
|
||||
sbi->s_qf_names[qtype] = NULL;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
@@ -2606,7 +2608,18 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data)
|
||||
#ifdef CONFIG_QUOTA
|
||||
old_opts.s_jquota_fmt = sbi->s_jquota_fmt;
|
||||
for (i = 0; i < MAXQUOTAS; i++)
|
||||
old_opts.s_qf_names[i] = sbi->s_qf_names[i];
|
||||
if (sbi->s_qf_names[i]) {
|
||||
old_opts.s_qf_names[i] = kstrdup(sbi->s_qf_names[i],
|
||||
GFP_KERNEL);
|
||||
if (!old_opts.s_qf_names[i]) {
|
||||
int j;
|
||||
|
||||
for (j = 0; j < i; j++)
|
||||
kfree(old_opts.s_qf_names[j]);
|
||||
return -ENOMEM;
|
||||
}
|
||||
} else
|
||||
old_opts.s_qf_names[i] = NULL;
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -2699,9 +2712,7 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data)
|
||||
#ifdef CONFIG_QUOTA
|
||||
/* Release old quota file names */
|
||||
for (i = 0; i < MAXQUOTAS; i++)
|
||||
if (old_opts.s_qf_names[i] &&
|
||||
old_opts.s_qf_names[i] != sbi->s_qf_names[i])
|
||||
kfree(old_opts.s_qf_names[i]);
|
||||
kfree(old_opts.s_qf_names[i]);
|
||||
#endif
|
||||
if (enable_quota)
|
||||
dquot_resume(sb, -1);
|
||||
@@ -2715,9 +2726,7 @@ restore_opts:
|
||||
#ifdef CONFIG_QUOTA
|
||||
sbi->s_jquota_fmt = old_opts.s_jquota_fmt;
|
||||
for (i = 0; i < MAXQUOTAS; i++) {
|
||||
if (sbi->s_qf_names[i] &&
|
||||
old_opts.s_qf_names[i] != sbi->s_qf_names[i])
|
||||
kfree(sbi->s_qf_names[i]);
|
||||
kfree(sbi->s_qf_names[i]);
|
||||
sbi->s_qf_names[i] = old_opts.s_qf_names[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
+2
-2
@@ -813,10 +813,10 @@ inserted:
|
||||
ea_idebug(inode, "creating block %d", block);
|
||||
|
||||
new_bh = sb_getblk(sb, block);
|
||||
if (!new_bh) {
|
||||
if (unlikely(!new_bh)) {
|
||||
getblk_failed:
|
||||
ext3_free_blocks(handle, inode, block, 1);
|
||||
error = -EIO;
|
||||
error = -ENOMEM;
|
||||
goto cleanup;
|
||||
}
|
||||
lock_buffer(new_bh);
|
||||
|
||||
Reference in New Issue
Block a user