.. | .. |
---|
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 | /* |
---|