if (!*num_bits)
                return 0;
 
-       down(&HFS_SB(sb)->bitmap_lock);
+       mutex_lock(&HFS_SB(sb)->bitmap_lock);
        bitmap = HFS_SB(sb)->bitmap;
 
        pos = hfs_find_set_zero_bits(bitmap, HFS_SB(sb)->fs_ablocks, goal, num_bits);
        HFS_SB(sb)->free_ablocks -= *num_bits;
        hfs_bitmap_dirty(sb);
 out:
-       up(&HFS_SB(sb)->bitmap_lock);
+       mutex_unlock(&HFS_SB(sb)->bitmap_lock);
        return pos;
 }
 
        if ((start + count) > HFS_SB(sb)->fs_ablocks)
                return -2;
 
-       down(&HFS_SB(sb)->bitmap_lock);
+       mutex_lock(&HFS_SB(sb)->bitmap_lock);
        /* bitmap is always on a 32-bit boundary */
        curr = HFS_SB(sb)->bitmap + (start / 32);
        len = count;
        }
 out:
        HFS_SB(sb)->free_ablocks += len;
-       up(&HFS_SB(sb)->bitmap_lock);
+       mutex_unlock(&HFS_SB(sb)->bitmap_lock);
        hfs_bitmap_dirty(sb);
 
        return 0;
 
 
 #include <linux/slab.h>
 #include <linux/types.h>
+#include <linux/mutex.h>
 #include <linux/buffer_head.h>
 #include <linux/fs.h>
 
 
        struct nls_table *nls_io, *nls_disk;
 
-       struct semaphore bitmap_lock;
+       struct mutex bitmap_lock;
 
        unsigned long flags;
 
 
 
        sb->s_op = &hfs_super_operations;
        sb->s_flags |= MS_NODIRATIME;
-       init_MUTEX(&sbi->bitmap_lock);
+       mutex_init(&sbi->bitmap_lock);
 
        res = hfs_mdb_get(sb);
        if (res) {