~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to drivers/block/brd.c

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Ram backed block device driver.
 
3
 *
 
4
 * Copyright (C) 2007 Nick Piggin
 
5
 * Copyright (C) 2007 Novell Inc.
 
6
 *
 
7
 * Parts derived from drivers/block/rd.c, and drivers/block/loop.c, copyright
 
8
 * of their respective owners.
 
9
 */
 
10
 
 
11
#include <linux/init.h>
 
12
#include <linux/module.h>
 
13
#include <linux/moduleparam.h>
 
14
#include <linux/major.h>
 
15
#include <linux/blkdev.h>
 
16
#include <linux/bio.h>
 
17
#include <linux/highmem.h>
 
18
#include <linux/mutex.h>
 
19
#include <linux/radix-tree.h>
 
20
#include <linux/buffer_head.h> /* invalidate_bh_lrus() */
 
21
#include <linux/slab.h>
 
22
 
 
23
#include <asm/uaccess.h>
 
24
 
 
25
#define SECTOR_SHIFT            9
 
26
#define PAGE_SECTORS_SHIFT      (PAGE_SHIFT - SECTOR_SHIFT)
 
27
#define PAGE_SECTORS            (1 << PAGE_SECTORS_SHIFT)
 
28
 
 
29
/*
 
30
 * Each block ramdisk device has a radix_tree brd_pages of pages that stores
 
31
 * the pages containing the block device's contents. A brd page's ->index is
 
32
 * its offset in PAGE_SIZE units. This is similar to, but in no way connected
 
33
 * with, the kernel's pagecache or buffer cache (which sit above our block
 
34
 * device).
 
35
 */
 
36
struct brd_device {
 
37
        int             brd_number;
 
38
 
 
39
        struct request_queue    *brd_queue;
 
40
        struct gendisk          *brd_disk;
 
41
        struct list_head        brd_list;
 
42
 
 
43
        /*
 
44
         * Backing store of pages and lock to protect it. This is the contents
 
45
         * of the block device.
 
46
         */
 
47
        spinlock_t              brd_lock;
 
48
        struct radix_tree_root  brd_pages;
 
49
};
 
50
 
 
51
/*
 
52
 * Look up and return a brd's page for a given sector.
 
53
 */
 
54
static DEFINE_MUTEX(brd_mutex);
 
55
static struct page *brd_lookup_page(struct brd_device *brd, sector_t sector)
 
56
{
 
57
        pgoff_t idx;
 
58
        struct page *page;
 
59
 
 
60
        /*
 
61
         * The page lifetime is protected by the fact that we have opened the
 
62
         * device node -- brd pages will never be deleted under us, so we
 
63
         * don't need any further locking or refcounting.
 
64
         *
 
65
         * This is strictly true for the radix-tree nodes as well (ie. we
 
66
         * don't actually need the rcu_read_lock()), however that is not a
 
67
         * documented feature of the radix-tree API so it is better to be
 
68
         * safe here (we don't have total exclusion from radix tree updates
 
69
         * here, only deletes).
 
70
         */
 
71
        rcu_read_lock();
 
72
        idx = sector >> PAGE_SECTORS_SHIFT; /* sector to page index */
 
73
        page = radix_tree_lookup(&brd->brd_pages, idx);
 
74
        rcu_read_unlock();
 
75
 
 
76
        BUG_ON(page && page->index != idx);
 
77
 
 
78
        return page;
 
79
}
 
80
 
 
81
/*
 
82
 * Look up and return a brd's page for a given sector.
 
83
 * If one does not exist, allocate an empty page, and insert that. Then
 
84
 * return it.
 
85
 */
 
86
static struct page *brd_insert_page(struct brd_device *brd, sector_t sector)
 
87
{
 
88
        pgoff_t idx;
 
89
        struct page *page;
 
90
        gfp_t gfp_flags;
 
91
 
 
92
        page = brd_lookup_page(brd, sector);
 
93
        if (page)
 
94
                return page;
 
95
 
 
96
        /*
 
97
         * Must use NOIO because we don't want to recurse back into the
 
98
         * block or filesystem layers from page reclaim.
 
99
         *
 
100
         * Cannot support XIP and highmem, because our ->direct_access
 
101
         * routine for XIP must return memory that is always addressable.
 
102
         * If XIP was reworked to use pfns and kmap throughout, this
 
103
         * restriction might be able to be lifted.
 
104
         */
 
105
        gfp_flags = GFP_NOIO | __GFP_ZERO;
 
106
#ifndef CONFIG_BLK_DEV_XIP
 
107
        gfp_flags |= __GFP_HIGHMEM;
 
108
#endif
 
109
        page = alloc_page(gfp_flags);
 
110
        if (!page)
 
111
                return NULL;
 
112
 
 
113
        if (radix_tree_preload(GFP_NOIO)) {
 
114
                __free_page(page);
 
115
                return NULL;
 
116
        }
 
117
 
 
118
        spin_lock(&brd->brd_lock);
 
119
        idx = sector >> PAGE_SECTORS_SHIFT;
 
120
        if (radix_tree_insert(&brd->brd_pages, idx, page)) {
 
121
                __free_page(page);
 
122
                page = radix_tree_lookup(&brd->brd_pages, idx);
 
123
                BUG_ON(!page);
 
124
                BUG_ON(page->index != idx);
 
125
        } else
 
126
                page->index = idx;
 
127
        spin_unlock(&brd->brd_lock);
 
128
 
 
129
        radix_tree_preload_end();
 
130
 
 
131
        return page;
 
132
}
 
133
 
 
134
static void brd_free_page(struct brd_device *brd, sector_t sector)
 
135
{
 
136
        struct page *page;
 
137
        pgoff_t idx;
 
138
 
 
139
        spin_lock(&brd->brd_lock);
 
140
        idx = sector >> PAGE_SECTORS_SHIFT;
 
141
        page = radix_tree_delete(&brd->brd_pages, idx);
 
142
        spin_unlock(&brd->brd_lock);
 
143
        if (page)
 
144
                __free_page(page);
 
145
}
 
146
 
 
147
static void brd_zero_page(struct brd_device *brd, sector_t sector)
 
148
{
 
149
        struct page *page;
 
150
 
 
151
        page = brd_lookup_page(brd, sector);
 
152
        if (page)
 
153
                clear_highpage(page);
 
154
}
 
155
 
 
156
/*
 
157
 * Free all backing store pages and radix tree. This must only be called when
 
158
 * there are no other users of the device.
 
159
 */
 
160
#define FREE_BATCH 16
 
161
static void brd_free_pages(struct brd_device *brd)
 
162
{
 
163
        unsigned long pos = 0;
 
164
        struct page *pages[FREE_BATCH];
 
165
        int nr_pages;
 
166
 
 
167
        do {
 
168
                int i;
 
169
 
 
170
                nr_pages = radix_tree_gang_lookup(&brd->brd_pages,
 
171
                                (void **)pages, pos, FREE_BATCH);
 
172
 
 
173
                for (i = 0; i < nr_pages; i++) {
 
174
                        void *ret;
 
175
 
 
176
                        BUG_ON(pages[i]->index < pos);
 
177
                        pos = pages[i]->index;
 
178
                        ret = radix_tree_delete(&brd->brd_pages, pos);
 
179
                        BUG_ON(!ret || ret != pages[i]);
 
180
                        __free_page(pages[i]);
 
181
                }
 
182
 
 
183
                pos++;
 
184
 
 
185
                /*
 
186
                 * This assumes radix_tree_gang_lookup always returns as
 
187
                 * many pages as possible. If the radix-tree code changes,
 
188
                 * so will this have to.
 
189
                 */
 
190
        } while (nr_pages == FREE_BATCH);
 
191
}
 
192
 
 
193
/*
 
194
 * copy_to_brd_setup must be called before copy_to_brd. It may sleep.
 
195
 */
 
196
static int copy_to_brd_setup(struct brd_device *brd, sector_t sector, size_t n)
 
197
{
 
198
        unsigned int offset = (sector & (PAGE_SECTORS-1)) << SECTOR_SHIFT;
 
199
        size_t copy;
 
200
 
 
201
        copy = min_t(size_t, n, PAGE_SIZE - offset);
 
202
        if (!brd_insert_page(brd, sector))
 
203
                return -ENOMEM;
 
204
        if (copy < n) {
 
205
                sector += copy >> SECTOR_SHIFT;
 
206
                if (!brd_insert_page(brd, sector))
 
207
                        return -ENOMEM;
 
208
        }
 
209
        return 0;
 
210
}
 
211
 
 
212
static void discard_from_brd(struct brd_device *brd,
 
213
                        sector_t sector, size_t n)
 
214
{
 
215
        while (n >= PAGE_SIZE) {
 
216
                /*
 
217
                 * Don't want to actually discard pages here because
 
218
                 * re-allocating the pages can result in writeback
 
219
                 * deadlocks under heavy load.
 
220
                 */
 
221
                if (0)
 
222
                        brd_free_page(brd, sector);
 
223
                else
 
224
                        brd_zero_page(brd, sector);
 
225
                sector += PAGE_SIZE >> SECTOR_SHIFT;
 
226
                n -= PAGE_SIZE;
 
227
        }
 
228
}
 
229
 
 
230
/*
 
231
 * Copy n bytes from src to the brd starting at sector. Does not sleep.
 
232
 */
 
233
static void copy_to_brd(struct brd_device *brd, const void *src,
 
234
                        sector_t sector, size_t n)
 
235
{
 
236
        struct page *page;
 
237
        void *dst;
 
238
        unsigned int offset = (sector & (PAGE_SECTORS-1)) << SECTOR_SHIFT;
 
239
        size_t copy;
 
240
 
 
241
        copy = min_t(size_t, n, PAGE_SIZE - offset);
 
242
        page = brd_lookup_page(brd, sector);
 
243
        BUG_ON(!page);
 
244
 
 
245
        dst = kmap_atomic(page, KM_USER1);
 
246
        memcpy(dst + offset, src, copy);
 
247
        kunmap_atomic(dst, KM_USER1);
 
248
 
 
249
        if (copy < n) {
 
250
                src += copy;
 
251
                sector += copy >> SECTOR_SHIFT;
 
252
                copy = n - copy;
 
253
                page = brd_lookup_page(brd, sector);
 
254
                BUG_ON(!page);
 
255
 
 
256
                dst = kmap_atomic(page, KM_USER1);
 
257
                memcpy(dst, src, copy);
 
258
                kunmap_atomic(dst, KM_USER1);
 
259
        }
 
260
}
 
261
 
 
262
/*
 
263
 * Copy n bytes to dst from the brd starting at sector. Does not sleep.
 
264
 */
 
265
static void copy_from_brd(void *dst, struct brd_device *brd,
 
266
                        sector_t sector, size_t n)
 
267
{
 
268
        struct page *page;
 
269
        void *src;
 
270
        unsigned int offset = (sector & (PAGE_SECTORS-1)) << SECTOR_SHIFT;
 
271
        size_t copy;
 
272
 
 
273
        copy = min_t(size_t, n, PAGE_SIZE - offset);
 
274
        page = brd_lookup_page(brd, sector);
 
275
        if (page) {
 
276
                src = kmap_atomic(page, KM_USER1);
 
277
                memcpy(dst, src + offset, copy);
 
278
                kunmap_atomic(src, KM_USER1);
 
279
        } else
 
280
                memset(dst, 0, copy);
 
281
 
 
282
        if (copy < n) {
 
283
                dst += copy;
 
284
                sector += copy >> SECTOR_SHIFT;
 
285
                copy = n - copy;
 
286
                page = brd_lookup_page(brd, sector);
 
287
                if (page) {
 
288
                        src = kmap_atomic(page, KM_USER1);
 
289
                        memcpy(dst, src, copy);
 
290
                        kunmap_atomic(src, KM_USER1);
 
291
                } else
 
292
                        memset(dst, 0, copy);
 
293
        }
 
294
}
 
295
 
 
296
/*
 
297
 * Process a single bvec of a bio.
 
298
 */
 
299
static int brd_do_bvec(struct brd_device *brd, struct page *page,
 
300
                        unsigned int len, unsigned int off, int rw,
 
301
                        sector_t sector)
 
302
{
 
303
        void *mem;
 
304
        int err = 0;
 
305
 
 
306
        if (rw != READ) {
 
307
                err = copy_to_brd_setup(brd, sector, len);
 
308
                if (err)
 
309
                        goto out;
 
310
        }
 
311
 
 
312
        mem = kmap_atomic(page, KM_USER0);
 
313
        if (rw == READ) {
 
314
                copy_from_brd(mem + off, brd, sector, len);
 
315
                flush_dcache_page(page);
 
316
        } else {
 
317
                flush_dcache_page(page);
 
318
                copy_to_brd(brd, mem + off, sector, len);
 
319
        }
 
320
        kunmap_atomic(mem, KM_USER0);
 
321
 
 
322
out:
 
323
        return err;
 
324
}
 
325
 
 
326
static void brd_make_request(struct request_queue *q, struct bio *bio)
 
327
{
 
328
        struct block_device *bdev = bio->bi_bdev;
 
329
        struct brd_device *brd = bdev->bd_disk->private_data;
 
330
        int rw;
 
331
        struct bio_vec *bvec;
 
332
        sector_t sector;
 
333
        int i;
 
334
        int err = -EIO;
 
335
 
 
336
        sector = bio->bi_sector;
 
337
        if (sector + (bio->bi_size >> SECTOR_SHIFT) >
 
338
                                                get_capacity(bdev->bd_disk))
 
339
                goto out;
 
340
 
 
341
        if (unlikely(bio->bi_rw & REQ_DISCARD)) {
 
342
                err = 0;
 
343
                discard_from_brd(brd, sector, bio->bi_size);
 
344
                goto out;
 
345
        }
 
346
 
 
347
        rw = bio_rw(bio);
 
348
        if (rw == READA)
 
349
                rw = READ;
 
350
 
 
351
        bio_for_each_segment(bvec, bio, i) {
 
352
                unsigned int len = bvec->bv_len;
 
353
                err = brd_do_bvec(brd, bvec->bv_page, len,
 
354
                                        bvec->bv_offset, rw, sector);
 
355
                if (err)
 
356
                        break;
 
357
                sector += len >> SECTOR_SHIFT;
 
358
        }
 
359
 
 
360
out:
 
361
        bio_endio(bio, err);
 
362
}
 
363
 
 
364
#ifdef CONFIG_BLK_DEV_XIP
 
365
static int brd_direct_access(struct block_device *bdev, sector_t sector,
 
366
                        void **kaddr, unsigned long *pfn)
 
367
{
 
368
        struct brd_device *brd = bdev->bd_disk->private_data;
 
369
        struct page *page;
 
370
 
 
371
        if (!brd)
 
372
                return -ENODEV;
 
373
        if (sector & (PAGE_SECTORS-1))
 
374
                return -EINVAL;
 
375
        if (sector + PAGE_SECTORS > get_capacity(bdev->bd_disk))
 
376
                return -ERANGE;
 
377
        page = brd_insert_page(brd, sector);
 
378
        if (!page)
 
379
                return -ENOMEM;
 
380
        *kaddr = page_address(page);
 
381
        *pfn = page_to_pfn(page);
 
382
 
 
383
        return 0;
 
384
}
 
385
#endif
 
386
 
 
387
static int brd_ioctl(struct block_device *bdev, fmode_t mode,
 
388
                        unsigned int cmd, unsigned long arg)
 
389
{
 
390
        int error;
 
391
        struct brd_device *brd = bdev->bd_disk->private_data;
 
392
 
 
393
        if (cmd != BLKFLSBUF)
 
394
                return -ENOTTY;
 
395
 
 
396
        /*
 
397
         * ram device BLKFLSBUF has special semantics, we want to actually
 
398
         * release and destroy the ramdisk data.
 
399
         */
 
400
        mutex_lock(&brd_mutex);
 
401
        mutex_lock(&bdev->bd_mutex);
 
402
        error = -EBUSY;
 
403
        if (bdev->bd_openers <= 1) {
 
404
                /*
 
405
                 * Invalidate the cache first, so it isn't written
 
406
                 * back to the device.
 
407
                 *
 
408
                 * Another thread might instantiate more buffercache here,
 
409
                 * but there is not much we can do to close that race.
 
410
                 */
 
411
                invalidate_bh_lrus();
 
412
                truncate_inode_pages(bdev->bd_inode->i_mapping, 0);
 
413
                brd_free_pages(brd);
 
414
                error = 0;
 
415
        }
 
416
        mutex_unlock(&bdev->bd_mutex);
 
417
        mutex_unlock(&brd_mutex);
 
418
 
 
419
        return error;
 
420
}
 
421
 
 
422
static const struct block_device_operations brd_fops = {
 
423
        .owner =                THIS_MODULE,
 
424
        .ioctl =                brd_ioctl,
 
425
#ifdef CONFIG_BLK_DEV_XIP
 
426
        .direct_access =        brd_direct_access,
 
427
#endif
 
428
};
 
429
 
 
430
/*
 
431
 * And now the modules code and kernel interface.
 
432
 */
 
433
static int rd_nr;
 
434
int rd_size = CONFIG_BLK_DEV_RAM_SIZE;
 
435
static int max_part;
 
436
static int part_shift;
 
437
module_param(rd_nr, int, S_IRUGO);
 
438
MODULE_PARM_DESC(rd_nr, "Maximum number of brd devices");
 
439
module_param(rd_size, int, S_IRUGO);
 
440
MODULE_PARM_DESC(rd_size, "Size of each RAM disk in kbytes.");
 
441
module_param(max_part, int, S_IRUGO);
 
442
MODULE_PARM_DESC(max_part, "Maximum number of partitions per RAM disk");
 
443
MODULE_LICENSE("GPL");
 
444
MODULE_ALIAS_BLOCKDEV_MAJOR(RAMDISK_MAJOR);
 
445
MODULE_ALIAS("rd");
 
446
 
 
447
#ifndef MODULE
 
448
/* Legacy boot options - nonmodular */
 
449
static int __init ramdisk_size(char *str)
 
450
{
 
451
        rd_size = simple_strtol(str, NULL, 0);
 
452
        return 1;
 
453
}
 
454
__setup("ramdisk_size=", ramdisk_size);
 
455
#endif
 
456
 
 
457
/*
 
458
 * The device scheme is derived from loop.c. Keep them in synch where possible
 
459
 * (should share code eventually).
 
460
 */
 
461
static LIST_HEAD(brd_devices);
 
462
static DEFINE_MUTEX(brd_devices_mutex);
 
463
 
 
464
static struct brd_device *brd_alloc(int i)
 
465
{
 
466
        struct brd_device *brd;
 
467
        struct gendisk *disk;
 
468
 
 
469
        brd = kzalloc(sizeof(*brd), GFP_KERNEL);
 
470
        if (!brd)
 
471
                goto out;
 
472
        brd->brd_number         = i;
 
473
        spin_lock_init(&brd->brd_lock);
 
474
        INIT_RADIX_TREE(&brd->brd_pages, GFP_ATOMIC);
 
475
 
 
476
        brd->brd_queue = blk_alloc_queue(GFP_KERNEL);
 
477
        if (!brd->brd_queue)
 
478
                goto out_free_dev;
 
479
        blk_queue_make_request(brd->brd_queue, brd_make_request);
 
480
        blk_queue_max_hw_sectors(brd->brd_queue, 1024);
 
481
        blk_queue_bounce_limit(brd->brd_queue, BLK_BOUNCE_ANY);
 
482
 
 
483
        brd->brd_queue->limits.discard_granularity = PAGE_SIZE;
 
484
        brd->brd_queue->limits.max_discard_sectors = UINT_MAX;
 
485
        brd->brd_queue->limits.discard_zeroes_data = 1;
 
486
        queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, brd->brd_queue);
 
487
 
 
488
        disk = brd->brd_disk = alloc_disk(1 << part_shift);
 
489
        if (!disk)
 
490
                goto out_free_queue;
 
491
        disk->major             = RAMDISK_MAJOR;
 
492
        disk->first_minor       = i << part_shift;
 
493
        disk->fops              = &brd_fops;
 
494
        disk->private_data      = brd;
 
495
        disk->queue             = brd->brd_queue;
 
496
        disk->flags |= GENHD_FL_SUPPRESS_PARTITION_INFO;
 
497
        sprintf(disk->disk_name, "ram%d", i);
 
498
        set_capacity(disk, rd_size * 2);
 
499
 
 
500
        return brd;
 
501
 
 
502
out_free_queue:
 
503
        blk_cleanup_queue(brd->brd_queue);
 
504
out_free_dev:
 
505
        kfree(brd);
 
506
out:
 
507
        return NULL;
 
508
}
 
509
 
 
510
static void brd_free(struct brd_device *brd)
 
511
{
 
512
        put_disk(brd->brd_disk);
 
513
        blk_cleanup_queue(brd->brd_queue);
 
514
        brd_free_pages(brd);
 
515
        kfree(brd);
 
516
}
 
517
 
 
518
static struct brd_device *brd_init_one(int i)
 
519
{
 
520
        struct brd_device *brd;
 
521
 
 
522
        list_for_each_entry(brd, &brd_devices, brd_list) {
 
523
                if (brd->brd_number == i)
 
524
                        goto out;
 
525
        }
 
526
 
 
527
        brd = brd_alloc(i);
 
528
        if (brd) {
 
529
                add_disk(brd->brd_disk);
 
530
                list_add_tail(&brd->brd_list, &brd_devices);
 
531
        }
 
532
out:
 
533
        return brd;
 
534
}
 
535
 
 
536
static void brd_del_one(struct brd_device *brd)
 
537
{
 
538
        list_del(&brd->brd_list);
 
539
        del_gendisk(brd->brd_disk);
 
540
        brd_free(brd);
 
541
}
 
542
 
 
543
static struct kobject *brd_probe(dev_t dev, int *part, void *data)
 
544
{
 
545
        struct brd_device *brd;
 
546
        struct kobject *kobj;
 
547
 
 
548
        mutex_lock(&brd_devices_mutex);
 
549
        brd = brd_init_one(MINOR(dev) >> part_shift);
 
550
        kobj = brd ? get_disk(brd->brd_disk) : ERR_PTR(-ENOMEM);
 
551
        mutex_unlock(&brd_devices_mutex);
 
552
 
 
553
        *part = 0;
 
554
        return kobj;
 
555
}
 
556
 
 
557
static int __init brd_init(void)
 
558
{
 
559
        int i, nr;
 
560
        unsigned long range;
 
561
        struct brd_device *brd, *next;
 
562
 
 
563
        /*
 
564
         * brd module now has a feature to instantiate underlying device
 
565
         * structure on-demand, provided that there is an access dev node.
 
566
         * However, this will not work well with user space tool that doesn't
 
567
         * know about such "feature".  In order to not break any existing
 
568
         * tool, we do the following:
 
569
         *
 
570
         * (1) if rd_nr is specified, create that many upfront, and this
 
571
         *     also becomes a hard limit.
 
572
         * (2) if rd_nr is not specified, create CONFIG_BLK_DEV_RAM_COUNT
 
573
         *     (default 16) rd device on module load, user can further
 
574
         *     extend brd device by create dev node themselves and have
 
575
         *     kernel automatically instantiate actual device on-demand.
 
576
         */
 
577
 
 
578
        part_shift = 0;
 
579
        if (max_part > 0) {
 
580
                part_shift = fls(max_part);
 
581
 
 
582
                /*
 
583
                 * Adjust max_part according to part_shift as it is exported
 
584
                 * to user space so that user can decide correct minor number
 
585
                 * if [s]he want to create more devices.
 
586
                 *
 
587
                 * Note that -1 is required because partition 0 is reserved
 
588
                 * for the whole disk.
 
589
                 */
 
590
                max_part = (1UL << part_shift) - 1;
 
591
        }
 
592
 
 
593
        if ((1UL << part_shift) > DISK_MAX_PARTS)
 
594
                return -EINVAL;
 
595
 
 
596
        if (rd_nr > 1UL << (MINORBITS - part_shift))
 
597
                return -EINVAL;
 
598
 
 
599
        if (rd_nr) {
 
600
                nr = rd_nr;
 
601
                range = rd_nr << part_shift;
 
602
        } else {
 
603
                nr = CONFIG_BLK_DEV_RAM_COUNT;
 
604
                range = 1UL << MINORBITS;
 
605
        }
 
606
 
 
607
        if (register_blkdev(RAMDISK_MAJOR, "ramdisk"))
 
608
                return -EIO;
 
609
 
 
610
        for (i = 0; i < nr; i++) {
 
611
                brd = brd_alloc(i);
 
612
                if (!brd)
 
613
                        goto out_free;
 
614
                list_add_tail(&brd->brd_list, &brd_devices);
 
615
        }
 
616
 
 
617
        /* point of no return */
 
618
 
 
619
        list_for_each_entry(brd, &brd_devices, brd_list)
 
620
                add_disk(brd->brd_disk);
 
621
 
 
622
        blk_register_region(MKDEV(RAMDISK_MAJOR, 0), range,
 
623
                                  THIS_MODULE, brd_probe, NULL, NULL);
 
624
 
 
625
        printk(KERN_INFO "brd: module loaded\n");
 
626
        return 0;
 
627
 
 
628
out_free:
 
629
        list_for_each_entry_safe(brd, next, &brd_devices, brd_list) {
 
630
                list_del(&brd->brd_list);
 
631
                brd_free(brd);
 
632
        }
 
633
        unregister_blkdev(RAMDISK_MAJOR, "ramdisk");
 
634
 
 
635
        return -ENOMEM;
 
636
}
 
637
 
 
638
static void __exit brd_exit(void)
 
639
{
 
640
        unsigned long range;
 
641
        struct brd_device *brd, *next;
 
642
 
 
643
        range = rd_nr ? rd_nr << part_shift : 1UL << MINORBITS;
 
644
 
 
645
        list_for_each_entry_safe(brd, next, &brd_devices, brd_list)
 
646
                brd_del_one(brd);
 
647
 
 
648
        blk_unregister_region(MKDEV(RAMDISK_MAJOR, 0), range);
 
649
        unregister_blkdev(RAMDISK_MAJOR, "ramdisk");
 
650
}
 
651
 
 
652
module_init(brd_init);
 
653
module_exit(brd_exit);
 
654