| .. | .. |
|---|
| 80 | 80 | } |
|---|
| 81 | 81 | |
|---|
| 82 | 82 | /* |
|---|
| 83 | | - * Look up and return a brd's page for a given sector. |
|---|
| 84 | | - * If one does not exist, allocate an empty page, and insert that. Then |
|---|
| 85 | | - * return it. |
|---|
| 83 | + * Insert a new page for a given sector, if one does not already exist. |
|---|
| 86 | 84 | */ |
|---|
| 87 | | -static struct page *brd_insert_page(struct brd_device *brd, sector_t sector) |
|---|
| 85 | +static int brd_insert_page(struct brd_device *brd, sector_t sector) |
|---|
| 88 | 86 | { |
|---|
| 89 | 87 | pgoff_t idx; |
|---|
| 90 | 88 | struct page *page; |
|---|
| .. | .. |
|---|
| 92 | 90 | |
|---|
| 93 | 91 | page = brd_lookup_page(brd, sector); |
|---|
| 94 | 92 | if (page) |
|---|
| 95 | | - return page; |
|---|
| 93 | + return 0; |
|---|
| 96 | 94 | |
|---|
| 97 | 95 | /* |
|---|
| 98 | 96 | * Must use NOIO because we don't want to recurse back into the |
|---|
| .. | .. |
|---|
| 101 | 99 | gfp_flags = GFP_NOIO | __GFP_ZERO | __GFP_HIGHMEM; |
|---|
| 102 | 100 | page = alloc_page(gfp_flags); |
|---|
| 103 | 101 | if (!page) |
|---|
| 104 | | - return NULL; |
|---|
| 102 | + return -ENOMEM; |
|---|
| 105 | 103 | |
|---|
| 106 | 104 | if (radix_tree_preload(GFP_NOIO)) { |
|---|
| 107 | 105 | __free_page(page); |
|---|
| 108 | | - return NULL; |
|---|
| 106 | + return -ENOMEM; |
|---|
| 109 | 107 | } |
|---|
| 110 | 108 | |
|---|
| 111 | 109 | spin_lock(&brd->brd_lock); |
|---|
| .. | .. |
|---|
| 120 | 118 | spin_unlock(&brd->brd_lock); |
|---|
| 121 | 119 | |
|---|
| 122 | 120 | radix_tree_preload_end(); |
|---|
| 123 | | - |
|---|
| 124 | | - return page; |
|---|
| 121 | + return 0; |
|---|
| 125 | 122 | } |
|---|
| 126 | 123 | |
|---|
| 127 | 124 | /* |
|---|
| .. | .. |
|---|
| 174 | 171 | { |
|---|
| 175 | 172 | unsigned int offset = (sector & (PAGE_SECTORS-1)) << SECTOR_SHIFT; |
|---|
| 176 | 173 | size_t copy; |
|---|
| 174 | + int ret; |
|---|
| 177 | 175 | |
|---|
| 178 | 176 | copy = min_t(size_t, n, PAGE_SIZE - offset); |
|---|
| 179 | | - if (!brd_insert_page(brd, sector)) |
|---|
| 180 | | - return -ENOSPC; |
|---|
| 177 | + ret = brd_insert_page(brd, sector); |
|---|
| 178 | + if (ret) |
|---|
| 179 | + return ret; |
|---|
| 181 | 180 | if (copy < n) { |
|---|
| 182 | 181 | sector += copy >> SECTOR_SHIFT; |
|---|
| 183 | | - if (!brd_insert_page(brd, sector)) |
|---|
| 184 | | - return -ENOSPC; |
|---|
| 182 | + ret = brd_insert_page(brd, sector); |
|---|
| 185 | 183 | } |
|---|
| 186 | | - return 0; |
|---|
| 184 | + return ret; |
|---|
| 187 | 185 | } |
|---|
| 188 | 186 | |
|---|
| 189 | 187 | /* |
|---|