hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/block/brd.c
....@@ -80,11 +80,9 @@
8080 }
8181
8282 /*
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.
8684 */
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)
8886 {
8987 pgoff_t idx;
9088 struct page *page;
....@@ -92,7 +90,7 @@
9290
9391 page = brd_lookup_page(brd, sector);
9492 if (page)
95
- return page;
93
+ return 0;
9694
9795 /*
9896 * Must use NOIO because we don't want to recurse back into the
....@@ -101,11 +99,11 @@
10199 gfp_flags = GFP_NOIO | __GFP_ZERO | __GFP_HIGHMEM;
102100 page = alloc_page(gfp_flags);
103101 if (!page)
104
- return NULL;
102
+ return -ENOMEM;
105103
106104 if (radix_tree_preload(GFP_NOIO)) {
107105 __free_page(page);
108
- return NULL;
106
+ return -ENOMEM;
109107 }
110108
111109 spin_lock(&brd->brd_lock);
....@@ -120,8 +118,7 @@
120118 spin_unlock(&brd->brd_lock);
121119
122120 radix_tree_preload_end();
123
-
124
- return page;
121
+ return 0;
125122 }
126123
127124 /*
....@@ -174,16 +171,17 @@
174171 {
175172 unsigned int offset = (sector & (PAGE_SECTORS-1)) << SECTOR_SHIFT;
176173 size_t copy;
174
+ int ret;
177175
178176 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;
181180 if (copy < n) {
182181 sector += copy >> SECTOR_SHIFT;
183
- if (!brd_insert_page(brd, sector))
184
- return -ENOSPC;
182
+ ret = brd_insert_page(brd, sector);
185183 }
186
- return 0;
184
+ return ret;
187185 }
188186
189187 /*