X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fext3%2Fialloc.c;h=f30a4f41a75504b481f14d67a3df7f97fb82c563;hb=9d2a87e9549ce23b248bc8914fb808c49ad66c26;hp=11ac3c2dc61471a6a22fa50a8eabb693d5e09887;hpb=bc77d24c47b89f1e0efed0b8e4be5f8aad102883;p=linux-2.6.git diff --git a/fs/ext3/ialloc.c b/fs/ext3/ialloc.c index 11ac3c2dc..f30a4f41a 100644 --- a/fs/ext3/ialloc.c +++ b/fs/ext3/ialloc.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -124,6 +125,7 @@ void ext3_free_inode (handle_t *handle, struct inode * inode) */ DQUOT_INIT(inode); ext3_xattr_delete_inode(handle, inode); + DLIMIT_FREE_INODE(sb, inode->i_xid); DQUOT_FREE_INODE(inode); DQUOT_DROP(inode); @@ -444,6 +446,16 @@ struct inode *ext3_new_inode(handle_t *handle, struct inode * dir, int mode) inode = new_inode(sb); if (!inode) return ERR_PTR(-ENOMEM); + + if (sb->s_flags & MS_TAGXID) + inode->i_xid = current->xid; + else + inode->i_xid = 0; + + if (DLIMIT_ALLOC_INODE(sb, inode->i_xid)) { + err = -ENOSPC; + goto out; + } ei = EXT3_I(inode); sbi = EXT3_SB(sb); @@ -567,7 +579,8 @@ got: ei->i_dir_start_lookup = 0; ei->i_disksize = 0; - ei->i_flags = EXT3_I(dir)->i_flags & ~EXT3_INDEX_FL; + ei->i_flags = EXT3_I(dir)->i_flags & + ~(EXT3_INDEX_FL|EXT3_IUNLINK_FL|EXT3_BARRIER_FL); if (S_ISLNK(mode)) ei->i_flags &= ~(EXT3_IMMUTABLE_FL|EXT3_APPEND_FL); /* dirsync only applies to directories */ @@ -581,11 +594,10 @@ got: ei->i_file_acl = 0; ei->i_dir_acl = 0; ei->i_dtime = 0; - ei->i_rsv_window.rsv_start = 0; - ei->i_rsv_window.rsv_end = 0; - atomic_set(&ei->i_rsv_window.rsv_goal_size, EXT3_DEFAULT_RESERVE_BLOCKS); - ei->i_rsv_window.rsv_alloc_hit = 0; - INIT_LIST_HEAD(&ei->i_rsv_window.rsv_list); +#ifdef EXT3_PREALLOCATE + ei->i_prealloc_block = 0; + ei->i_prealloc_count = 0; +#endif ei->i_block_group = group; ext3_set_inode_flags(inode); @@ -619,6 +631,7 @@ got: ext3_debug("allocating inode %lu\n", inode->i_ino); goto really_out; fail: + DLIMIT_FREE_INODE(sb, inode->i_xid); ext3_std_error(sb, err); out: iput(inode); @@ -628,6 +641,7 @@ really_out: return ret; fail2: + DLIMIT_FREE_INODE(sb, inode->i_xid); inode->i_flags |= S_NOQUOTA; inode->i_nlink = 0; iput(inode);