summaryrefslogtreecommitdiff
path: root/drivers/block
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@home.osdl.org>2003-08-30 23:45:59 -0700
committerLinus Torvalds <torvalds@home.osdl.org>2003-08-30 23:45:59 -0700
commitc334ec3406bd4e366a4138570332d4e19fa70128 (patch)
treed465dd090c583e8646a98bf570a287c643ba66cb /drivers/block
parented8dff304648833f2acf9b3189a1e611355111b0 (diff)
parent9b9f98eec3f1f66d0186f7c95e3d724cf3b6765b (diff)
Merge http://lia64.bkbits.net/to-linus-2.5
into home.osdl.org:/home/torvalds/v2.5/linux
Diffstat (limited to 'drivers/block')
-rw-r--r--drivers/block/acsi_slm.c10
-rw-r--r--drivers/block/amiflop.c21
-rw-r--r--drivers/block/ataflop.c23
-rw-r--r--drivers/block/cciss.c22
-rw-r--r--drivers/block/cpqarray.c2
-rw-r--r--drivers/block/floppy.c24
-rw-r--r--drivers/block/floppy98.c24
-rw-r--r--drivers/block/genhd.c24
-rw-r--r--drivers/block/ioctl.c21
-rw-r--r--drivers/block/ll_rw_blk.c31
-rw-r--r--drivers/block/paride/pg.c4
-rw-r--r--drivers/block/paride/pt.c14
-rw-r--r--drivers/block/rd.c15
-rw-r--r--drivers/block/z2ram.c4
14 files changed, 90 insertions, 149 deletions
diff --git a/drivers/block/acsi_slm.c b/drivers/block/acsi_slm.c
index f352b5d111a3..e3be8c31a74c 100644
--- a/drivers/block/acsi_slm.c
+++ b/drivers/block/acsi_slm.c
@@ -374,7 +374,7 @@ static ssize_t slm_read( struct file *file, char *buf, size_t count,
if (!(page = __get_free_page( GFP_KERNEL )))
return( -ENOMEM );
- length = slm_getstats( (char *)page, MINOR(node->i_rdev) );
+ length = slm_getstats( (char *)page, iminor(node) );
if (length < 0) {
count = length;
goto out;
@@ -622,7 +622,7 @@ static ssize_t slm_write( struct file *file, const char *buf, size_t count,
{
struct inode *node = file->f_dentry->d_inode;
- int device = MINOR( node->i_rdev );
+ int device = iminor(node);
int n, filled, w, h;
while( SLMState == PRINTING ||
@@ -694,7 +694,7 @@ static ssize_t slm_write( struct file *file, const char *buf, size_t count,
static int slm_ioctl( struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg )
-{ int device = MINOR( inode->i_rdev ), err;
+{ int device = iminor(inode), err;
/* I can think of setting:
* - manual feed
@@ -768,7 +768,7 @@ static int slm_open( struct inode *inode, struct file *file )
{ int device;
struct slm *sip;
- device = MINOR(inode->i_rdev);
+ device = iminor(inode);
if (device >= N_SLM_Printers)
return( -ENXIO );
sip = &slm_info[device];
@@ -797,7 +797,7 @@ static int slm_release( struct inode *inode, struct file *file )
{ int device;
struct slm *sip;
- device = MINOR(inode->i_rdev);
+ device = iminor(inode);
sip = &slm_info[device];
if (file->f_mode & 2)
diff --git a/drivers/block/amiflop.c b/drivers/block/amiflop.c
index d9495c1bc4f3..b34ee99f5870 100644
--- a/drivers/block/amiflop.c
+++ b/drivers/block/amiflop.c
@@ -55,24 +55,15 @@
#include <linux/module.h>
-#include <linux/sched.h>
-#include <linux/fs.h>
-#include <linux/fcntl.h>
-#include <linux/kernel.h>
-#include <linux/timer.h>
#include <linux/fd.h>
#include <linux/hdreg.h>
-#include <linux/errno.h>
-#include <linux/types.h>
#include <linux/delay.h>
-#include <linux/string.h>
-#include <linux/slab.h>
#include <linux/init.h>
#include <linux/amifdreg.h>
#include <linux/amifd.h>
-#include <linux/ioport.h>
#include <linux/buffer_head.h>
-#include <linux/interrupt.h>
+#include <linux/blkdev.h>
+#include <linux/elevator.h>
#include <asm/setup.h>
#include <asm/uaccess.h>
@@ -1446,7 +1437,7 @@ static void do_fd_request(request_queue_t * q)
static int fd_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long param)
{
- int drive = minor(inode->i_rdev) & 3;
+ int drive = iminor(inode) & 3;
static struct floppy_struct getprm;
switch(cmd){
@@ -1570,8 +1561,8 @@ static void fd_probe(int dev)
*/
static int floppy_open(struct inode *inode, struct file *filp)
{
- int drive = minor(inode->i_rdev) & 3;
- int system = (minor(inode->i_rdev) & 4) >> 2;
+ int drive = iminor(inode) & 3;
+ int system = (iminor(inode) & 4) >> 2;
int old_dev;
unsigned long flags;
@@ -1618,7 +1609,7 @@ static int floppy_open(struct inode *inode, struct file *filp)
static int floppy_release(struct inode * inode, struct file * filp)
{
- int drive = minor(inode->i_rdev) & 3;
+ int drive = iminor(inode) & 3;
if (unit[drive].dirty == 1) {
del_timer (flush_track_timer + drive);
diff --git a/drivers/block/ataflop.c b/drivers/block/ataflop.c
index 803f5638f794..b98fa53f3c3d 100644
--- a/drivers/block/ataflop.c
+++ b/drivers/block/ataflop.c
@@ -63,35 +63,16 @@
#include <linux/module.h>
-#include <linux/sched.h>
-#include <linux/string.h>
-#include <linux/fs.h>
-#include <linux/fcntl.h>
-#include <linux/kernel.h>
-#include <linux/timer.h>
#include <linux/fd.h>
-#include <linux/errno.h>
-#include <linux/types.h>
#include <linux/delay.h>
-#include <linux/mm.h>
-#include <linux/slab.h>
#include <linux/init.h>
-#include <linux/buffer_head.h> /* for invalidate_buffers() */
-
-#include <asm/setup.h>
-#include <asm/system.h>
-#include <asm/bitops.h>
-#include <asm/irq.h>
-#include <asm/pgtable.h>
-#include <asm/uaccess.h>
+#include <linux/blkdev.h>
#include <asm/atafd.h>
#include <asm/atafdreg.h>
-#include <asm/atarihw.h>
#include <asm/atariints.h>
#include <asm/atari_stdma.h>
#include <asm/atari_stram.h>
-#include <linux/blkpg.h>
#define FD_MAX_UNITS 2
@@ -1838,7 +1819,7 @@ static void __init config_types( void )
static int floppy_open( struct inode *inode, struct file *filp )
{
struct atari_floppy_struct *p = inode->i_bdev->bd_disk->private_data;
- int type = minor(inode->i_rdev) >> 2;
+ int type = iminor(inode) >> 2;
DPRINT(("fd_open: type=%d\n",type));
if (p->ref && p->type != type)
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
index e16a993f539b..34b490615ce3 100644
--- a/drivers/block/cciss.c
+++ b/drivers/block/cciss.c
@@ -356,11 +356,11 @@ static void cmd_free(ctlr_info_t *h, CommandList_struct *c, int got_from_pool)
*/
static int cciss_open(struct inode *inode, struct file *filep)
{
- int ctlr = major(inode->i_rdev) - COMPAQ_CISS_MAJOR;
- int dsk = minor(inode->i_rdev) >> NWD_SHIFT;
+ int ctlr = imajor(inode) - COMPAQ_CISS_MAJOR;
+ int dsk = iminor(inode) >> NWD_SHIFT;
#ifdef CCISS_DEBUG
- printk(KERN_DEBUG "cciss_open %x (%x:%x)\n", inode->i_rdev, ctlr, dsk);
+ printk(KERN_DEBUG "cciss_open %s (%x:%x)\n", inode->i_bdev->bd_disk->disk_name, ctlr, dsk);
#endif /* CCISS_DEBUG */
if (ctlr >= MAX_CTLR || hba[ctlr] == NULL)
@@ -372,7 +372,7 @@ static int cciss_open(struct inode *inode, struct file *filep)
* for "raw controller".
*/
if (hba[ctlr]->drv[dsk].nr_blocks == 0) {
- if (minor(inode->i_rdev) != 0)
+ if (iminor(inode) != 0)
return -ENXIO;
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
@@ -386,11 +386,11 @@ static int cciss_open(struct inode *inode, struct file *filep)
*/
static int cciss_release(struct inode *inode, struct file *filep)
{
- int ctlr = major(inode->i_rdev) - COMPAQ_CISS_MAJOR;
- int dsk = minor(inode->i_rdev) >> NWD_SHIFT;
+ int ctlr = imajor(inode) - COMPAQ_CISS_MAJOR;
+ int dsk = iminor(inode) >> NWD_SHIFT;
#ifdef CCISS_DEBUG
- printk(KERN_DEBUG "cciss_release %x (%x:%x)\n", inode->i_rdev, ctlr, dsk);
+ printk(KERN_DEBUG "cciss_release %s (%x:%x)\n", inode->i_bdev->bd_disk->disk_name, ctlr, dsk);
#endif /* CCISS_DEBUG */
/* fsync_dev(inode->i_rdev); */
@@ -406,8 +406,8 @@ static int cciss_release(struct inode *inode, struct file *filep)
static int cciss_ioctl(struct inode *inode, struct file *filep,
unsigned int cmd, unsigned long arg)
{
- int ctlr = major(inode->i_rdev) - COMPAQ_CISS_MAJOR;
- int dsk = minor(inode->i_rdev) >> NWD_SHIFT;
+ int ctlr = imajor(inode) - COMPAQ_CISS_MAJOR;
+ int dsk = iminor(inode) >> NWD_SHIFT;
#ifdef CCISS_DEBUG
printk(KERN_DEBUG "cciss_ioctl: Called with cmd=%x %lx\n", cmd, arg);
@@ -2525,6 +2525,9 @@ err_all:
if (!q)
goto err_all;
+ hba[i]->queue = q;
+ q->queuedata = hba[i];
+
/* Initialize the pdev driver private data.
have it point to hba[i]. */
pci_set_drvdata(pdev, hba[i]);
@@ -2545,7 +2548,6 @@ err_all:
cciss_procinit(i);
- q->queuedata = hba[i];
blk_queue_bounce_limit(q, hba[i]->pdev->dma_mask);
/* This is a hardware imposed limit. */
diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c
index 16f0b8b9d433..0fbd001c3452 100644
--- a/drivers/block/cpqarray.c
+++ b/drivers/block/cpqarray.c
@@ -1078,7 +1078,7 @@ out_passthru:
put_user(host->ctlr_sig, (int*)arg);
return 0;
case IDAREVALIDATEVOLS:
- if (minor(inode->i_rdev) != 0)
+ if (iminor(inode) != 0)
return -ENXIO;
return revalidate_allvol(host);
case IDADRIVERVERSION:
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
index 433e221a42d7..aa3a82af569f 100644
--- a/drivers/block/floppy.c
+++ b/drivers/block/floppy.c
@@ -3781,9 +3781,9 @@ static int floppy_open(struct inode * inode, struct file * filp)
}
}
- UDRS->fd_device = minor(inode->i_rdev);
- set_capacity(disks[drive], floppy_sizes[minor(inode->i_rdev)]);
- if (old_dev != -1 && old_dev != minor(inode->i_rdev)) {
+ UDRS->fd_device = iminor(inode);
+ set_capacity(disks[drive], floppy_sizes[iminor(inode)]);
+ if (old_dev != -1 && old_dev != iminor(inode)) {
if (buffer_drive == drive)
buffer_track = -1;
}
@@ -3910,22 +3910,6 @@ static int __floppy_read_block_0(struct block_device *bdev)
return 0;
}
-static int floppy_read_block_0(struct gendisk *disk)
-{
- struct block_device *bdev;
- int ret;
-
- bdev = bdget_disk(disk, 0);
- if (!bdev) {
- printk("No block device for %s\n", disk->disk_name);
- BUG();
- }
- bdev->bd_disk = disk; /* ewww */
- ret = __floppy_read_block_0(bdev);
- atomic_dec(&bdev->bd_count);
- return ret;
-}
-
/* revalidate the floppy disk, i.e. trigger format autodetection by reading
* the bootblock (block 0). "Autodetection" is also needed to check whether
* there is a disk in the drive at all... Thus we also do it for fixed
@@ -3961,7 +3945,7 @@ static int floppy_revalidate(struct gendisk *disk)
UDRS->generation++;
if (NO_GEOM){
/* auto-sensing */
- res = floppy_read_block_0(disk);
+ res = __floppy_read_block_0(opened_bdev[drive]);
} else {
if (cf)
poll_drive(0, FD_RAW_NEED_DISK);
diff --git a/drivers/block/floppy98.c b/drivers/block/floppy98.c
index 52460926cdc1..d861fdbc3466 100644
--- a/drivers/block/floppy98.c
+++ b/drivers/block/floppy98.c
@@ -3844,9 +3844,9 @@ static int floppy_open(struct inode * inode, struct file * filp)
}
}
- UDRS->fd_device = minor(inode->i_rdev);
- set_capacity(disks[drive], floppy_sizes[minor(inode->i_rdev)]);
- if (old_dev != -1 && old_dev != minor(inode->i_rdev)) {
+ UDRS->fd_device = iminor(inode);
+ set_capacity(disks[drive], floppy_sizes[iminor(inode)]);
+ if (old_dev != -1 && old_dev != iminor(inode)) {
if (buffer_drive == drive)
buffer_track = -1;
}
@@ -3989,22 +3989,6 @@ static int __floppy_read_block_0(struct block_device *bdev)
return 0;
}
-static int floppy_read_block_0(struct gendisk *disk)
-{
- struct block_device *bdev;
- int ret;
-
- bdev = bdget_disk(disk, 0);
- if (!bdev) {
- printk("No block device for %s\n", disk->disk_name);
- BUG();
- }
- bdev->bd_disk = disk; /* ewww */
- ret = __floppy_read_block_0(bdev);
- atomic_dec(&bdev->bd_count);
- return ret;
-}
-
/* revalidate the floppy disk, i.e. trigger format autodetection by reading
* the bootblock (block 0). "Autodetection" is also needed to check whether
* there is a disk in the drive at all... Thus we also do it for fixed
@@ -4040,7 +4024,7 @@ static int floppy_revalidate(struct gendisk *disk)
UDRS->generation++;
if (NO_GEOM){
/* auto-sensing */
- res = floppy_read_block_0(disk);
+ res = __floppy_read_block_0(opened_bdev[drive]);
} else {
if (cf)
poll_drive(0, FD_RAW_NEED_DISK);
diff --git a/drivers/block/genhd.c b/drivers/block/genhd.c
index 24e066a8fb35..16a58ad04008 100644
--- a/drivers/block/genhd.c
+++ b/drivers/block/genhd.c
@@ -576,13 +576,10 @@ EXPORT_SYMBOL(put_disk);
void set_device_ro(struct block_device *bdev, int flag)
{
- struct gendisk *disk = bdev->bd_disk;
- if (bdev->bd_contains != bdev) {
- int part = bdev->bd_dev - MKDEV(disk->major, disk->first_minor);
- struct hd_struct *p = disk->part[part-1];
- if (p) p->policy = flag;
- } else
- disk->policy = flag;
+ if (bdev->bd_contains != bdev)
+ bdev->bd_part->policy = flag;
+ else
+ bdev->bd_disk->policy = flag;
}
void set_disk_ro(struct gendisk *disk, int flag)
@@ -595,17 +592,12 @@ void set_disk_ro(struct gendisk *disk, int flag)
int bdev_read_only(struct block_device *bdev)
{
- struct gendisk *disk;
if (!bdev)
return 0;
- disk = bdev->bd_disk;
- if (bdev->bd_contains != bdev) {
- int part = bdev->bd_dev - MKDEV(disk->major, disk->first_minor);
- struct hd_struct *p = disk->part[part-1];
- if (p) return p->policy;
- return 0;
- } else
- return disk->policy;
+ else if (bdev->bd_contains != bdev)
+ return bdev->bd_part->policy;
+ else
+ return bdev->bd_disk->policy;
}
int invalidate_partition(struct gendisk *disk, int index)
diff --git a/drivers/block/ioctl.c b/drivers/block/ioctl.c
index 9f3f411f2389..701461265c34 100644
--- a/drivers/block/ioctl.c
+++ b/drivers/block/ioctl.c
@@ -8,7 +8,6 @@
static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg *arg)
{
struct block_device *bdevp;
- int holder;
struct gendisk *disk;
struct blkpg_ioctl_arg a;
struct blkpg_partition p;
@@ -41,8 +40,11 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg *arg)
return -EINVAL;
}
/* partition number in use? */
- if (disk->part[part - 1])
+ down(&bdev->bd_sem);
+ if (disk->part[part - 1]) {
+ up(&bdev->bd_sem);
return -EBUSY;
+ }
/* overlap? */
for (i = 0; i < disk->minors - 1; i++) {
struct hd_struct *s = disk->part[i];
@@ -50,22 +52,26 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg *arg)
if (!s)
continue;
if (!(start+length <= s->start_sect ||
- start >= s->start_sect + s->nr_sects))
+ start >= s->start_sect + s->nr_sects)) {
+ up(&bdev->bd_sem);
return -EBUSY;
+ }
}
/* all seems OK */
add_partition(disk, part, start, length);
+ up(&bdev->bd_sem);
return 0;
case BLKPG_DEL_PARTITION:
if (!disk->part[part-1])
return -ENXIO;
if (disk->part[part - 1]->nr_sects == 0)
return -ENXIO;
- /* partition in use? Incomplete check for now. */
bdevp = bdget_disk(disk, part);
if (!bdevp)
return -ENOMEM;
- if (bd_claim(bdevp, &holder) < 0) {
+ down(&bdevp->bd_sem);
+ if (bdevp->bd_openers) {
+ up(&bdevp->bd_sem);
bdput(bdevp);
return -EBUSY;
}
@@ -73,9 +79,12 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg *arg)
fsync_bdev(bdevp);
invalidate_bdev(bdevp, 0);
+ down(&bdev->bd_sem);
delete_partition(disk, part);
- bd_release(bdevp);
+ up(&bdev->bd_sem);
+ up(&bdevp->bd_sem);
bdput(bdevp);
+
return 0;
default:
return -EINVAL;
diff --git a/drivers/block/ll_rw_blk.c b/drivers/block/ll_rw_blk.c
index f09d20d1e41a..98a3182919c5 100644
--- a/drivers/block/ll_rw_blk.c
+++ b/drivers/block/ll_rw_blk.c
@@ -2043,24 +2043,23 @@ end_io:
static inline void blk_partition_remap(struct bio *bio)
{
struct block_device *bdev = bio->bi_bdev;
- struct gendisk *disk = bdev->bd_disk;
- struct hd_struct *p;
- if (bdev == bdev->bd_contains)
- return;
- p = disk->part[bdev->bd_dev-MKDEV(disk->major,disk->first_minor)-1];
- switch (bio->bi_rw) {
- case READ:
- p->read_sectors += bio_sectors(bio);
- p->reads++;
- break;
- case WRITE:
- p->write_sectors += bio_sectors(bio);
- p->writes++;
- break;
+ if (bdev != bdev->bd_contains) {
+ struct hd_struct *p = bdev->bd_part;
+
+ switch (bio->bi_rw) {
+ case READ:
+ p->read_sectors += bio_sectors(bio);
+ p->reads++;
+ break;
+ case WRITE:
+ p->write_sectors += bio_sectors(bio);
+ p->writes++;
+ break;
+ }
+ bio->bi_sector += p->start_sect;
+ bio->bi_bdev = bdev->bd_contains;
}
- bio->bi_sector += bdev->bd_offset;
- bio->bi_bdev = bdev->bd_contains;
}
/**
diff --git a/drivers/block/paride/pg.c b/drivers/block/paride/pg.c
index b6e854b8613a..506f982e5518 100644
--- a/drivers/block/paride/pg.c
+++ b/drivers/block/paride/pg.c
@@ -527,11 +527,9 @@ static int pg_detect(void)
return -1;
}
-#define DEVICE_NR(dev) (minor(dev) & 0x7F)
-
static int pg_open(struct inode *inode, struct file *file)
{
- int unit = DEVICE_NR(inode->i_rdev);
+ int unit = iminor(inode) & 0x7f;
struct pg *dev = &devices[unit];
if ((unit >= PG_UNITS) || (!dev->present))
diff --git a/drivers/block/paride/pt.c b/drivers/block/paride/pt.c
index c2145ac9da66..feb1d9950dc7 100644
--- a/drivers/block/paride/pt.c
+++ b/drivers/block/paride/pt.c
@@ -670,11 +670,11 @@ static int pt_detect(void)
return -1;
}
-#define DEVICE_NR(dev) (minor(dev) & 0x7F)
+#define DEVICE_NR(inode) (iminor(inode) & 0x7F)
static int pt_open(struct inode *inode, struct file *file)
{
- int unit = DEVICE_NR(inode->i_rdev);
+ int unit = DEVICE_NR(inode);
if ((unit >= PT_UNITS) || (!PT.present))
return -ENODEV;
@@ -696,7 +696,7 @@ static int pt_open(struct inode *inode, struct file *file)
return -EROFS;
}
- if (!(minor(inode->i_rdev) & 128))
+ if (!(iminor(inode) & 128))
PT.flags |= PT_REWIND;
PT.bufptr = kmalloc(PT_BUFSIZE, GFP_KERNEL);
@@ -715,7 +715,7 @@ static int pt_ioctl(struct inode *inode, struct file *file,
int unit;
struct mtop mtop;
- unit = DEVICE_NR(inode->i_rdev);
+ unit = DEVICE_NR(inode);
if (unit >= PT_UNITS)
return -EINVAL;
if (!PT.present)
@@ -753,7 +753,7 @@ static int pt_ioctl(struct inode *inode, struct file *file,
static int
pt_release(struct inode *inode, struct file *file)
{
- int unit = DEVICE_NR(inode->i_rdev);
+ int unit = DEVICE_NR(inode);
if ((unit >= PT_UNITS) || (atomic_read(&PT.available) > 1))
return -EINVAL;
@@ -776,7 +776,7 @@ pt_release(struct inode *inode, struct file *file)
static ssize_t pt_read(struct file *filp, char *buf, size_t count, loff_t * ppos)
{
struct inode *ino = filp->f_dentry->d_inode;
- int unit = DEVICE_NR(ino->i_rdev);
+ int unit = DEVICE_NR(ino);
char rd_cmd[12] = { ATAPI_READ_6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
int k, n, r, p, s, t, b;
@@ -873,7 +873,7 @@ static ssize_t pt_read(struct file *filp, char *buf, size_t count, loff_t * ppos
static ssize_t pt_write(struct file *filp, const char *buf, size_t count, loff_t * ppos)
{
struct inode *ino = filp->f_dentry->d_inode;
- int unit = DEVICE_NR(ino->i_rdev);
+ int unit = DEVICE_NR(ino);
char wr_cmd[12] = { ATAPI_WRITE_6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
int k, n, r, p, s, t, b;
diff --git a/drivers/block/rd.c b/drivers/block/rd.c
index 5eb9dbe93a66..775b0d42908e 100644
--- a/drivers/block/rd.c
+++ b/drivers/block/rd.c
@@ -245,6 +245,7 @@ fail:
static int rd_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
int error;
+ struct block_device *bdev = inode->i_bdev;
if (cmd != BLKFLSBUF)
return -EINVAL;
@@ -253,12 +254,12 @@ static int rd_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un
it's not like with the other blockdevices where
this ioctl only flushes away the buffer cache. */
error = -EBUSY;
- down(&inode->i_bdev->bd_sem);
- if (inode->i_bdev->bd_openers <= 2) {
- truncate_inode_pages(inode->i_mapping, 0);
+ down(&bdev->bd_sem);
+ if (bdev->bd_openers <= 2) {
+ truncate_inode_pages(bdev->bd_inode->i_mapping, 0);
error = 0;
}
- up(&inode->i_bdev->bd_sem);
+ up(&bdev->bd_sem);
return error;
}
@@ -269,18 +270,18 @@ static struct backing_dev_info rd_backing_dev_info = {
static int rd_open(struct inode * inode, struct file * filp)
{
- unsigned unit = minor(inode->i_rdev);
+ unsigned unit = iminor(inode);
/*
* Immunize device against invalidate_buffers() and prune_icache().
*/
if (rd_bdev[unit] == NULL) {
struct block_device *bdev = inode->i_bdev;
- atomic_inc(&bdev->bd_count);
+ inode = igrab(bdev->bd_inode);
rd_bdev[unit] = bdev;
bdev->bd_openers++;
bdev->bd_block_size = rd_blocksize;
- bdev->bd_inode->i_size = get_capacity(rd_disks[unit])<<9;
+ inode->i_size = get_capacity(rd_disks[unit])<<9;
inode->i_mapping->a_ops = &ramdisk_aops;
inode->i_mapping->backing_dev_info = &rd_backing_dev_info;
}
diff --git a/drivers/block/z2ram.c b/drivers/block/z2ram.c
index f3a7a2b8fc7d..c952ff90a23d 100644
--- a/drivers/block/z2ram.c
+++ b/drivers/block/z2ram.c
@@ -28,10 +28,10 @@
#define DEVICE_NAME "Z2RAM"
#include <linux/major.h>
-#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/init.h>
#include <linux/module.h>
+#include <linux/blkdev.h>
#include <asm/setup.h>
#include <asm/bitops.h>
@@ -150,7 +150,7 @@ z2_open( struct inode *inode, struct file *filp )
sizeof( z2ram_map[0] );
int rc = -ENOMEM;
- device = minor( inode->i_rdev );
+ device = iminor(inode);
if ( current_device != -1 && current_device != device )
{