void fs_inode_init_kdev(struct inode *node) { if(node->phys_dev && !node->kdev) { node->kdev = dm_device_get(MAJOR(node->phys_dev)); if(node->kdev && node->kdev->create) node->kdev->create(node); } }
void blockdev_register_partition(struct inode *master, struct inode *part, uint64_t partbegin, uint64_t partlen) { struct blockdev *mbd = master->devdata; struct blockdev *pbd = kmalloc(sizeof(struct blockdev)); pbd->ctl = mbd->ctl; pbd->partbegin = partbegin; pbd->partlen = partlen; part->devdata = pbd; part->phys_dev = master->phys_dev; part->kdev = dm_device_get(block_major); }
int blockdev_register(struct inode *node, struct blockctl *ctl) { struct blockdev *bd = kmalloc(sizeof(struct blockdev)); mutex_create(&ctl->cachelock, 0); hash_create(&ctl->cache, 0, 0x4000); mpscq_create(&ctl->queue, 1000); bd->ctl = ctl; int num = atomic_fetch_add(&next_minor, 1); node->devdata = bd; node->phys_dev = GETDEV(block_major, num); node->kdev = dm_device_get(block_major); kthread_create(&ctl->elevator, "[kelevator]", 0, block_elevator_main, node); char name[64]; snprintf(name, 64, "/dev/bcache-%d", num); kerfs_register_parameter(name, ctl, 0, 0, kerfs_block_cache_report); return num; }