1a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi/* 2a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * btnode.c - NILFS B-tree node cache 3a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * 4a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation. 5a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * 6a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * This program is free software; you can redistribute it and/or modify 7a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * it under the terms of the GNU General Public License as published by 8a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * the Free Software Foundation; either version 2 of the License, or 9a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * (at your option) any later version. 10a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * 11a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * This program is distributed in the hope that it will be useful, 12a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * but WITHOUT ANY WARRANTY; without even the implied warranty of 13a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * GNU General Public License for more details. 15a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * 16a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * You should have received a copy of the GNU General Public License 17a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * along with this program; if not, write to the Free Software 18a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 19a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * 20a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * This file was originally written by Seiji Kihara <kihara@osrg.net> 21a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * and fully revised by Ryusuke Konishi <ryusuke@osrg.net> for 22a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * stabilization and simplification. 23a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * 24a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi */ 25a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 26a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi#include <linux/types.h> 27a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi#include <linux/buffer_head.h> 28a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi#include <linux/mm.h> 29a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi#include <linux/backing-dev.h> 305a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/gfp.h> 31a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi#include "nilfs.h" 32a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi#include "mdt.h" 33a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi#include "dat.h" 34a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi#include "page.h" 35a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi#include "btnode.h" 36a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 37a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishivoid nilfs_btnode_cache_clear(struct address_space *btnc) 38a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi{ 39a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi invalidate_mapping_pages(btnc, 0, -1); 40a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi truncate_inode_pages(btnc, 0); 41a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi} 42a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 43d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishistruct buffer_head * 44d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishinilfs_btnode_create_block(struct address_space *btnc, __u64 blocknr) 45d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi{ 46d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi struct inode *inode = NILFS_BTNC_I(btnc); 47d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi struct buffer_head *bh; 48d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi 49d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi bh = nilfs_grab_buffer(inode, btnc, blocknr, 1 << BH_NILFS_Node); 50d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi if (unlikely(!bh)) 51d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi return NULL; 52d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi 53d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi if (unlikely(buffer_mapped(bh) || buffer_uptodate(bh) || 54d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi buffer_dirty(bh))) { 55d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi brelse(bh); 56d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi BUG(); 57d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi } 58d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi memset(bh->b_data, 0, 1 << inode->i_blkbits); 590ef28f9aec4dccfba33cef74412f601c1b48b658Ryusuke Konishi bh->b_bdev = inode->i_sb->s_bdev; 60d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi bh->b_blocknr = blocknr; 61d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi set_buffer_mapped(bh); 62d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi set_buffer_uptodate(bh); 63d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi 64d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi unlock_page(bh->b_page); 65d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi page_cache_release(bh->b_page); 66d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi return bh; 67d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi} 68d501d7368937740e8d06671a4bfe4e236ed25bd0Ryusuke Konishi 69a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishiint nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr, 7026dfdd8e29f28c08aa67861b3c83d0f3f7d30ceeRyusuke Konishi sector_t pblocknr, int mode, 7126dfdd8e29f28c08aa67861b3c83d0f3f7d30ceeRyusuke Konishi struct buffer_head **pbh, sector_t *submit_ptr) 72a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi{ 73a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi struct buffer_head *bh; 74a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi struct inode *inode = NILFS_BTNC_I(btnc); 75f8e6cc013b896d75d6ce4ec9e168014af1257fd8Ryusuke Konishi struct page *page; 76a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi int err; 77a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 78a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi bh = nilfs_grab_buffer(inode, btnc, blocknr, 1 << BH_NILFS_Node); 79a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi if (unlikely(!bh)) 80a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi return -ENOMEM; 81a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 82a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi err = -EEXIST; /* internal code */ 83f8e6cc013b896d75d6ce4ec9e168014af1257fd8Ryusuke Konishi page = bh->b_page; 84a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 85a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi if (buffer_uptodate(bh) || buffer_dirty(bh)) 86a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi goto found; 87a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 88a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi if (pblocknr == 0) { 89a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi pblocknr = blocknr; 90a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi if (inode->i_ino != NILFS_DAT_INO) { 910ef28f9aec4dccfba33cef74412f601c1b48b658Ryusuke Konishi struct the_nilfs *nilfs = inode->i_sb->s_fs_info; 92a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 93a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi /* blocknr is a virtual block number */ 940ef28f9aec4dccfba33cef74412f601c1b48b658Ryusuke Konishi err = nilfs_dat_translate(nilfs->ns_dat, blocknr, 950ef28f9aec4dccfba33cef74412f601c1b48b658Ryusuke Konishi &pblocknr); 96a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi if (unlikely(err)) { 97a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi brelse(bh); 98a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi goto out_locked; 99a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi } 100a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi } 101a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi } 10226dfdd8e29f28c08aa67861b3c83d0f3f7d30ceeRyusuke Konishi 10326dfdd8e29f28c08aa67861b3c83d0f3f7d30ceeRyusuke Konishi if (mode == READA) { 10426dfdd8e29f28c08aa67861b3c83d0f3f7d30ceeRyusuke Konishi if (pblocknr != *submit_ptr + 1 || !trylock_buffer(bh)) { 10526dfdd8e29f28c08aa67861b3c83d0f3f7d30ceeRyusuke Konishi err = -EBUSY; /* internal code */ 10626dfdd8e29f28c08aa67861b3c83d0f3f7d30ceeRyusuke Konishi brelse(bh); 10726dfdd8e29f28c08aa67861b3c83d0f3f7d30ceeRyusuke Konishi goto out_locked; 10826dfdd8e29f28c08aa67861b3c83d0f3f7d30ceeRyusuke Konishi } 10926dfdd8e29f28c08aa67861b3c83d0f3f7d30ceeRyusuke Konishi } else { /* mode == READ */ 11026dfdd8e29f28c08aa67861b3c83d0f3f7d30ceeRyusuke Konishi lock_buffer(bh); 11126dfdd8e29f28c08aa67861b3c83d0f3f7d30ceeRyusuke Konishi } 112a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi if (buffer_uptodate(bh)) { 113a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi unlock_buffer(bh); 114a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi err = -EEXIST; /* internal code */ 115a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi goto found; 116a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi } 117a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi set_buffer_mapped(bh); 1180ef28f9aec4dccfba33cef74412f601c1b48b658Ryusuke Konishi bh->b_bdev = inode->i_sb->s_bdev; 119a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi bh->b_blocknr = pblocknr; /* set block address for read */ 120a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi bh->b_end_io = end_buffer_read_sync; 121a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi get_bh(bh); 12226dfdd8e29f28c08aa67861b3c83d0f3f7d30ceeRyusuke Konishi submit_bh(mode, bh); 123a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi bh->b_blocknr = blocknr; /* set back to the given block address */ 12426dfdd8e29f28c08aa67861b3c83d0f3f7d30ceeRyusuke Konishi *submit_ptr = pblocknr; 125a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi err = 0; 126a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishifound: 127a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi *pbh = bh; 128a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 129a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishiout_locked: 130f8e6cc013b896d75d6ce4ec9e168014af1257fd8Ryusuke Konishi unlock_page(page); 131f8e6cc013b896d75d6ce4ec9e168014af1257fd8Ryusuke Konishi page_cache_release(page); 132a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi return err; 133a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi} 134a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 135a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi/** 136a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * nilfs_btnode_delete - delete B-tree node buffer 137a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * @bh: buffer to be deleted 138a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * 139a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * nilfs_btnode_delete() invalidates the specified buffer and delete the page 140a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * including the buffer if the page gets unbusy. 141a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi */ 142a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishivoid nilfs_btnode_delete(struct buffer_head *bh) 143a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi{ 144a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi struct address_space *mapping; 145a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi struct page *page = bh->b_page; 146a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi pgoff_t index = page_index(page); 147a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi int still_dirty; 148a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 149a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi page_cache_get(page); 150a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi lock_page(page); 151a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi wait_on_page_writeback(page); 152a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 153a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi nilfs_forget_buffer(bh); 154a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi still_dirty = PageDirty(page); 155a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi mapping = page->mapping; 156a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi unlock_page(page); 157a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi page_cache_release(page); 158a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 159a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi if (!still_dirty && mapping) 160a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi invalidate_inode_pages2_range(mapping, index, index); 161a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi} 162a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 163a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi/** 164a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * nilfs_btnode_prepare_change_key 165a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * prepare to move contents of the block for old key to one of new key. 166a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * the old buffer will not be removed, but might be reused for new buffer. 167a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * it might return -ENOMEM because of memory allocation errors, 168a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * and might return -EIO because of disk read errors. 169a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi */ 170a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishiint nilfs_btnode_prepare_change_key(struct address_space *btnc, 171a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi struct nilfs_btnode_chkey_ctxt *ctxt) 172a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi{ 173a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi struct buffer_head *obh, *nbh; 174a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi struct inode *inode = NILFS_BTNC_I(btnc); 175a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi __u64 oldkey = ctxt->oldkey, newkey = ctxt->newkey; 176a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi int err; 177a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 178a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi if (oldkey == newkey) 179a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi return 0; 180a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 181a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi obh = ctxt->bh; 182a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi ctxt->newbh = NULL; 183a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 184a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi if (inode->i_blkbits == PAGE_CACHE_SHIFT) { 185a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi lock_page(obh->b_page); 186a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi /* 187a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * We cannot call radix_tree_preload for the kernels older 188a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * than 2.6.23, because it is not exported for modules. 189a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi */ 190b1f1b8ce0a1d71cbc72f7540134d52b79bd8f5acRyusuke Konishiretry: 191a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi err = radix_tree_preload(GFP_NOFS & ~__GFP_HIGHMEM); 192a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi if (err) 193a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi goto failed_unlock; 194a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi /* BUG_ON(oldkey != obh->b_page->index); */ 195a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi if (unlikely(oldkey != obh->b_page->index)) 196a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi NILFS_PAGE_BUG(obh->b_page, 197a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi "invalid oldkey %lld (newkey=%lld)", 198a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi (unsigned long long)oldkey, 199a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi (unsigned long long)newkey); 200a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 201a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi spin_lock_irq(&btnc->tree_lock); 202a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi err = radix_tree_insert(&btnc->page_tree, newkey, obh->b_page); 203a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi spin_unlock_irq(&btnc->tree_lock); 204a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi /* 205a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * Note: page->index will not change to newkey until 206a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * nilfs_btnode_commit_change_key() will be called. 207a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * To protect the page in intermediate state, the page lock 208a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * is held. 209a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi */ 210a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi radix_tree_preload_end(); 211a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi if (!err) 212a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi return 0; 213a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi else if (err != -EEXIST) 214a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi goto failed_unlock; 215a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 216a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi err = invalidate_inode_pages2_range(btnc, newkey, newkey); 217a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi if (!err) 218a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi goto retry; 219a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi /* fallback to copy mode */ 220a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi unlock_page(obh->b_page); 221a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi } 222a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 22345f4910bc0bb904bcf53aa04ee1b807abe1387a6Ryusuke Konishi nbh = nilfs_btnode_create_block(btnc, newkey); 22445f4910bc0bb904bcf53aa04ee1b807abe1387a6Ryusuke Konishi if (!nbh) 22545f4910bc0bb904bcf53aa04ee1b807abe1387a6Ryusuke Konishi return -ENOMEM; 22645f4910bc0bb904bcf53aa04ee1b807abe1387a6Ryusuke Konishi 22745f4910bc0bb904bcf53aa04ee1b807abe1387a6Ryusuke Konishi BUG_ON(nbh == obh); 22845f4910bc0bb904bcf53aa04ee1b807abe1387a6Ryusuke Konishi ctxt->newbh = nbh; 22945f4910bc0bb904bcf53aa04ee1b807abe1387a6Ryusuke Konishi return 0; 230a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 231a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi failed_unlock: 232a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi unlock_page(obh->b_page); 233a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi return err; 234a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi} 235a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 236a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi/** 237a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * nilfs_btnode_commit_change_key 238a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * commit the change_key operation prepared by prepare_change_key(). 239a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi */ 240a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishivoid nilfs_btnode_commit_change_key(struct address_space *btnc, 241a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi struct nilfs_btnode_chkey_ctxt *ctxt) 242a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi{ 243a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi struct buffer_head *obh = ctxt->bh, *nbh = ctxt->newbh; 244a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi __u64 oldkey = ctxt->oldkey, newkey = ctxt->newkey; 245a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi struct page *opage; 246a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 247a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi if (oldkey == newkey) 248a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi return; 249a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 250a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi if (nbh == NULL) { /* blocksize == pagesize */ 251a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi opage = obh->b_page; 252a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi if (unlikely(oldkey != opage->index)) 253a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi NILFS_PAGE_BUG(opage, 254a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi "invalid oldkey %lld (newkey=%lld)", 255a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi (unsigned long long)oldkey, 256a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi (unsigned long long)newkey); 2575fc7b14177b1a1c2f2511aed62a4ca870d0332e7Ryusuke Konishi mark_buffer_dirty(obh); 258a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 259a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi spin_lock_irq(&btnc->tree_lock); 260a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi radix_tree_delete(&btnc->page_tree, oldkey); 261a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi radix_tree_tag_set(&btnc->page_tree, newkey, 262a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi PAGECACHE_TAG_DIRTY); 263a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi spin_unlock_irq(&btnc->tree_lock); 264a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 265a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi opage->index = obh->b_blocknr = newkey; 266a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi unlock_page(opage); 267a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi } else { 268a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi nilfs_copy_buffer(nbh, obh); 2695fc7b14177b1a1c2f2511aed62a4ca870d0332e7Ryusuke Konishi mark_buffer_dirty(nbh); 270a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 271a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi nbh->b_blocknr = newkey; 272a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi ctxt->bh = nbh; 273a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi nilfs_btnode_delete(obh); /* will decrement bh->b_count */ 274a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi } 275a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi} 276a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 277a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi/** 278a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * nilfs_btnode_abort_change_key 279a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi * abort the change_key operation prepared by prepare_change_key(). 280a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi */ 281a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishivoid nilfs_btnode_abort_change_key(struct address_space *btnc, 282a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi struct nilfs_btnode_chkey_ctxt *ctxt) 283a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi{ 284a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi struct buffer_head *nbh = ctxt->newbh; 285a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi __u64 oldkey = ctxt->oldkey, newkey = ctxt->newkey; 286a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 287a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi if (oldkey == newkey) 288a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi return; 289a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi 290a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi if (nbh == NULL) { /* blocksize == pagesize */ 291a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi spin_lock_irq(&btnc->tree_lock); 292a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi radix_tree_delete(&btnc->page_tree, newkey); 293a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi spin_unlock_irq(&btnc->tree_lock); 294a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi unlock_page(ctxt->bh->b_page); 295a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi } else 296a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi brelse(nbh); 297a60be987d45dd510aeb54389526f9957cfab106cRyusuke Konishi} 298