9 #include <linux/module.h>
13 #include <linux/kernel.h>
14 #include <linux/errno.h>
15 #include <linux/types.h>
19 #include <linux/slab.h>
34 static inline s32 nfhd_read_write(
u32 major,
u32 minor,
u32 rwflag,
u32 recno,
41 static inline s32 nfhd_get_capacity(
u32 major,
u32 minor,
u32 *blocks,
69 dir = bio_data_dir(bio);
71 bio_for_each_segment(bvec, bio, i) {
74 nfhd_read_write(dev->
id, 0, dir, sec >> shift, len >> shift,
92 static const struct block_device_operations nfhd_ops = {
94 .getgeo = nfhd_getgeo,
97 static int __init nfhd_init_one(
int id,
u32 blocks,
u32 bsize)
102 pr_info(
"nfhd%u: found device with %u blocks (%u bytes)\n", dev_id,
105 if (bsize < 512 || (bsize & (bsize - 1))) {
106 pr_warn(
"nfhd%u: invalid block size\n", dev_id);
131 dev->
disk->major = major_num;
132 dev->
disk->first_minor = dev_id * 16;
133 dev->
disk->fops = &nfhd_ops;
136 set_capacity(dev->
disk, (
sector_t)blocks * (bsize / 512));
153 static int __init nfhd_init(
void)
163 if (major_num <= 0) {
164 pr_warn(
"nfhd: unable to get major number\n");
168 for (i = NFHD_DEV_OFFSET; i < 24; i++) {
169 if (nfhd_get_capacity(i, 0, &blocks, &bsize))
171 nfhd_init_one(i, blocks, bsize);
177 static void __exit nfhd_exit(
void)