return ret;
}
-static inline int loop_get_bs(struct loop_device *lo)
-{
- return block_size(lo->lo_device);
-}
-
static inline unsigned long loop_get_iv(struct loop_device *lo,
unsigned long sector)
{
- int bs = loop_get_bs(lo);
+ int bs = lo->lo_blocksize;
unsigned long offset, IV;
IV = sector / (bs >> 9) + lo->lo_offset / bs;
do {
if (bio_rw(bio) == WRITE)
- ret = lo_send(lo, bio, loop_get_bs(lo), pos);
+ ret = lo_send(lo, bio, lo->lo_blocksize, pos);
else
- ret = lo_receive(lo, bio, loop_get_bs(lo), pos);
+ ret = lo_receive(lo, bio, lo->lo_blocksize, pos);
} while (++bio->bi_idx < bio->bi_vcnt);
{
struct file *file;
struct inode *inode;
- struct block_device *lo_device;
+ struct block_device *lo_device = NULL;
+ unsigned lo_blocksize;
int lo_flags = 0;
int error;
error = -EBUSY;
goto out;
}
+ lo_blocksize = block_size(lo_device);
+ if (bdev_read_only(lo_device))
+ lo_flags |= LO_FLAGS_READ_ONLY;
} else if (S_ISREG(inode->i_mode)) {
struct address_space_operations *aops = inode->i_mapping->a_ops;
/*
if (!aops->prepare_write || !aops->commit_write)
lo_flags |= LO_FLAGS_READ_ONLY;
- lo_device = inode->i_sb->s_bdev;
+ lo_blocksize = inode->i_blocksize;
lo_flags |= LO_FLAGS_DO_BMAP;
error = 0;
} else
get_file(file);
- if (IS_RDONLY (inode) || bdev_read_only(lo_device)
- || !(lo_file->f_mode & FMODE_WRITE))
+ if (!(lo_file->f_mode & FMODE_WRITE))
lo_flags |= LO_FLAGS_READ_ONLY;
set_device_ro(bdev, (lo_flags & LO_FLAGS_READ_ONLY) != 0);
+ lo->lo_blocksize = lo_blocksize;
lo->lo_device = lo_device;
lo->lo_flags = lo_flags;
lo->lo_backing_file = file;
lo->old_gfp_mask = inode->i_mapping->gfp_mask;
inode->i_mapping->gfp_mask = GFP_NOIO;
- set_blocksize(bdev, block_size(lo_device));
+ set_blocksize(bdev, lo_blocksize);
lo->lo_bio = lo->lo_biotail = NULL;
info.lo_number = lo->lo_number;
info.lo_device = stat.dev;
info.lo_inode = stat.ino;
- info.lo_rdevice = lo->lo_device->bd_dev;
+ info.lo_rdevice = lo->lo_device ? stat.rdev : stat.dev;
info.lo_offset = lo->lo_offset;
info.lo_flags = lo->lo_flags;
strncpy(info.lo_name, lo->lo_name, LO_NAME_SIZE);
sbinfo->max_inodes = inodes;
sbinfo->free_inodes = inodes;
sb->s_maxbytes = SHMEM_MAX_BYTES;
- sb->s_bdev = bdget(sb->s_dev);
- if (!sb->s_bdev)
- goto failed;
- if (!sb_set_blocksize(sb, PAGE_CACHE_SIZE))
- BUG();
+ sb->s_blocksize = PAGE_CACHE_SIZE;
+ sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
sb->s_magic = TMPFS_MAGIC;
sb->s_op = &shmem_ops;
inode = shmem_get_inode(sb, S_IFDIR | mode, 0);
if (!inode)
- goto failed_bdput;
+ goto failed;
inode->i_uid = uid;
inode->i_gid = gid;
root = d_alloc_root(inode);
failed_iput:
iput(inode);
-failed_bdput:
- bdput(sb->s_bdev);
- sb->s_bdev = NULL;
failed:
kfree(sbinfo);
sb->s_fs_info = NULL;
static void shmem_put_super(struct super_block *sb)
{
- bdput(sb->s_bdev);
- sb->s_bdev = NULL;
kfree(sb->s_fs_info);
sb->s_fs_info = NULL;
}