hc
2024-05-10 9999e48639b3cecb08ffb37358bcba3b48161b29
kernel/fs/nilfs2/btnode.c
....@@ -20,6 +20,23 @@
2020 #include "page.h"
2121 #include "btnode.h"
2222
23
+
24
+/**
25
+ * nilfs_init_btnc_inode - initialize B-tree node cache inode
26
+ * @btnc_inode: inode to be initialized
27
+ *
28
+ * nilfs_init_btnc_inode() sets up an inode for B-tree node cache.
29
+ */
30
+void nilfs_init_btnc_inode(struct inode *btnc_inode)
31
+{
32
+ struct nilfs_inode_info *ii = NILFS_I(btnc_inode);
33
+
34
+ btnc_inode->i_mode = S_IFREG;
35
+ ii->i_flags = 0;
36
+ memset(&ii->i_bmap_data, 0, sizeof(struct nilfs_bmap));
37
+ mapping_set_gfp_mask(btnc_inode->i_mapping, GFP_NOFS);
38
+}
39
+
2340 void nilfs_btnode_cache_clear(struct address_space *btnc)
2441 {
2542 invalidate_mapping_pages(btnc, 0, -1);
....@@ -29,7 +46,7 @@
2946 struct buffer_head *
3047 nilfs_btnode_create_block(struct address_space *btnc, __u64 blocknr)
3148 {
32
- struct inode *inode = NILFS_BTNC_I(btnc);
49
+ struct inode *inode = btnc->host;
3350 struct buffer_head *bh;
3451
3552 bh = nilfs_grab_buffer(inode, btnc, blocknr, BIT(BH_NILFS_Node));
....@@ -57,7 +74,7 @@
5774 struct buffer_head **pbh, sector_t *submit_ptr)
5875 {
5976 struct buffer_head *bh;
60
- struct inode *inode = NILFS_BTNC_I(btnc);
77
+ struct inode *inode = btnc->host;
6178 struct page *page;
6279 int err;
6380
....@@ -157,7 +174,7 @@
157174 struct nilfs_btnode_chkey_ctxt *ctxt)
158175 {
159176 struct buffer_head *obh, *nbh;
160
- struct inode *inode = NILFS_BTNC_I(btnc);
177
+ struct inode *inode = btnc->host;
161178 __u64 oldkey = ctxt->oldkey, newkey = ctxt->newkey;
162179 int err;
163180
....@@ -168,24 +185,18 @@
168185 ctxt->newbh = NULL;
169186
170187 if (inode->i_blkbits == PAGE_SHIFT) {
171
- lock_page(obh->b_page);
172
- /*
173
- * We cannot call radix_tree_preload for the kernels older
174
- * than 2.6.23, because it is not exported for modules.
175
- */
188
+ struct page *opage = obh->b_page;
189
+ lock_page(opage);
176190 retry:
177
- err = radix_tree_preload(GFP_NOFS & ~__GFP_HIGHMEM);
178
- if (err)
179
- goto failed_unlock;
180191 /* BUG_ON(oldkey != obh->b_page->index); */
181
- if (unlikely(oldkey != obh->b_page->index))
182
- NILFS_PAGE_BUG(obh->b_page,
192
+ if (unlikely(oldkey != opage->index))
193
+ NILFS_PAGE_BUG(opage,
183194 "invalid oldkey %lld (newkey=%lld)",
184195 (unsigned long long)oldkey,
185196 (unsigned long long)newkey);
186197
187198 xa_lock_irq(&btnc->i_pages);
188
- err = radix_tree_insert(&btnc->i_pages, newkey, obh->b_page);
199
+ err = __xa_insert(&btnc->i_pages, newkey, opage, GFP_NOFS);
189200 xa_unlock_irq(&btnc->i_pages);
190201 /*
191202 * Note: page->index will not change to newkey until
....@@ -193,17 +204,16 @@
193204 * To protect the page in intermediate state, the page lock
194205 * is held.
195206 */
196
- radix_tree_preload_end();
197207 if (!err)
198208 return 0;
199
- else if (err != -EEXIST)
209
+ else if (err != -EBUSY)
200210 goto failed_unlock;
201211
202212 err = invalidate_inode_pages2_range(btnc, newkey, newkey);
203213 if (!err)
204214 goto retry;
205215 /* fallback to copy mode */
206
- unlock_page(obh->b_page);
216
+ unlock_page(opage);
207217 }
208218
209219 nbh = nilfs_btnode_create_block(btnc, newkey);
....@@ -243,9 +253,8 @@
243253 mark_buffer_dirty(obh);
244254
245255 xa_lock_irq(&btnc->i_pages);
246
- radix_tree_delete(&btnc->i_pages, oldkey);
247
- radix_tree_tag_set(&btnc->i_pages, newkey,
248
- PAGECACHE_TAG_DIRTY);
256
+ __xa_erase(&btnc->i_pages, oldkey);
257
+ __xa_set_mark(&btnc->i_pages, newkey, PAGECACHE_TAG_DIRTY);
249258 xa_unlock_irq(&btnc->i_pages);
250259
251260 opage->index = obh->b_blocknr = newkey;
....@@ -274,10 +283,16 @@
274283 return;
275284
276285 if (nbh == NULL) { /* blocksize == pagesize */
277
- xa_lock_irq(&btnc->i_pages);
278
- radix_tree_delete(&btnc->i_pages, newkey);
279
- xa_unlock_irq(&btnc->i_pages);
286
+ xa_erase_irq(&btnc->i_pages, newkey);
280287 unlock_page(ctxt->bh->b_page);
281
- } else
282
- brelse(nbh);
288
+ } else {
289
+ /*
290
+ * When canceling a buffer that a prepare operation has
291
+ * allocated to copy a node block to another location, use
292
+ * nilfs_btnode_delete() to initialize and release the buffer
293
+ * so that the buffer flags will not be in an inconsistent
294
+ * state when it is reallocated.
295
+ */
296
+ nilfs_btnode_delete(nbh);
297
+ }
283298 }