map: linear_map,
};
-static int __init linear_init(void)
+int __init dm_linear_init(void)
{
int r = dm_register_target(&linear_target);
return r;
}
-static void __exit linear_exit(void)
+void __exit dm_linear_exit(void)
{
int r = dm_unregister_target(&linear_target);
DMERR("linear: unregister failed %d", r);
}
-module_init(linear_init);
-module_exit(linear_exit);
-
-MODULE_AUTHOR("Joe Thornber <thornber@uk.sistina.com>");
-MODULE_DESCRIPTION(DM_NAME ": linear mapping");
-MODULE_LICENSE("GPL");
map: stripe_map,
};
-static int __init stripe_init(void)
+int __init dm_stripe_init(void)
{
int r;
return r;
}
-static void __exit stripe_exit(void)
+void __exit dm_stripe_exit(void)
{
if (dm_unregister_target(&stripe_target))
DMWARN("striped target unregistration failed");
return;
}
-module_init(stripe_init);
-module_exit(stripe_exit);
-
-MODULE_AUTHOR("Joe Thornber <thornber@sistina.com>");
-MODULE_DESCRIPTION(DM_NAME ": striped mapping");
-MODULE_LICENSE("GPL");
int n = t->num_targets;
unsigned long size = (sizeof(struct target) + sizeof(offset_t)) * num;
- n_highs = vmalloc(size);
+ n_highs = (offset_t *) vmalloc(size);
if (!n_highs)
return -ENOMEM;
+ memset(n_highs, 0, size);
+
n_targets = (struct target *) (n_highs + num);
if (n) {
total += t->counts[i];
}
- if (!(indexes = vmalloc(NODE_SIZE * total)))
+ indexes = (offset_t *) vmalloc((unsigned long)NODE_SIZE * total);
+ if (!indexes)
return -ENOMEM;
/* set up internal nodes, bottom-up */
r = local_init();
if (r)
- return r;
+ goto out;
r = dm_target_init();
- if (r) {
- local_exit();
- return r;
- }
+ if (r)
+ goto out_local;
+
+ r = dm_linear_init();
+ if (r)
+ goto out_target;
+
+ r = dm_stripe_init();
+ if (r)
+ goto out_linear;
r = dm_interface_init();
- if (r) {
- dm_target_exit();
- local_exit();
- return r;
- }
+ if (r)
+ goto out_stripe;
return 0;
+
+ out_stripe:
+ dm_stripe_exit();
+ out_linear:
+ dm_linear_exit();
+ out_target:
+ dm_target_exit();
+ out_local:
+ local_exit();
+ out:
+ return r;
}
static void __exit dm_exit(void)
{
dm_interface_exit();
+ dm_stripe_exit();
+ dm_linear_exit();
dm_target_exit();
local_exit();
}
int dm_interface_init(void);
void dm_interface_exit(void);
+/*
+ * Targets for linear and striped mappings
+ */
+int dm_linear_init(void);
+void dm_linear_exit(void);
+int dm_stripe_init(void);
+void dm_stripe_exit(void);
+
+
#endif
if (copy_from_user(&tmp, user, sizeof(tmp)))
return -EFAULT;
- if (!(dmi = (struct dm_ioctl *) vmalloc(tmp.data_size)))
+ dmi = (struct dm_ioctl *) vmalloc(tmp.data_size);
+ if (!dmi)
return -ENOMEM;
if (copy_from_user(dmi, user, tmp.data_size))
r = devfs_generate_path(_dm_misc.devfs_handle, rname + 3,
sizeof rname - 3);
+ if (r == -ENOSYS)
+ return 0; /* devfs not present */
+
if (r < 0) {
DMERR("devfs_generate_path failed for control device");
goto failed;