1 #include <linux/module.h>
2 #include <linux/slab.h>
3 #include "blkback-pagemap.h"
5 static int blkback_pagemap_size;
6 static struct blkback_pagemap *blkback_pagemap;
9 blkback_pagemap_entry_clear(struct blkback_pagemap *map)
11 static struct blkback_pagemap zero;
12 return !memcmp(map, &zero, sizeof(zero));
16 blkback_pagemap_init(int pages)
18 blkback_pagemap = kzalloc(pages * sizeof(struct blkback_pagemap),
23 blkback_pagemap_size = pages;
26 EXPORT_SYMBOL_GPL(blkback_pagemap_init);
29 blkback_pagemap_set(int idx, struct page *page,
30 domid_t domid, busid_t busid, grant_ref_t gref)
32 struct blkback_pagemap *entry;
34 BUG_ON(!blkback_pagemap);
35 BUG_ON(idx >= blkback_pagemap_size);
38 set_page_private(page, idx);
40 entry = blkback_pagemap + idx;
41 if (!blkback_pagemap_entry_clear(entry)) {
42 pr_emerg("overwriting pagemap %d: d %u b %u g %u\n",
43 idx, entry->domid, entry->busid, entry->gref);
51 EXPORT_SYMBOL_GPL(blkback_pagemap_set);
54 blkback_pagemap_clear(struct page *page)
57 struct blkback_pagemap *entry;
59 idx = (int)page_private(page);
61 BUG_ON(!blkback_pagemap);
62 BUG_ON(!PageBlkback(page));
63 BUG_ON(idx >= blkback_pagemap_size);
65 entry = blkback_pagemap + idx;
66 if (blkback_pagemap_entry_clear(entry)) {
67 pr_emerg("clearing empty pagemap %d\n", idx);
71 memset(entry, 0, sizeof(*entry));
73 EXPORT_SYMBOL_GPL(blkback_pagemap_clear);
75 struct blkback_pagemap
76 blkback_pagemap_read(struct page *page)
79 struct blkback_pagemap *entry;
81 idx = (int)page_private(page);
83 BUG_ON(!blkback_pagemap);
84 BUG_ON(!PageBlkback(page));
85 BUG_ON(idx >= blkback_pagemap_size);
87 entry = blkback_pagemap + idx;
88 if (blkback_pagemap_entry_clear(entry)) {
89 pr_emerg("reading empty pagemap %d\n", idx);
95 EXPORT_SYMBOL(blkback_pagemap_read);
97 MODULE_LICENSE("Dual BSD/GPL");