X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fext3%2Fialloc.c;h=f30a4f41a75504b481f14d67a3df7f97fb82c563;hb=9bf4aaab3e101692164d49b7ca357651eb691cb6;hp=ac238b2fa56aa93a232d383b88bd39924217cb28;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/fs/ext3/ialloc.c b/fs/ext3/ialloc.c index ac238b2fa..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 */ @@ -618,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); @@ -627,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);