drivers/block/ioctl.c | 3 -- drivers/block/loop.c | 2 - fs/block_dev.c | 65 ++++++++++++++++++++++++++++---------------------- fs/reiserfs/journal.c | 9 +----- include/linux/fs.h | 5 ++- mm/filemap.c | 2 - mm/swapfile.c | 7 ++--- 7 files changed, 48 insertions(+), 45 deletions(-) diff -puN drivers/block/ioctl.c~RD15-I_BDEV-B6 drivers/block/ioctl.c --- 25/drivers/block/ioctl.c~RD15-I_BDEV-B6 2003-10-02 01:36:12.000000000 -0700 +++ 25-akpm/drivers/block/ioctl.c 2003-10-02 01:36:12.000000000 -0700 @@ -132,10 +132,9 @@ static int put_u64(unsigned long arg, u6 return put_user(val, (u64 *)arg); } -int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd, +int blkdev_ioctl(struct block_device *bdev, struct file *file, unsigned cmd, unsigned long arg) { - struct block_device *bdev = inode->i_bdev; struct gendisk *disk = bdev->bd_disk; struct backing_dev_info *bdi; int holder; diff -puN drivers/block/loop.c~RD15-I_BDEV-B6 drivers/block/loop.c --- 25/drivers/block/loop.c~RD15-I_BDEV-B6 2003-10-02 01:36:12.000000000 -0700 +++ 25-akpm/drivers/block/loop.c 2003-10-02 01:36:12.000000000 -0700 @@ -685,7 +685,7 @@ static int loop_set_fd(struct loop_devic error = -EINVAL; if (S_ISBLK(inode->i_mode)) { - lo_device = inode->i_bdev; + lo_device = I_BDEV(inode); if (lo_device == bdev) { error = -EBUSY; goto out; diff -puN fs/block_dev.c~RD15-I_BDEV-B6 fs/block_dev.c --- 25/fs/block_dev.c~RD15-I_BDEV-B6 2003-10-02 01:36:12.000000000 -0700 +++ 25-akpm/fs/block_dev.c 2003-10-02 01:36:12.000000000 -0700 @@ -25,6 +25,22 @@ #include #include +struct bdev_inode { + struct block_device bdev; + struct inode vfs_inode; +}; + +static inline struct bdev_inode *BDEV_I(struct inode *inode) +{ + return container_of(inode, struct bdev_inode, vfs_inode); +} + +inline struct block_device *I_BDEV(struct inode *inode) +{ + return &BDEV_I(inode)->bdev; +} + +EXPORT_SYMBOL(I_BDEV); static sector_t max_block(struct block_device *bdev) { @@ -100,10 +116,10 @@ static int blkdev_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh, int create) { - if (iblock >= max_block(inode->i_bdev)) + if (iblock >= max_block(I_BDEV(inode))) return -EIO; - bh->b_bdev = inode->i_bdev; + bh->b_bdev = I_BDEV(inode); bh->b_blocknr = iblock; set_buffer_mapped(bh); return 0; @@ -113,10 +129,10 @@ static int blkdev_get_blocks(struct inode *inode, sector_t iblock, unsigned long max_blocks, struct buffer_head *bh, int create) { - if ((iblock + max_blocks) > max_block(inode->i_bdev)) + if ((iblock + max_blocks) > max_block(I_BDEV(inode))) return -EIO; - bh->b_bdev = inode->i_bdev; + bh->b_bdev = I_BDEV(inode); bh->b_blocknr = iblock; bh->b_size = max_blocks << inode->i_blkbits; set_buffer_mapped(bh); @@ -130,7 +146,7 @@ blkdev_direct_IO(int rw, struct kiocb *i struct file *file = iocb->ki_filp; struct inode *inode = file->f_mapping->host; - return blockdev_direct_IO(rw, iocb, inode, inode->i_bdev, iov, offset, + return blockdev_direct_IO(rw, iocb, inode, I_BDEV(inode), iov, offset, nr_segs, blkdev_get_blocks, NULL); } @@ -161,11 +177,10 @@ static int blkdev_commit_write(struct fi */ static loff_t block_llseek(struct file *file, loff_t offset, int origin) { - struct inode *bd_inode; + struct inode *bd_inode = file->f_mapping->host; loff_t size; loff_t retval; - bd_inode = file->f_dentry->d_inode->i_bdev->bd_inode; down(&bd_inode->i_sem); size = i_size_read(bd_inode); @@ -188,15 +203,13 @@ static loff_t block_llseek(struct file * } /* - * Filp may be NULL when we are called by an msync of a vma - * since the vma has no handle. + * Filp is never NULL; the only case when ->fsync() is called with + * NULL first argument is nfsd_sync_dir() and that's not a directory. */ static int block_fsync(struct file *filp, struct dentry *dentry, int datasync) { - struct inode * inode = dentry->d_inode; - - return sync_blockdev(inode->i_bdev); + return sync_blockdev(I_BDEV(filp->f_mapping->host)); } /* @@ -206,16 +219,6 @@ static int block_fsync(struct file *filp static spinlock_t bdev_lock __cacheline_aligned_in_smp = SPIN_LOCK_UNLOCKED; static kmem_cache_t * bdev_cachep; -struct bdev_inode { - struct block_device bdev; - struct inode vfs_inode; -}; - -static inline struct bdev_inode *BDEV_I(struct inode *inode) -{ - return container_of(inode, struct bdev_inode, vfs_inode); -} - static struct inode *bdev_alloc_inode(struct super_block *sb) { struct bdev_inode *ei = kmem_cache_alloc(bdev_cachep, SLAB_KERNEL); @@ -734,11 +737,12 @@ int blkdev_put(struct block_device *bdev EXPORT_SYMBOL(blkdev_put); -int blkdev_close(struct inode * inode, struct file * filp) +static int blkdev_close(struct inode * inode, struct file * filp) { - if (inode->i_bdev->bd_holder == filp) - bd_release(inode->i_bdev); - return blkdev_put(inode->i_bdev, BDEV_FILE); + struct block_device *bdev = I_BDEV(filp->f_mapping->host); + if (bdev->bd_holder == filp) + bd_release(bdev); + return blkdev_put(bdev, BDEV_FILE); } static ssize_t blkdev_file_write(struct file *file, const char __user *buf, @@ -757,6 +761,11 @@ static ssize_t blkdev_file_aio_write(str return generic_file_aio_write_nolock(iocb, &local_iov, 1, &iocb->ki_pos); } +static int block_ioctl(struct inode *inode, struct file *file, unsigned cmd, + unsigned long arg) +{ + return blkdev_ioctl(I_BDEV(file->f_mapping->host), file, cmd, arg); +} struct address_space_operations def_blk_aops = { .readpage = blkdev_readpage, @@ -778,7 +787,7 @@ struct file_operations def_blk_fops = { .aio_write = blkdev_file_aio_write, .mmap = generic_file_mmap, .fsync = block_fsync, - .ioctl = blkdev_ioctl, + .ioctl = block_ioctl, .readv = generic_file_readv, .writev = generic_file_writev, .sendfile = generic_file_sendfile, @@ -791,7 +800,7 @@ int ioctl_by_bdev(struct block_device *b int res; mm_segment_t old_fs = get_fs(); set_fs(KERNEL_DS); - res = blkdev_ioctl(bdev->bd_inode, NULL, cmd, arg); + res = blkdev_ioctl(bdev, NULL, cmd, arg); set_fs(old_fs); return res; } diff -puN fs/reiserfs/journal.c~RD15-I_BDEV-B6 fs/reiserfs/journal.c --- 25/fs/reiserfs/journal.c~RD15-I_BDEV-B6 2003-10-02 01:36:12.000000000 -0700 +++ 25-akpm/fs/reiserfs/journal.c 2003-10-02 01:36:12.000000000 -0700 @@ -1937,18 +1937,13 @@ static int journal_init_dev( struct supe journal -> j_dev_file = filp_open( jdev_name, 0, 0 ); if( !IS_ERR( journal -> j_dev_file ) ) { - struct inode *jdev_inode; - - jdev_inode = journal -> j_dev_file -> f_dentry -> d_inode; - journal -> j_dev_bd = jdev_inode -> i_bdev; + struct inode *jdev_inode = journal->j_dev_file->f_mapping->host; if( !S_ISBLK( jdev_inode -> i_mode ) ) { printk( "journal_init_dev: '%s' is not a block device\n", jdev_name ); result = -ENOTBLK; - } else if( jdev_inode -> i_bdev == NULL ) { - printk( "journal_init_dev: bdev uninitialized for '%s'\n", jdev_name ); - result = -ENOMEM; } else { /* ok */ + journal->j_dev_bd = I_BDEV(jdev_inode); set_blocksize(journal->j_dev_bd, super->s_blocksize); } } else { diff -puN include/linux/fs.h~RD15-I_BDEV-B6 include/linux/fs.h --- 25/include/linux/fs.h~RD15-I_BDEV-B6 2003-10-02 01:36:12.000000000 -0700 +++ 25-akpm/include/linux/fs.h 2003-10-02 01:36:12.000000000 -0700 @@ -480,6 +480,8 @@ static inline unsigned imajor(struct ino return MAJOR(inode->i_rdev); } +extern struct block_device *I_BDEV(struct inode *inode); + struct fown_struct { rwlock_t lock; /* protects pid, uid, euid fields */ int pid; /* pid or -pgrp where SIGIO should be sent */ @@ -1127,7 +1129,6 @@ extern struct block_device *bdget(dev_t) extern void bd_forget(struct inode *inode); extern void bdput(struct block_device *); extern int blkdev_open(struct inode *, struct file *); -extern int blkdev_close(struct inode *, struct file *); extern struct block_device *open_by_devnum(dev_t, unsigned, int); extern struct file_operations def_blk_fops; extern struct address_space_operations def_blk_aops; @@ -1135,7 +1136,7 @@ extern struct file_operations def_chr_fo extern struct file_operations bad_sock_fops; extern struct file_operations def_fifo_fops; extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long); -extern int blkdev_ioctl(struct inode *, struct file *, unsigned, unsigned long); +extern int blkdev_ioctl(struct block_device *, struct file *, unsigned, unsigned long); extern int blkdev_get(struct block_device *, mode_t, unsigned, int); extern int blkdev_put(struct block_device *, int); extern int bd_claim(struct block_device *, void *); diff -puN mm/filemap.c~RD15-I_BDEV-B6 mm/filemap.c --- 25/mm/filemap.c~RD15-I_BDEV-B6 2003-10-02 01:36:12.000000000 -0700 +++ 25-akpm/mm/filemap.c 2003-10-02 01:36:12.000000000 -0700 @@ -1662,7 +1662,7 @@ inline int generic_write_checks(struct f *count = inode->i_sb->s_maxbytes - *pos; } else { loff_t isize; - if (bdev_read_only(inode->i_bdev)) + if (bdev_read_only(I_BDEV(inode))) return -EPERM; isize = i_size_read(inode); if (*pos >= isize) { diff -puN mm/swapfile.c~RD15-I_BDEV-B6 mm/swapfile.c --- 25/mm/swapfile.c~RD15-I_BDEV-B6 2003-10-02 01:36:12.000000000 -0700 +++ 25-akpm/mm/swapfile.c 2003-10-02 01:36:12.000000000 -0700 @@ -1100,8 +1100,7 @@ asmlinkage long sys_swapoff(const char _ swap_list_unlock(); vfree(swap_map); if (S_ISBLK(mapping->host->i_mode)) { - struct block_device *bdev; - bdev = mapping->host->i_bdev; + struct block_device *bdev = I_BDEV(mapping->host); set_blocksize(bdev, p->old_block_size); bd_release(bdev); } else { @@ -1294,14 +1293,14 @@ asmlinkage long sys_swapon(const char __ error = -EINVAL; if (S_ISBLK(inode->i_mode)) { - bdev = inode->i_bdev; + bdev = I_BDEV(inode); error = bd_claim(bdev, sys_swapon); if (error < 0) { bdev = NULL; goto bad_swap; } p->old_block_size = block_size(bdev); - error = set_blocksize(inode->i_bdev, PAGE_SIZE); + error = set_blocksize(bdev, PAGE_SIZE); if (error < 0) goto bad_swap; p->bdev = bdev; _