*
* based on the loop.c code by Theodore Ts'o.
*
- * Copyright (C) 2002-2005 by Herbert Pötzl.
+ * Copyright (C) 2002-2007 by Herbert Pötzl.
* Redistribution of this file is permitted under the
* GNU General Public License.
*
*/
-#include <linux/config.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/file.h>
#include <linux/major.h>
#include <linux/blkdev.h>
-#include <linux/devfs_fs_kernel.h>
#include <linux/vroot.h>
+#include <linux/vs_context.h>
static int max_vroot = 8;
} else
goto out_fput;
- printk(KERN_INFO "vroot[%d]_set_dev: dev=%p[%d,%d]\n",
- vr->vr_number, real_bdev,
- imajor(real_bdev->bd_inode), iminor(real_bdev->bd_inode));
+ vxdprintk(VXD_CBIT(misc, 0),
+ "vroot[%d]_set_dev: dev=" VXF_DEV,
+ vr->vr_number, VXD_DEV(real_bdev));
vr->vr_state = Vr_bound;
error = 0;
real_bdev = vr->vr_device;
- printk(KERN_INFO "vroot[%d]_clr_dev: dev=%p[%d,%d]\n",
- vr->vr_number, real_bdev,
- imajor(real_bdev->bd_inode), iminor(real_bdev->bd_inode));
+ vxdprintk(VXD_CBIT(misc, 0),
+ "vroot[%d]_clr_dev: dev=" VXF_DEV,
+ vr->vr_number, VXD_DEV(real_bdev));
bdput(real_bdev);
vr->vr_state = Vr_unbound;
.ioctl = vr_ioctl,
};
-struct block_device *vroot_get_real_bdev(struct block_device *bdev)
+struct block_device *__vroot_get_real_bdev(struct block_device *bdev)
{
struct inode *inode = bdev->bd_inode;
struct vroot_device *vr;
vr = &vroot_dev[minor];
real_bdev = vr->vr_device;
- printk(KERN_INFO "vroot[%d]_get_real_bdev: dev=%p[%p,%d,%d]\n",
- vr->vr_number, real_bdev, real_bdev->bd_inode,
- imajor(real_bdev->bd_inode), iminor(real_bdev->bd_inode));
+ vxdprintk(VXD_CBIT(misc, 0),
+ "vroot[%d]_get_real_bdev: dev=" VXF_DEV,
+ vr->vr_number, VXD_DEV(real_bdev));
if (vr->vr_state != Vr_bound)
return ERR_PTR(-ENXIO);
int __init vroot_init(void)
{
- int i;
+ int err, i;
if (max_vroot < 1 || max_vroot > 256) {
max_vroot = MAX_VROOT_DEFAULT;
if (register_blkdev(VROOT_MAJOR, "vroot"))
return -EIO;
+ err = -ENOMEM;
vroot_dev = kmalloc(max_vroot * sizeof(struct vroot_device), GFP_KERNEL);
if (!vroot_dev)
goto out_mem1;
goto out_mem3;
}
- devfs_mk_dir("vroot");
-
for (i = 0; i < max_vroot; i++) {
struct vroot_device *vr = &vroot_dev[i];
struct gendisk *disk = disks[i];
disk->first_minor = i;
disk->fops = &vr_fops;
sprintf(disk->disk_name, "vroot%d", i);
- sprintf(disk->devfs_name, "vroot/%d", i);
disk->private_data = vr;
}
+ err = register_vroot_grb(&__vroot_get_real_bdev);
+ if (err)
+ goto out_mem3;
+
for (i = 0; i < max_vroot; i++)
add_disk(disks[i]);
printk(KERN_INFO "vroot: loaded (max %d devices)\n", max_vroot);
out_mem1:
unregister_blkdev(VROOT_MAJOR, "vroot");
printk(KERN_ERR "vroot: ran out of memory\n");
- return -ENOMEM;
+ return err;
}
void vroot_exit(void)
{
int i;
+ if (unregister_vroot_grb(&__vroot_get_real_bdev))
+ printk(KERN_WARNING "vroot: cannot unregister grb\n");
+
for (i = 0; i < max_vroot; i++) {
del_gendisk(disks[i]);
put_disk(disks[i]);
}
- devfs_remove("vroot");
if (unregister_blkdev(VROOT_MAJOR, "vroot"))
printk(KERN_WARNING "vroot: cannot unregister blkdev\n");
module_init(vroot_init);
module_exit(vroot_exit);
+#ifndef MODULE
+
+static int __init max_vroot_setup(char *str)
+{
+ max_vroot = simple_strtol(str, NULL, 0);
+ return 1;
+}
+
+__setup("max_vroot=", max_vroot_setup);
+
+#endif
+