Merge git://git.kernel.org/pub/scm/linux/kernel/git/hirofumi/fatfs-2.6
[pandora-kernel.git] / fs / fat / inode.c
index 017493b..1726d73 100644 (file)
@@ -211,8 +211,8 @@ static ssize_t fat_direct_IO(int rw, struct kiocb *iocb,
         * FAT need to use the DIO_LOCKING for avoiding the race
         * condition of fat_get_block() and ->truncate().
         */
-       ret = blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev,
-                                iov, offset, nr_segs, fat_get_block, NULL);
+       ret = blockdev_direct_IO(rw, iocb, inode, iov, offset, nr_segs,
+                                fat_get_block);
        if (ret < 0 && (rw & WRITE))
                fat_write_failed(mapping, offset + iov_length(iov, nr_segs));
 
@@ -224,9 +224,9 @@ static sector_t _fat_bmap(struct address_space *mapping, sector_t block)
        sector_t blocknr;
 
        /* fat_get_cluster() assumes the requested blocknr isn't truncated. */
-       down_read(&mapping->host->i_alloc_sem);
+       down_read(&MSDOS_I(mapping->host)->truncate_lock);
        blocknr = generic_block_bmap(mapping, block, fat_get_block);
-       up_read(&mapping->host->i_alloc_sem);
+       up_read(&MSDOS_I(mapping->host)->truncate_lock);
 
        return blocknr;
 }
@@ -510,6 +510,8 @@ static struct inode *fat_alloc_inode(struct super_block *sb)
        ei = kmem_cache_alloc(fat_inode_cachep, GFP_NOFS);
        if (!ei)
                return NULL;
+
+       init_rwsem(&ei->truncate_lock);
        return &ei->vfs_inode;
 }