]> err.no Git - linux-2.6/blobdiff - fs/block_dev.c
[PATCH] RTC subsystem: RS5C372 driver
[linux-2.6] / fs / block_dev.c
index 6e50346fb1eeea70da97a38d2059249362c10a0f..5983d42df015d2ff32983ddc46e8ae194c3e1063 100644 (file)
@@ -86,16 +86,12 @@ EXPORT_SYMBOL(set_blocksize);
 
 int sb_set_blocksize(struct super_block *sb, int size)
 {
-       int bits = 9; /* 2^9 = 512 */
-
        if (set_blocksize(sb->s_bdev, size))
                return 0;
        /* If we get here, we know size is power of two
         * and it's value is between 512 and PAGE_SIZE */
        sb->s_blocksize = size;
-       for (size >>= 10; size; size >>= 1)
-               ++bits;
-       sb->s_blocksize_bits = bits;
+       sb->s_blocksize_bits = blksize_bits(size);
        return sb->s_blocksize;
 }
 
@@ -135,9 +131,10 @@ blkdev_get_block(struct inode *inode, sector_t iblock,
 
 static int
 blkdev_get_blocks(struct inode *inode, sector_t iblock,
-               unsigned long max_blocks, struct buffer_head *bh, int create)
+               struct buffer_head *bh, int create)
 {
        sector_t end_block = max_block(I_BDEV(inode));
+       unsigned long max_blocks = bh->b_size >> inode->i_blkbits;
 
        if ((iblock + max_blocks) > end_block) {
                max_blocks = end_block - iblock;
@@ -238,7 +235,7 @@ static int block_fsync(struct file *filp, struct dentry *dentry, int datasync)
  */
 
 static  __cacheline_aligned_in_smp DEFINE_SPINLOCK(bdev_lock);
-static kmem_cache_t * bdev_cachep;
+static kmem_cache_t * bdev_cachep __read_mostly;
 
 static struct inode *bdev_alloc_inode(struct super_block *sb)
 {
@@ -265,8 +262,8 @@ static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags)
            SLAB_CTOR_CONSTRUCTOR)
        {
                memset(bdev, 0, sizeof(*bdev));
-               sema_init(&bdev->bd_sem, 1);
-               sema_init(&bdev->bd_mount_sem, 1);
+               mutex_init(&bdev->bd_mutex);
+               mutex_init(&bdev->bd_mount_mutex);
                INIT_LIST_HEAD(&bdev->bd_inodes);
                INIT_LIST_HEAD(&bdev->bd_list);
                inode_init_once(&ei->vfs_inode);
@@ -312,14 +309,15 @@ static struct file_system_type bd_type = {
        .kill_sb        = kill_anon_super,
 };
 
-static struct vfsmount *bd_mnt;
+static struct vfsmount *bd_mnt __read_mostly;
 struct super_block *blockdev_superblock;
 
 void __init bdev_cache_init(void)
 {
        int err;
        bdev_cachep = kmem_cache_create("bdev_cache", sizeof(struct bdev_inode),
-                       0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|SLAB_PANIC,
+                       0, (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
+                               SLAB_MEM_SPREAD|SLAB_PANIC),
                        init_once, NULL);
        err = register_filesystem(&bd_type);
        if (err)
@@ -574,7 +572,7 @@ static int do_open(struct block_device *bdev, struct file *file)
        }
        owner = disk->fops->owner;
 
-       down(&bdev->bd_sem);
+       mutex_lock(&bdev->bd_mutex);
        if (!bdev->bd_openers) {
                bdev->bd_disk = disk;
                bdev->bd_contains = bdev;
@@ -605,21 +603,21 @@ static int do_open(struct block_device *bdev, struct file *file)
                        if (ret)
                                goto out_first;
                        bdev->bd_contains = whole;
-                       down(&whole->bd_sem);
+                       mutex_lock(&whole->bd_mutex);
                        whole->bd_part_count++;
                        p = disk->part[part - 1];
                        bdev->bd_inode->i_data.backing_dev_info =
                           whole->bd_inode->i_data.backing_dev_info;
                        if (!(disk->flags & GENHD_FL_UP) || !p || !p->nr_sects) {
                                whole->bd_part_count--;
-                               up(&whole->bd_sem);
+                               mutex_unlock(&whole->bd_mutex);
                                ret = -ENXIO;
                                goto out_first;
                        }
                        kobject_get(&p->kobj);
                        bdev->bd_part = p;
                        bd_set_size(bdev, (loff_t) p->nr_sects << 9);
-                       up(&whole->bd_sem);
+                       mutex_unlock(&whole->bd_mutex);
                }
        } else {
                put_disk(disk);
@@ -633,13 +631,13 @@ static int do_open(struct block_device *bdev, struct file *file)
                        if (bdev->bd_invalidated)
                                rescan_partitions(bdev->bd_disk, bdev);
                } else {
-                       down(&bdev->bd_contains->bd_sem);
+                       mutex_lock(&bdev->bd_contains->bd_mutex);
                        bdev->bd_contains->bd_part_count++;
-                       up(&bdev->bd_contains->bd_sem);
+                       mutex_unlock(&bdev->bd_contains->bd_mutex);
                }
        }
        bdev->bd_openers++;
-       up(&bdev->bd_sem);
+       mutex_unlock(&bdev->bd_mutex);
        unlock_kernel();
        return 0;
 
@@ -652,7 +650,7 @@ out_first:
        put_disk(disk);
        module_put(owner);
 out:
-       up(&bdev->bd_sem);
+       mutex_unlock(&bdev->bd_mutex);
        unlock_kernel();
        if (ret)
                bdput(bdev);
@@ -714,7 +712,7 @@ int blkdev_put(struct block_device *bdev)
        struct inode *bd_inode = bdev->bd_inode;
        struct gendisk *disk = bdev->bd_disk;
 
-       down(&bdev->bd_sem);
+       mutex_lock(&bdev->bd_mutex);
        lock_kernel();
        if (!--bdev->bd_openers) {
                sync_blockdev(bdev);
@@ -724,9 +722,9 @@ int blkdev_put(struct block_device *bdev)
                if (disk->fops->release)
                        ret = disk->fops->release(bd_inode, NULL);
        } else {
-               down(&bdev->bd_contains->bd_sem);
+               mutex_lock(&bdev->bd_contains->bd_mutex);
                bdev->bd_contains->bd_part_count--;
-               up(&bdev->bd_contains->bd_sem);
+               mutex_unlock(&bdev->bd_contains->bd_mutex);
        }
        if (!bdev->bd_openers) {
                struct module *owner = disk->fops->owner;
@@ -746,7 +744,7 @@ int blkdev_put(struct block_device *bdev)
                bdev->bd_contains = NULL;
        }
        unlock_kernel();
-       up(&bdev->bd_sem);
+       mutex_unlock(&bdev->bd_mutex);
        bdput(bdev);
        return ret;
 }