Commit | Line | Data |
---|---|---|
34e49164 C |
1 | static int __init xpram_setup_blkdev(void) |
2 | { | |
3 | unsigned long offset; | |
4 | int i, rc = -ENOMEM; | |
5 | ||
6 | for (i = 0; i < xpram_devs; i++) { | |
7 | struct gendisk *disk = alloc_disk(1); | |
8 | if (!disk) | |
9 | goto out; | |
10 | xpram_disks[i] = disk; | |
11 | } | |
12 | ||
13 | /* | |
14 | * Register xpram major. | |
15 | */ | |
16 | rc = register_blkdev(XPRAM_MAJOR, XPRAM_NAME); | |
17 | if (rc < 0) | |
18 | goto out; | |
19 | ||
20 | devfs_mk_dir("slram"); | |
21 | ||
22 | /* | |
23 | * Assign the other needed values: make request function, sizes and | |
24 | * hardsect size. All the minor devices feature the same value. | |
25 | */ | |
26 | xpram_queue = blk_alloc_queue(GFP_KERNEL); | |
27 | if (!xpram_queue) { | |
28 | rc = -ENOMEM; | |
29 | goto out_unreg; | |
30 | } | |
31 | blk_queue_make_request(xpram_queue, xpram_make_request); | |
32 | blk_queue_hardsect_size(xpram_queue, 4096); | |
33 | ||
34 | /* | |
35 | * Setup device structures. | |
36 | */ | |
37 | offset = 0; | |
38 | for (i = 0; i < xpram_devs; i++) { | |
39 | struct gendisk *disk = xpram_disks[i]; | |
40 | ||
41 | xpram_devices[i].size = xpram_sizes[i] / 4; | |
42 | xpram_devices[i].offset = offset; | |
43 | offset += xpram_devices[i].size; | |
44 | disk->major = XPRAM_MAJOR; | |
45 | disk->first_minor = i; | |
46 | disk->fops = &xpram_devops; | |
47 | disk->private_data = &xpram_devices[i]; | |
48 | disk->queue = xpram_queue; | |
49 | sprintf(disk->disk_name, "slram%d", i); | |
50 | sprintf(disk->devfs_name, "slram/%d", i); | |
51 | set_capacity(disk, xpram_sizes[i] << 1); | |
52 | add_disk(disk); | |
53 | } | |
54 | ||
55 | return 0; | |
56 | out_unreg: | |
57 | devfs_remove("slram"); | |
58 | unregister_blkdev(XPRAM_MAJOR, XPRAM_NAME); | |
59 | out: | |
60 | while (i--) | |
61 | put_disk(xpram_disks[i]); | |
62 | return rc; | |
63 | } |