X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fudf%2Fialloc.c;h=a7e5d40f1ebc002a354abb68c6a0a89e95594656;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=be11d8af3b7caba890406a96abe5cfee005a94e9;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/fs/udf/ialloc.c b/fs/udf/ialloc.c index be11d8af3..a7e5d40f1 100644 --- a/fs/udf/ialloc.c +++ b/fs/udf/ialloc.c @@ -35,11 +35,8 @@ void udf_free_inode(struct inode * inode) { - struct super_block * sb = inode->i_sb; - int is_directory; - unsigned long ino; - - ino = inode->i_ino; + struct super_block *sb = inode->i_sb; + struct udf_sb_info *sbi = UDF_SB(sb); /* * Note: we must free any quota before locking the superblock, @@ -48,36 +45,32 @@ void udf_free_inode(struct inode * inode) DQUOT_FREE_INODE(inode); DQUOT_DROP(inode); - lock_super(sb); - - is_directory = S_ISDIR(inode->i_mode); - clear_inode(inode); - if (UDF_SB_LVIDBH(sb)) - { - if (is_directory) + down(&sbi->s_alloc_sem); + if (sbi->s_lvidbh) { + if (S_ISDIR(inode->i_mode)) UDF_SB_LVIDIU(sb)->numDirs = cpu_to_le32(le32_to_cpu(UDF_SB_LVIDIU(sb)->numDirs) - 1); else UDF_SB_LVIDIU(sb)->numFiles = cpu_to_le32(le32_to_cpu(UDF_SB_LVIDIU(sb)->numFiles) - 1); - mark_buffer_dirty(UDF_SB_LVIDBH(sb)); + mark_buffer_dirty(sbi->s_lvidbh); } - unlock_super(sb); + up(&sbi->s_alloc_sem); udf_free_blocks(sb, NULL, UDF_I_LOCATION(inode), 0, 1); } struct inode * udf_new_inode (struct inode *dir, int mode, int * err) { - struct super_block *sb; + struct super_block *sb = dir->i_sb; + struct udf_sb_info *sbi = UDF_SB(sb); struct inode * inode; int block; uint32_t start = UDF_I_LOCATION(dir).logicalBlockNum; - sb = dir->i_sb; inode = new_inode(sb); if (!inode) @@ -94,8 +87,8 @@ struct inode * udf_new_inode (struct inode *dir, int mode, int * err) iput(inode); return NULL; } - lock_super(sb); + down(&sbi->s_alloc_sem); UDF_I_UNIQUE(inode) = 0; UDF_I_LENEXTENTS(inode) = 0; UDF_I_NEXT_ALLOC_BLOCK(inode) = 0; @@ -157,11 +150,11 @@ struct inode * udf_new_inode (struct inode *dir, int mode, int * err) else UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_LONG; inode->i_mtime = inode->i_atime = inode->i_ctime = - UDF_I_CRTIME(inode) = CURRENT_TIME; + UDF_I_CRTIME(inode) = current_fs_time(inode->i_sb); insert_inode_hash(inode); mark_inode_dirty(inode); + up(&sbi->s_alloc_sem); - unlock_super(sb); if (DQUOT_ALLOC_INODE(inode)) { DQUOT_DROP(inode);