if ((filp->f_mode & FMODE_WRITE) &&
                        (atomic_read(&inode->i_writecount) == 1))
        {
-               down(&EXT3_I(inode)->truncate_sem);
+               mutex_lock(&EXT3_I(inode)->truncate_mutex);
                ext3_discard_reservation(inode);
-               up(&EXT3_I(inode)->truncate_sem);
+               mutex_unlock(&EXT3_I(inode)->truncate_mutex);
        }
        if (is_dx(inode) && filp->private_data)
                ext3_htree_free_dir_info(filp->private_data);
 
        if (!create || err == -EIO)
                goto cleanup;
 
-       down(&ei->truncate_sem);
+       mutex_lock(&ei->truncate_mutex);
 
        /*
         * If the indirect block is missing while we are reading
                }
                partial = ext3_get_branch(inode, depth, offsets, chain, &err);
                if (!partial) {
-                       up(&ei->truncate_sem);
+                       mutex_unlock(&ei->truncate_mutex);
                        if (err)
                                goto cleanup;
                        clear_buffer_new(bh_result);
                err = ext3_splice_branch(handle, inode, iblock, chain,
                                         partial, left);
        /*
-        * i_disksize growing is protected by truncate_sem.  Don't forget to
+        * i_disksize growing is protected by truncate_mutex.  Don't forget to
         * protect it if you're about to implement concurrent
         * ext3_get_block() -bzzz
        */
        if (!err && extend_disksize && inode->i_size > ei->i_disksize)
                ei->i_disksize = inode->i_size;
-       up(&ei->truncate_sem);
+       mutex_unlock(&ei->truncate_mutex);
        if (err)
                goto cleanup;
 
  *     ext3_file_write() -> generic_file_write() -> __alloc_pages() -> ...
  *
  * Same applies to ext3_get_block().  We will deadlock on various things like
- * lock_journal and i_truncate_sem.
+ * lock_journal and i_truncate_mutex.
  *
  * Setting PF_MEMALLOC here doesn't work - too many internal memory
  * allocations fail.
         * From here we block out all ext3_get_block() callers who want to
         * modify the block allocation tree.
         */
-       down(&ei->truncate_sem);
+       mutex_lock(&ei->truncate_mutex);
 
        if (n == 1) {           /* direct blocks */
                ext3_free_data(handle, inode, NULL, i_data+offsets[0],
 
        ext3_discard_reservation(inode);
 
-       up(&ei->truncate_sem);
+       mutex_unlock(&ei->truncate_mutex);
        inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC;
        ext3_mark_inode_dirty(handle, inode);
 
 
                 * need to allocate reservation structure for this inode
                 * before set the window size
                 */
-               down(&ei->truncate_sem);
+               mutex_lock(&ei->truncate_mutex);
                if (!ei->i_block_alloc_info)
                        ext3_init_block_alloc_info(inode);
 
                        struct ext3_reserve_window_node *rsv = &ei->i_block_alloc_info->rsv_window_node;
                        rsv->rsv_goal_size = rsv_window_size;
                }
-               up(&ei->truncate_sem);
+               mutex_unlock(&ei->truncate_mutex);
                return 0;
        }
        case EXT3_IOC_GROUP_EXTEND: {
 
 #ifdef CONFIG_EXT3_FS_XATTR
                init_rwsem(&ei->xattr_sem);
 #endif
-               init_MUTEX(&ei->truncate_sem);
+               mutex_init(&ei->truncate_mutex);
                inode_init_once(&ei->vfs_inode);
        }
 }
 
 #include <linux/rwsem.h>
 #include <linux/rbtree.h>
 #include <linux/seqlock.h>
+#include <linux/mutex.h>
 
 struct ext3_reserve_window {
        __u32                   _rsv_start;     /* First byte reserved */
        __u16 i_extra_isize;
 
        /*
-        * truncate_sem is for serialising ext3_truncate() against
+        * truncate_mutex is for serialising ext3_truncate() against
         * ext3_getblock().  In the 2.4 ext2 design, great chunks of inode's
         * data tree are chopped off during truncate. We can't do that in
         * ext3 because whenever we perform intermediate commits during
         * truncate, the inode and all the metadata blocks *must* be in a
         * consistent state which allows truncation of the orphans to restart
         * during recovery.  Hence we must fix the get_block-vs-truncate race
-        * by other means, so we have truncate_sem.
+        * by other means, so we have truncate_mutex.
         */
-       struct semaphore truncate_sem;
+       struct mutex truncate_mutex;
        struct inode vfs_inode;
 };