1*05fe58fdSRyusuke Konishi /* 2*05fe58fdSRyusuke Konishi * inode.c - NILFS inode operations. 3*05fe58fdSRyusuke Konishi * 4*05fe58fdSRyusuke Konishi * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation. 5*05fe58fdSRyusuke Konishi * 6*05fe58fdSRyusuke Konishi * This program is free software; you can redistribute it and/or modify 7*05fe58fdSRyusuke Konishi * it under the terms of the GNU General Public License as published by 8*05fe58fdSRyusuke Konishi * the Free Software Foundation; either version 2 of the License, or 9*05fe58fdSRyusuke Konishi * (at your option) any later version. 10*05fe58fdSRyusuke Konishi * 11*05fe58fdSRyusuke Konishi * This program is distributed in the hope that it will be useful, 12*05fe58fdSRyusuke Konishi * but WITHOUT ANY WARRANTY; without even the implied warranty of 13*05fe58fdSRyusuke Konishi * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*05fe58fdSRyusuke Konishi * GNU General Public License for more details. 15*05fe58fdSRyusuke Konishi * 16*05fe58fdSRyusuke Konishi * You should have received a copy of the GNU General Public License 17*05fe58fdSRyusuke Konishi * along with this program; if not, write to the Free Software 18*05fe58fdSRyusuke Konishi * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 19*05fe58fdSRyusuke Konishi * 20*05fe58fdSRyusuke Konishi * Written by Ryusuke Konishi <ryusuke@osrg.net> 21*05fe58fdSRyusuke Konishi * 22*05fe58fdSRyusuke Konishi */ 23*05fe58fdSRyusuke Konishi 24*05fe58fdSRyusuke Konishi #include <linux/buffer_head.h> 25*05fe58fdSRyusuke Konishi #include <linux/mpage.h> 26*05fe58fdSRyusuke Konishi #include <linux/writeback.h> 27*05fe58fdSRyusuke Konishi #include "nilfs.h" 28*05fe58fdSRyusuke Konishi #include "segment.h" 29*05fe58fdSRyusuke Konishi #include "page.h" 30*05fe58fdSRyusuke Konishi #include "mdt.h" 31*05fe58fdSRyusuke Konishi #include "cpfile.h" 32*05fe58fdSRyusuke Konishi #include "ifile.h" 33*05fe58fdSRyusuke Konishi 34*05fe58fdSRyusuke Konishi 35*05fe58fdSRyusuke Konishi /** 36*05fe58fdSRyusuke Konishi * nilfs_get_block() - get a file block on the filesystem (callback function) 37*05fe58fdSRyusuke Konishi * @inode - inode struct of the target file 38*05fe58fdSRyusuke Konishi * @blkoff - file block number 39*05fe58fdSRyusuke Konishi * @bh_result - buffer head to be mapped on 40*05fe58fdSRyusuke Konishi * @create - indicate whether allocating the block or not when it has not 41*05fe58fdSRyusuke Konishi * been allocated yet. 42*05fe58fdSRyusuke Konishi * 43*05fe58fdSRyusuke Konishi * This function does not issue actual read request of the specified data 44*05fe58fdSRyusuke Konishi * block. It is done by VFS. 45*05fe58fdSRyusuke Konishi * Bulk read for direct-io is not supported yet. (should be supported) 46*05fe58fdSRyusuke Konishi */ 47*05fe58fdSRyusuke Konishi int nilfs_get_block(struct inode *inode, sector_t blkoff, 48*05fe58fdSRyusuke Konishi struct buffer_head *bh_result, int create) 49*05fe58fdSRyusuke Konishi { 50*05fe58fdSRyusuke Konishi struct nilfs_inode_info *ii = NILFS_I(inode); 51*05fe58fdSRyusuke Konishi unsigned long blknum = 0; 52*05fe58fdSRyusuke Konishi int err = 0, ret; 53*05fe58fdSRyusuke Konishi struct inode *dat = nilfs_dat_inode(NILFS_I_NILFS(inode)); 54*05fe58fdSRyusuke Konishi 55*05fe58fdSRyusuke Konishi /* This exclusion control is a workaround; should be revised */ 56*05fe58fdSRyusuke Konishi down_read(&NILFS_MDT(dat)->mi_sem); /* XXX */ 57*05fe58fdSRyusuke Konishi ret = nilfs_bmap_lookup(ii->i_bmap, (unsigned long)blkoff, &blknum); 58*05fe58fdSRyusuke Konishi up_read(&NILFS_MDT(dat)->mi_sem); /* XXX */ 59*05fe58fdSRyusuke Konishi if (ret == 0) { /* found */ 60*05fe58fdSRyusuke Konishi map_bh(bh_result, inode->i_sb, blknum); 61*05fe58fdSRyusuke Konishi goto out; 62*05fe58fdSRyusuke Konishi } 63*05fe58fdSRyusuke Konishi if (unlikely(ret == 1)) { 64*05fe58fdSRyusuke Konishi printk(KERN_ERR "nilfs_get_block: bmap_lookup returns " 65*05fe58fdSRyusuke Konishi "buffer_head pointer (blkoff=%llu, blknum=%lu)\n", 66*05fe58fdSRyusuke Konishi (unsigned long long)blkoff, blknum); 67*05fe58fdSRyusuke Konishi BUG(); 68*05fe58fdSRyusuke Konishi } 69*05fe58fdSRyusuke Konishi /* data block was not found */ 70*05fe58fdSRyusuke Konishi if (ret == -ENOENT && create) { 71*05fe58fdSRyusuke Konishi struct nilfs_transaction_info ti; 72*05fe58fdSRyusuke Konishi 73*05fe58fdSRyusuke Konishi bh_result->b_blocknr = 0; 74*05fe58fdSRyusuke Konishi err = nilfs_transaction_begin(inode->i_sb, &ti, 1); 75*05fe58fdSRyusuke Konishi if (unlikely(err)) 76*05fe58fdSRyusuke Konishi goto out; 77*05fe58fdSRyusuke Konishi err = nilfs_bmap_insert(ii->i_bmap, (unsigned long)blkoff, 78*05fe58fdSRyusuke Konishi (unsigned long)bh_result); 79*05fe58fdSRyusuke Konishi nilfs_transaction_end(inode->i_sb, !err); 80*05fe58fdSRyusuke Konishi if (unlikely(err != 0)) { 81*05fe58fdSRyusuke Konishi if (err == -EEXIST) { 82*05fe58fdSRyusuke Konishi /* 83*05fe58fdSRyusuke Konishi * The get_block() function could be called 84*05fe58fdSRyusuke Konishi * from multiple callers for an inode. 85*05fe58fdSRyusuke Konishi * However, the page having this block must 86*05fe58fdSRyusuke Konishi * be locked in this case. 87*05fe58fdSRyusuke Konishi */ 88*05fe58fdSRyusuke Konishi printk(KERN_ERR 89*05fe58fdSRyusuke Konishi "nilfs_get_block: a race condition " 90*05fe58fdSRyusuke Konishi "while inserting a data block. " 91*05fe58fdSRyusuke Konishi "(inode number=%lu, file block " 92*05fe58fdSRyusuke Konishi "offset=%llu)\n", 93*05fe58fdSRyusuke Konishi inode->i_ino, 94*05fe58fdSRyusuke Konishi (unsigned long long)blkoff); 95*05fe58fdSRyusuke Konishi BUG(); 96*05fe58fdSRyusuke Konishi } else if (err == -EINVAL) { 97*05fe58fdSRyusuke Konishi nilfs_error(inode->i_sb, __func__, 98*05fe58fdSRyusuke Konishi "broken bmap (inode=%lu)\n", 99*05fe58fdSRyusuke Konishi inode->i_ino); 100*05fe58fdSRyusuke Konishi err = -EIO; 101*05fe58fdSRyusuke Konishi } 102*05fe58fdSRyusuke Konishi goto out; 103*05fe58fdSRyusuke Konishi } 104*05fe58fdSRyusuke Konishi /* Error handling should be detailed */ 105*05fe58fdSRyusuke Konishi set_buffer_new(bh_result); 106*05fe58fdSRyusuke Konishi map_bh(bh_result, inode->i_sb, 0); /* dbn must be changed 107*05fe58fdSRyusuke Konishi to proper value */ 108*05fe58fdSRyusuke Konishi } else if (ret == -ENOENT) { 109*05fe58fdSRyusuke Konishi /* not found is not error (e.g. hole); must return without 110*05fe58fdSRyusuke Konishi the mapped state flag. */ 111*05fe58fdSRyusuke Konishi ; 112*05fe58fdSRyusuke Konishi } else { 113*05fe58fdSRyusuke Konishi err = ret; 114*05fe58fdSRyusuke Konishi } 115*05fe58fdSRyusuke Konishi 116*05fe58fdSRyusuke Konishi out: 117*05fe58fdSRyusuke Konishi return err; 118*05fe58fdSRyusuke Konishi } 119*05fe58fdSRyusuke Konishi 120*05fe58fdSRyusuke Konishi /** 121*05fe58fdSRyusuke Konishi * nilfs_readpage() - implement readpage() method of nilfs_aops {} 122*05fe58fdSRyusuke Konishi * address_space_operations. 123*05fe58fdSRyusuke Konishi * @file - file struct of the file to be read 124*05fe58fdSRyusuke Konishi * @page - the page to be read 125*05fe58fdSRyusuke Konishi */ 126*05fe58fdSRyusuke Konishi static int nilfs_readpage(struct file *file, struct page *page) 127*05fe58fdSRyusuke Konishi { 128*05fe58fdSRyusuke Konishi return mpage_readpage(page, nilfs_get_block); 129*05fe58fdSRyusuke Konishi } 130*05fe58fdSRyusuke Konishi 131*05fe58fdSRyusuke Konishi /** 132*05fe58fdSRyusuke Konishi * nilfs_readpages() - implement readpages() method of nilfs_aops {} 133*05fe58fdSRyusuke Konishi * address_space_operations. 134*05fe58fdSRyusuke Konishi * @file - file struct of the file to be read 135*05fe58fdSRyusuke Konishi * @mapping - address_space struct used for reading multiple pages 136*05fe58fdSRyusuke Konishi * @pages - the pages to be read 137*05fe58fdSRyusuke Konishi * @nr_pages - number of pages to be read 138*05fe58fdSRyusuke Konishi */ 139*05fe58fdSRyusuke Konishi static int nilfs_readpages(struct file *file, struct address_space *mapping, 140*05fe58fdSRyusuke Konishi struct list_head *pages, unsigned nr_pages) 141*05fe58fdSRyusuke Konishi { 142*05fe58fdSRyusuke Konishi return mpage_readpages(mapping, pages, nr_pages, nilfs_get_block); 143*05fe58fdSRyusuke Konishi } 144*05fe58fdSRyusuke Konishi 145*05fe58fdSRyusuke Konishi static int nilfs_writepages(struct address_space *mapping, 146*05fe58fdSRyusuke Konishi struct writeback_control *wbc) 147*05fe58fdSRyusuke Konishi { 148*05fe58fdSRyusuke Konishi /* This empty method is required not to call generic_writepages() */ 149*05fe58fdSRyusuke Konishi return 0; 150*05fe58fdSRyusuke Konishi } 151*05fe58fdSRyusuke Konishi 152*05fe58fdSRyusuke Konishi static int nilfs_writepage(struct page *page, struct writeback_control *wbc) 153*05fe58fdSRyusuke Konishi { 154*05fe58fdSRyusuke Konishi struct inode *inode = page->mapping->host; 155*05fe58fdSRyusuke Konishi int err; 156*05fe58fdSRyusuke Konishi 157*05fe58fdSRyusuke Konishi redirty_page_for_writepage(wbc, page); 158*05fe58fdSRyusuke Konishi unlock_page(page); 159*05fe58fdSRyusuke Konishi 160*05fe58fdSRyusuke Konishi if (wbc->sync_mode == WB_SYNC_ALL) { 161*05fe58fdSRyusuke Konishi err = nilfs_construct_segment(inode->i_sb); 162*05fe58fdSRyusuke Konishi if (unlikely(err)) 163*05fe58fdSRyusuke Konishi return err; 164*05fe58fdSRyusuke Konishi } else if (wbc->for_reclaim) 165*05fe58fdSRyusuke Konishi nilfs_flush_segment(inode->i_sb, inode->i_ino); 166*05fe58fdSRyusuke Konishi 167*05fe58fdSRyusuke Konishi return 0; 168*05fe58fdSRyusuke Konishi } 169*05fe58fdSRyusuke Konishi 170*05fe58fdSRyusuke Konishi static int nilfs_set_page_dirty(struct page *page) 171*05fe58fdSRyusuke Konishi { 172*05fe58fdSRyusuke Konishi int ret = __set_page_dirty_buffers(page); 173*05fe58fdSRyusuke Konishi 174*05fe58fdSRyusuke Konishi if (ret) { 175*05fe58fdSRyusuke Konishi struct inode *inode = page->mapping->host; 176*05fe58fdSRyusuke Konishi struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb); 177*05fe58fdSRyusuke Konishi unsigned nr_dirty = 1 << (PAGE_SHIFT - inode->i_blkbits); 178*05fe58fdSRyusuke Konishi 179*05fe58fdSRyusuke Konishi nilfs_set_file_dirty(sbi, inode, nr_dirty); 180*05fe58fdSRyusuke Konishi } 181*05fe58fdSRyusuke Konishi return ret; 182*05fe58fdSRyusuke Konishi } 183*05fe58fdSRyusuke Konishi 184*05fe58fdSRyusuke Konishi static int nilfs_write_begin(struct file *file, struct address_space *mapping, 185*05fe58fdSRyusuke Konishi loff_t pos, unsigned len, unsigned flags, 186*05fe58fdSRyusuke Konishi struct page **pagep, void **fsdata) 187*05fe58fdSRyusuke Konishi 188*05fe58fdSRyusuke Konishi { 189*05fe58fdSRyusuke Konishi struct inode *inode = mapping->host; 190*05fe58fdSRyusuke Konishi int err = nilfs_transaction_begin(inode->i_sb, NULL, 1); 191*05fe58fdSRyusuke Konishi 192*05fe58fdSRyusuke Konishi if (unlikely(err)) 193*05fe58fdSRyusuke Konishi return err; 194*05fe58fdSRyusuke Konishi 195*05fe58fdSRyusuke Konishi *pagep = NULL; 196*05fe58fdSRyusuke Konishi err = block_write_begin(file, mapping, pos, len, flags, pagep, 197*05fe58fdSRyusuke Konishi fsdata, nilfs_get_block); 198*05fe58fdSRyusuke Konishi if (unlikely(err)) 199*05fe58fdSRyusuke Konishi nilfs_transaction_end(inode->i_sb, 0); 200*05fe58fdSRyusuke Konishi return err; 201*05fe58fdSRyusuke Konishi } 202*05fe58fdSRyusuke Konishi 203*05fe58fdSRyusuke Konishi static int nilfs_write_end(struct file *file, struct address_space *mapping, 204*05fe58fdSRyusuke Konishi loff_t pos, unsigned len, unsigned copied, 205*05fe58fdSRyusuke Konishi struct page *page, void *fsdata) 206*05fe58fdSRyusuke Konishi { 207*05fe58fdSRyusuke Konishi struct inode *inode = mapping->host; 208*05fe58fdSRyusuke Konishi unsigned start = pos & (PAGE_CACHE_SIZE - 1); 209*05fe58fdSRyusuke Konishi unsigned nr_dirty; 210*05fe58fdSRyusuke Konishi int err; 211*05fe58fdSRyusuke Konishi 212*05fe58fdSRyusuke Konishi nr_dirty = nilfs_page_count_clean_buffers(page, start, 213*05fe58fdSRyusuke Konishi start + copied); 214*05fe58fdSRyusuke Konishi copied = generic_write_end(file, mapping, pos, len, copied, page, 215*05fe58fdSRyusuke Konishi fsdata); 216*05fe58fdSRyusuke Konishi nilfs_set_file_dirty(NILFS_SB(inode->i_sb), inode, nr_dirty); 217*05fe58fdSRyusuke Konishi err = nilfs_transaction_end(inode->i_sb, 1); 218*05fe58fdSRyusuke Konishi return err ? : copied; 219*05fe58fdSRyusuke Konishi } 220*05fe58fdSRyusuke Konishi 221*05fe58fdSRyusuke Konishi static ssize_t 222*05fe58fdSRyusuke Konishi nilfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, 223*05fe58fdSRyusuke Konishi loff_t offset, unsigned long nr_segs) 224*05fe58fdSRyusuke Konishi { 225*05fe58fdSRyusuke Konishi struct file *file = iocb->ki_filp; 226*05fe58fdSRyusuke Konishi struct inode *inode = file->f_mapping->host; 227*05fe58fdSRyusuke Konishi ssize_t size; 228*05fe58fdSRyusuke Konishi int err; 229*05fe58fdSRyusuke Konishi 230*05fe58fdSRyusuke Konishi err = nilfs_construct_dsync_segment(inode->i_sb, inode); 231*05fe58fdSRyusuke Konishi if (unlikely(err)) 232*05fe58fdSRyusuke Konishi return err; 233*05fe58fdSRyusuke Konishi 234*05fe58fdSRyusuke Konishi if (rw == WRITE) 235*05fe58fdSRyusuke Konishi return 0; 236*05fe58fdSRyusuke Konishi 237*05fe58fdSRyusuke Konishi /* Needs synchronization with the cleaner */ 238*05fe58fdSRyusuke Konishi size = blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov, 239*05fe58fdSRyusuke Konishi offset, nr_segs, nilfs_get_block, NULL); 240*05fe58fdSRyusuke Konishi return size; 241*05fe58fdSRyusuke Konishi } 242*05fe58fdSRyusuke Konishi 243*05fe58fdSRyusuke Konishi struct address_space_operations nilfs_aops = { 244*05fe58fdSRyusuke Konishi .writepage = nilfs_writepage, 245*05fe58fdSRyusuke Konishi .readpage = nilfs_readpage, 246*05fe58fdSRyusuke Konishi /* .sync_page = nilfs_sync_page, */ 247*05fe58fdSRyusuke Konishi .writepages = nilfs_writepages, 248*05fe58fdSRyusuke Konishi .set_page_dirty = nilfs_set_page_dirty, 249*05fe58fdSRyusuke Konishi .readpages = nilfs_readpages, 250*05fe58fdSRyusuke Konishi .write_begin = nilfs_write_begin, 251*05fe58fdSRyusuke Konishi .write_end = nilfs_write_end, 252*05fe58fdSRyusuke Konishi /* .releasepage = nilfs_releasepage, */ 253*05fe58fdSRyusuke Konishi .invalidatepage = block_invalidatepage, 254*05fe58fdSRyusuke Konishi .direct_IO = nilfs_direct_IO, 255*05fe58fdSRyusuke Konishi }; 256*05fe58fdSRyusuke Konishi 257*05fe58fdSRyusuke Konishi struct inode *nilfs_new_inode(struct inode *dir, int mode) 258*05fe58fdSRyusuke Konishi { 259*05fe58fdSRyusuke Konishi struct super_block *sb = dir->i_sb; 260*05fe58fdSRyusuke Konishi struct nilfs_sb_info *sbi = NILFS_SB(sb); 261*05fe58fdSRyusuke Konishi struct inode *inode; 262*05fe58fdSRyusuke Konishi struct nilfs_inode_info *ii; 263*05fe58fdSRyusuke Konishi int err = -ENOMEM; 264*05fe58fdSRyusuke Konishi ino_t ino; 265*05fe58fdSRyusuke Konishi 266*05fe58fdSRyusuke Konishi inode = new_inode(sb); 267*05fe58fdSRyusuke Konishi if (unlikely(!inode)) 268*05fe58fdSRyusuke Konishi goto failed; 269*05fe58fdSRyusuke Konishi 270*05fe58fdSRyusuke Konishi mapping_set_gfp_mask(inode->i_mapping, 271*05fe58fdSRyusuke Konishi mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS); 272*05fe58fdSRyusuke Konishi 273*05fe58fdSRyusuke Konishi ii = NILFS_I(inode); 274*05fe58fdSRyusuke Konishi ii->i_state = 1 << NILFS_I_NEW; 275*05fe58fdSRyusuke Konishi 276*05fe58fdSRyusuke Konishi err = nilfs_ifile_create_inode(sbi->s_ifile, &ino, &ii->i_bh); 277*05fe58fdSRyusuke Konishi if (unlikely(err)) 278*05fe58fdSRyusuke Konishi goto failed_ifile_create_inode; 279*05fe58fdSRyusuke Konishi /* reference count of i_bh inherits from nilfs_mdt_read_block() */ 280*05fe58fdSRyusuke Konishi 281*05fe58fdSRyusuke Konishi atomic_inc(&sbi->s_inodes_count); 282*05fe58fdSRyusuke Konishi 283*05fe58fdSRyusuke Konishi inode->i_uid = current_fsuid(); 284*05fe58fdSRyusuke Konishi if (dir->i_mode & S_ISGID) { 285*05fe58fdSRyusuke Konishi inode->i_gid = dir->i_gid; 286*05fe58fdSRyusuke Konishi if (S_ISDIR(mode)) 287*05fe58fdSRyusuke Konishi mode |= S_ISGID; 288*05fe58fdSRyusuke Konishi } else 289*05fe58fdSRyusuke Konishi inode->i_gid = current_fsgid(); 290*05fe58fdSRyusuke Konishi 291*05fe58fdSRyusuke Konishi inode->i_mode = mode; 292*05fe58fdSRyusuke Konishi inode->i_ino = ino; 293*05fe58fdSRyusuke Konishi inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; 294*05fe58fdSRyusuke Konishi 295*05fe58fdSRyusuke Konishi if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)) { 296*05fe58fdSRyusuke Konishi err = nilfs_bmap_read(ii->i_bmap, NULL); 297*05fe58fdSRyusuke Konishi if (err < 0) 298*05fe58fdSRyusuke Konishi goto failed_bmap; 299*05fe58fdSRyusuke Konishi 300*05fe58fdSRyusuke Konishi set_bit(NILFS_I_BMAP, &ii->i_state); 301*05fe58fdSRyusuke Konishi /* No lock is needed; iget() ensures it. */ 302*05fe58fdSRyusuke Konishi } 303*05fe58fdSRyusuke Konishi 304*05fe58fdSRyusuke Konishi ii->i_flags = NILFS_I(dir)->i_flags; 305*05fe58fdSRyusuke Konishi if (S_ISLNK(mode)) 306*05fe58fdSRyusuke Konishi ii->i_flags &= ~(NILFS_IMMUTABLE_FL | NILFS_APPEND_FL); 307*05fe58fdSRyusuke Konishi if (!S_ISDIR(mode)) 308*05fe58fdSRyusuke Konishi ii->i_flags &= ~NILFS_DIRSYNC_FL; 309*05fe58fdSRyusuke Konishi 310*05fe58fdSRyusuke Konishi /* ii->i_file_acl = 0; */ 311*05fe58fdSRyusuke Konishi /* ii->i_dir_acl = 0; */ 312*05fe58fdSRyusuke Konishi ii->i_dtime = 0; 313*05fe58fdSRyusuke Konishi ii->i_dir_start_lookup = 0; 314*05fe58fdSRyusuke Konishi #ifdef CONFIG_NILFS_FS_POSIX_ACL 315*05fe58fdSRyusuke Konishi ii->i_acl = NULL; 316*05fe58fdSRyusuke Konishi ii->i_default_acl = NULL; 317*05fe58fdSRyusuke Konishi #endif 318*05fe58fdSRyusuke Konishi ii->i_cno = 0; 319*05fe58fdSRyusuke Konishi nilfs_set_inode_flags(inode); 320*05fe58fdSRyusuke Konishi spin_lock(&sbi->s_next_gen_lock); 321*05fe58fdSRyusuke Konishi inode->i_generation = sbi->s_next_generation++; 322*05fe58fdSRyusuke Konishi spin_unlock(&sbi->s_next_gen_lock); 323*05fe58fdSRyusuke Konishi insert_inode_hash(inode); 324*05fe58fdSRyusuke Konishi 325*05fe58fdSRyusuke Konishi err = nilfs_init_acl(inode, dir); 326*05fe58fdSRyusuke Konishi if (unlikely(err)) 327*05fe58fdSRyusuke Konishi goto failed_acl; /* never occur. When supporting 328*05fe58fdSRyusuke Konishi nilfs_init_acl(), proper cancellation of 329*05fe58fdSRyusuke Konishi above jobs should be considered */ 330*05fe58fdSRyusuke Konishi 331*05fe58fdSRyusuke Konishi mark_inode_dirty(inode); 332*05fe58fdSRyusuke Konishi return inode; 333*05fe58fdSRyusuke Konishi 334*05fe58fdSRyusuke Konishi failed_acl: 335*05fe58fdSRyusuke Konishi failed_bmap: 336*05fe58fdSRyusuke Konishi inode->i_nlink = 0; 337*05fe58fdSRyusuke Konishi iput(inode); /* raw_inode will be deleted through 338*05fe58fdSRyusuke Konishi generic_delete_inode() */ 339*05fe58fdSRyusuke Konishi goto failed; 340*05fe58fdSRyusuke Konishi 341*05fe58fdSRyusuke Konishi failed_ifile_create_inode: 342*05fe58fdSRyusuke Konishi make_bad_inode(inode); 343*05fe58fdSRyusuke Konishi iput(inode); /* if i_nlink == 1, generic_forget_inode() will be 344*05fe58fdSRyusuke Konishi called */ 345*05fe58fdSRyusuke Konishi failed: 346*05fe58fdSRyusuke Konishi return ERR_PTR(err); 347*05fe58fdSRyusuke Konishi } 348*05fe58fdSRyusuke Konishi 349*05fe58fdSRyusuke Konishi void nilfs_free_inode(struct inode *inode) 350*05fe58fdSRyusuke Konishi { 351*05fe58fdSRyusuke Konishi struct super_block *sb = inode->i_sb; 352*05fe58fdSRyusuke Konishi struct nilfs_sb_info *sbi = NILFS_SB(sb); 353*05fe58fdSRyusuke Konishi 354*05fe58fdSRyusuke Konishi clear_inode(inode); 355*05fe58fdSRyusuke Konishi /* XXX: check error code? Is there any thing I can do? */ 356*05fe58fdSRyusuke Konishi (void) nilfs_ifile_delete_inode(sbi->s_ifile, inode->i_ino); 357*05fe58fdSRyusuke Konishi atomic_dec(&sbi->s_inodes_count); 358*05fe58fdSRyusuke Konishi } 359*05fe58fdSRyusuke Konishi 360*05fe58fdSRyusuke Konishi void nilfs_set_inode_flags(struct inode *inode) 361*05fe58fdSRyusuke Konishi { 362*05fe58fdSRyusuke Konishi unsigned int flags = NILFS_I(inode)->i_flags; 363*05fe58fdSRyusuke Konishi 364*05fe58fdSRyusuke Konishi inode->i_flags &= ~(S_SYNC | S_APPEND | S_IMMUTABLE | S_NOATIME | 365*05fe58fdSRyusuke Konishi S_DIRSYNC); 366*05fe58fdSRyusuke Konishi if (flags & NILFS_SYNC_FL) 367*05fe58fdSRyusuke Konishi inode->i_flags |= S_SYNC; 368*05fe58fdSRyusuke Konishi if (flags & NILFS_APPEND_FL) 369*05fe58fdSRyusuke Konishi inode->i_flags |= S_APPEND; 370*05fe58fdSRyusuke Konishi if (flags & NILFS_IMMUTABLE_FL) 371*05fe58fdSRyusuke Konishi inode->i_flags |= S_IMMUTABLE; 372*05fe58fdSRyusuke Konishi #ifndef NILFS_ATIME_DISABLE 373*05fe58fdSRyusuke Konishi if (flags & NILFS_NOATIME_FL) 374*05fe58fdSRyusuke Konishi #endif 375*05fe58fdSRyusuke Konishi inode->i_flags |= S_NOATIME; 376*05fe58fdSRyusuke Konishi if (flags & NILFS_DIRSYNC_FL) 377*05fe58fdSRyusuke Konishi inode->i_flags |= S_DIRSYNC; 378*05fe58fdSRyusuke Konishi mapping_set_gfp_mask(inode->i_mapping, 379*05fe58fdSRyusuke Konishi mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS); 380*05fe58fdSRyusuke Konishi } 381*05fe58fdSRyusuke Konishi 382*05fe58fdSRyusuke Konishi int nilfs_read_inode_common(struct inode *inode, 383*05fe58fdSRyusuke Konishi struct nilfs_inode *raw_inode) 384*05fe58fdSRyusuke Konishi { 385*05fe58fdSRyusuke Konishi struct nilfs_inode_info *ii = NILFS_I(inode); 386*05fe58fdSRyusuke Konishi int err; 387*05fe58fdSRyusuke Konishi 388*05fe58fdSRyusuke Konishi inode->i_mode = le16_to_cpu(raw_inode->i_mode); 389*05fe58fdSRyusuke Konishi inode->i_uid = (uid_t)le32_to_cpu(raw_inode->i_uid); 390*05fe58fdSRyusuke Konishi inode->i_gid = (gid_t)le32_to_cpu(raw_inode->i_gid); 391*05fe58fdSRyusuke Konishi inode->i_nlink = le16_to_cpu(raw_inode->i_links_count); 392*05fe58fdSRyusuke Konishi inode->i_size = le64_to_cpu(raw_inode->i_size); 393*05fe58fdSRyusuke Konishi inode->i_atime.tv_sec = le64_to_cpu(raw_inode->i_mtime); 394*05fe58fdSRyusuke Konishi inode->i_ctime.tv_sec = le64_to_cpu(raw_inode->i_ctime); 395*05fe58fdSRyusuke Konishi inode->i_mtime.tv_sec = le64_to_cpu(raw_inode->i_mtime); 396*05fe58fdSRyusuke Konishi inode->i_atime.tv_nsec = 0; 397*05fe58fdSRyusuke Konishi inode->i_ctime.tv_nsec = 0; 398*05fe58fdSRyusuke Konishi inode->i_mtime.tv_nsec = 0; 399*05fe58fdSRyusuke Konishi ii->i_dtime = le64_to_cpu(raw_inode->i_dtime); 400*05fe58fdSRyusuke Konishi if (inode->i_nlink == 0 && (inode->i_mode == 0 || ii->i_dtime)) 401*05fe58fdSRyusuke Konishi return -EINVAL; /* this inode is deleted */ 402*05fe58fdSRyusuke Konishi 403*05fe58fdSRyusuke Konishi inode->i_blocks = le64_to_cpu(raw_inode->i_blocks); 404*05fe58fdSRyusuke Konishi ii->i_flags = le32_to_cpu(raw_inode->i_flags); 405*05fe58fdSRyusuke Konishi #if 0 406*05fe58fdSRyusuke Konishi ii->i_file_acl = le32_to_cpu(raw_inode->i_file_acl); 407*05fe58fdSRyusuke Konishi ii->i_dir_acl = S_ISREG(inode->i_mode) ? 408*05fe58fdSRyusuke Konishi 0 : le32_to_cpu(raw_inode->i_dir_acl); 409*05fe58fdSRyusuke Konishi #endif 410*05fe58fdSRyusuke Konishi ii->i_cno = 0; 411*05fe58fdSRyusuke Konishi inode->i_generation = le32_to_cpu(raw_inode->i_generation); 412*05fe58fdSRyusuke Konishi 413*05fe58fdSRyusuke Konishi if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || 414*05fe58fdSRyusuke Konishi S_ISLNK(inode->i_mode)) { 415*05fe58fdSRyusuke Konishi err = nilfs_bmap_read(ii->i_bmap, raw_inode); 416*05fe58fdSRyusuke Konishi if (err < 0) 417*05fe58fdSRyusuke Konishi return err; 418*05fe58fdSRyusuke Konishi set_bit(NILFS_I_BMAP, &ii->i_state); 419*05fe58fdSRyusuke Konishi /* No lock is needed; iget() ensures it. */ 420*05fe58fdSRyusuke Konishi } 421*05fe58fdSRyusuke Konishi return 0; 422*05fe58fdSRyusuke Konishi } 423*05fe58fdSRyusuke Konishi 424*05fe58fdSRyusuke Konishi static int nilfs_read_sketch_inode(struct inode *inode) 425*05fe58fdSRyusuke Konishi { 426*05fe58fdSRyusuke Konishi struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb); 427*05fe58fdSRyusuke Konishi int err = 0; 428*05fe58fdSRyusuke Konishi 429*05fe58fdSRyusuke Konishi if (sbi->s_snapshot_cno) { 430*05fe58fdSRyusuke Konishi struct the_nilfs *nilfs = sbi->s_nilfs; 431*05fe58fdSRyusuke Konishi struct buffer_head *bh_cp; 432*05fe58fdSRyusuke Konishi struct nilfs_checkpoint *raw_cp; 433*05fe58fdSRyusuke Konishi 434*05fe58fdSRyusuke Konishi err = nilfs_cpfile_get_checkpoint( 435*05fe58fdSRyusuke Konishi nilfs->ns_cpfile, sbi->s_snapshot_cno, 0, &raw_cp, 436*05fe58fdSRyusuke Konishi &bh_cp); 437*05fe58fdSRyusuke Konishi if (likely(!err)) { 438*05fe58fdSRyusuke Konishi if (!nilfs_checkpoint_sketch(raw_cp)) 439*05fe58fdSRyusuke Konishi inode->i_size = 0; 440*05fe58fdSRyusuke Konishi nilfs_cpfile_put_checkpoint( 441*05fe58fdSRyusuke Konishi nilfs->ns_cpfile, sbi->s_snapshot_cno, bh_cp); 442*05fe58fdSRyusuke Konishi } 443*05fe58fdSRyusuke Konishi inode->i_flags |= S_NOCMTIME; 444*05fe58fdSRyusuke Konishi } 445*05fe58fdSRyusuke Konishi return err; 446*05fe58fdSRyusuke Konishi } 447*05fe58fdSRyusuke Konishi 448*05fe58fdSRyusuke Konishi static int __nilfs_read_inode(struct super_block *sb, unsigned long ino, 449*05fe58fdSRyusuke Konishi struct inode *inode) 450*05fe58fdSRyusuke Konishi { 451*05fe58fdSRyusuke Konishi struct nilfs_sb_info *sbi = NILFS_SB(sb); 452*05fe58fdSRyusuke Konishi struct inode *dat = nilfs_dat_inode(sbi->s_nilfs); 453*05fe58fdSRyusuke Konishi struct buffer_head *bh; 454*05fe58fdSRyusuke Konishi struct nilfs_inode *raw_inode; 455*05fe58fdSRyusuke Konishi int err; 456*05fe58fdSRyusuke Konishi 457*05fe58fdSRyusuke Konishi down_read(&NILFS_MDT(dat)->mi_sem); /* XXX */ 458*05fe58fdSRyusuke Konishi err = nilfs_ifile_get_inode_block(sbi->s_ifile, ino, &bh); 459*05fe58fdSRyusuke Konishi if (unlikely(err)) 460*05fe58fdSRyusuke Konishi goto bad_inode; 461*05fe58fdSRyusuke Konishi 462*05fe58fdSRyusuke Konishi raw_inode = nilfs_ifile_map_inode(sbi->s_ifile, ino, bh); 463*05fe58fdSRyusuke Konishi 464*05fe58fdSRyusuke Konishi #ifdef CONFIG_NILFS_FS_POSIX_ACL 465*05fe58fdSRyusuke Konishi ii->i_acl = NILFS_ACL_NOT_CACHED; 466*05fe58fdSRyusuke Konishi ii->i_default_acl = NILFS_ACL_NOT_CACHED; 467*05fe58fdSRyusuke Konishi #endif 468*05fe58fdSRyusuke Konishi if (nilfs_read_inode_common(inode, raw_inode)) 469*05fe58fdSRyusuke Konishi goto failed_unmap; 470*05fe58fdSRyusuke Konishi 471*05fe58fdSRyusuke Konishi if (S_ISREG(inode->i_mode)) { 472*05fe58fdSRyusuke Konishi inode->i_op = &nilfs_file_inode_operations; 473*05fe58fdSRyusuke Konishi inode->i_fop = &nilfs_file_operations; 474*05fe58fdSRyusuke Konishi inode->i_mapping->a_ops = &nilfs_aops; 475*05fe58fdSRyusuke Konishi if (unlikely(inode->i_ino == NILFS_SKETCH_INO)) { 476*05fe58fdSRyusuke Konishi err = nilfs_read_sketch_inode(inode); 477*05fe58fdSRyusuke Konishi if (unlikely(err)) 478*05fe58fdSRyusuke Konishi goto failed_unmap; 479*05fe58fdSRyusuke Konishi } 480*05fe58fdSRyusuke Konishi } else if (S_ISDIR(inode->i_mode)) { 481*05fe58fdSRyusuke Konishi inode->i_op = &nilfs_dir_inode_operations; 482*05fe58fdSRyusuke Konishi inode->i_fop = &nilfs_dir_operations; 483*05fe58fdSRyusuke Konishi inode->i_mapping->a_ops = &nilfs_aops; 484*05fe58fdSRyusuke Konishi } else if (S_ISLNK(inode->i_mode)) { 485*05fe58fdSRyusuke Konishi inode->i_op = &nilfs_symlink_inode_operations; 486*05fe58fdSRyusuke Konishi inode->i_mapping->a_ops = &nilfs_aops; 487*05fe58fdSRyusuke Konishi } else { 488*05fe58fdSRyusuke Konishi inode->i_op = &nilfs_special_inode_operations; 489*05fe58fdSRyusuke Konishi init_special_inode( 490*05fe58fdSRyusuke Konishi inode, inode->i_mode, 491*05fe58fdSRyusuke Konishi new_decode_dev(le64_to_cpu(raw_inode->i_device_code))); 492*05fe58fdSRyusuke Konishi } 493*05fe58fdSRyusuke Konishi nilfs_ifile_unmap_inode(sbi->s_ifile, ino, bh); 494*05fe58fdSRyusuke Konishi brelse(bh); 495*05fe58fdSRyusuke Konishi up_read(&NILFS_MDT(dat)->mi_sem); /* XXX */ 496*05fe58fdSRyusuke Konishi nilfs_set_inode_flags(inode); 497*05fe58fdSRyusuke Konishi return 0; 498*05fe58fdSRyusuke Konishi 499*05fe58fdSRyusuke Konishi failed_unmap: 500*05fe58fdSRyusuke Konishi nilfs_ifile_unmap_inode(sbi->s_ifile, ino, bh); 501*05fe58fdSRyusuke Konishi brelse(bh); 502*05fe58fdSRyusuke Konishi 503*05fe58fdSRyusuke Konishi bad_inode: 504*05fe58fdSRyusuke Konishi up_read(&NILFS_MDT(dat)->mi_sem); /* XXX */ 505*05fe58fdSRyusuke Konishi return err; 506*05fe58fdSRyusuke Konishi } 507*05fe58fdSRyusuke Konishi 508*05fe58fdSRyusuke Konishi struct inode *nilfs_iget(struct super_block *sb, unsigned long ino) 509*05fe58fdSRyusuke Konishi { 510*05fe58fdSRyusuke Konishi struct inode *inode; 511*05fe58fdSRyusuke Konishi int err; 512*05fe58fdSRyusuke Konishi 513*05fe58fdSRyusuke Konishi inode = iget_locked(sb, ino); 514*05fe58fdSRyusuke Konishi if (unlikely(!inode)) 515*05fe58fdSRyusuke Konishi return ERR_PTR(-ENOMEM); 516*05fe58fdSRyusuke Konishi if (!(inode->i_state & I_NEW)) 517*05fe58fdSRyusuke Konishi return inode; 518*05fe58fdSRyusuke Konishi 519*05fe58fdSRyusuke Konishi err = __nilfs_read_inode(sb, ino, inode); 520*05fe58fdSRyusuke Konishi if (unlikely(err)) { 521*05fe58fdSRyusuke Konishi iget_failed(inode); 522*05fe58fdSRyusuke Konishi return ERR_PTR(err); 523*05fe58fdSRyusuke Konishi } 524*05fe58fdSRyusuke Konishi unlock_new_inode(inode); 525*05fe58fdSRyusuke Konishi return inode; 526*05fe58fdSRyusuke Konishi } 527*05fe58fdSRyusuke Konishi 528*05fe58fdSRyusuke Konishi void nilfs_write_inode_common(struct inode *inode, 529*05fe58fdSRyusuke Konishi struct nilfs_inode *raw_inode, int has_bmap) 530*05fe58fdSRyusuke Konishi { 531*05fe58fdSRyusuke Konishi struct nilfs_inode_info *ii = NILFS_I(inode); 532*05fe58fdSRyusuke Konishi 533*05fe58fdSRyusuke Konishi raw_inode->i_mode = cpu_to_le16(inode->i_mode); 534*05fe58fdSRyusuke Konishi raw_inode->i_uid = cpu_to_le32(inode->i_uid); 535*05fe58fdSRyusuke Konishi raw_inode->i_gid = cpu_to_le32(inode->i_gid); 536*05fe58fdSRyusuke Konishi raw_inode->i_links_count = cpu_to_le16(inode->i_nlink); 537*05fe58fdSRyusuke Konishi raw_inode->i_size = cpu_to_le64(inode->i_size); 538*05fe58fdSRyusuke Konishi raw_inode->i_ctime = cpu_to_le64(inode->i_ctime.tv_sec); 539*05fe58fdSRyusuke Konishi raw_inode->i_mtime = cpu_to_le64(inode->i_mtime.tv_sec); 540*05fe58fdSRyusuke Konishi raw_inode->i_blocks = cpu_to_le64(inode->i_blocks); 541*05fe58fdSRyusuke Konishi 542*05fe58fdSRyusuke Konishi raw_inode->i_dtime = cpu_to_le64(ii->i_dtime); 543*05fe58fdSRyusuke Konishi raw_inode->i_flags = cpu_to_le32(ii->i_flags); 544*05fe58fdSRyusuke Konishi raw_inode->i_generation = cpu_to_le32(inode->i_generation); 545*05fe58fdSRyusuke Konishi 546*05fe58fdSRyusuke Konishi if (has_bmap) 547*05fe58fdSRyusuke Konishi nilfs_bmap_write(ii->i_bmap, raw_inode); 548*05fe58fdSRyusuke Konishi else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) 549*05fe58fdSRyusuke Konishi raw_inode->i_device_code = 550*05fe58fdSRyusuke Konishi cpu_to_le64(new_encode_dev(inode->i_rdev)); 551*05fe58fdSRyusuke Konishi /* When extending inode, nilfs->ns_inode_size should be checked 552*05fe58fdSRyusuke Konishi for substitutions of appended fields */ 553*05fe58fdSRyusuke Konishi } 554*05fe58fdSRyusuke Konishi 555*05fe58fdSRyusuke Konishi void nilfs_update_inode(struct inode *inode, struct buffer_head *ibh) 556*05fe58fdSRyusuke Konishi { 557*05fe58fdSRyusuke Konishi ino_t ino = inode->i_ino; 558*05fe58fdSRyusuke Konishi struct nilfs_inode_info *ii = NILFS_I(inode); 559*05fe58fdSRyusuke Konishi struct super_block *sb = inode->i_sb; 560*05fe58fdSRyusuke Konishi struct nilfs_sb_info *sbi = NILFS_SB(sb); 561*05fe58fdSRyusuke Konishi struct nilfs_inode *raw_inode; 562*05fe58fdSRyusuke Konishi 563*05fe58fdSRyusuke Konishi raw_inode = nilfs_ifile_map_inode(sbi->s_ifile, ino, ibh); 564*05fe58fdSRyusuke Konishi 565*05fe58fdSRyusuke Konishi /* The buffer is guarded with lock_buffer() by the caller */ 566*05fe58fdSRyusuke Konishi if (test_and_clear_bit(NILFS_I_NEW, &ii->i_state)) 567*05fe58fdSRyusuke Konishi memset(raw_inode, 0, NILFS_MDT(sbi->s_ifile)->mi_entry_size); 568*05fe58fdSRyusuke Konishi set_bit(NILFS_I_INODE_DIRTY, &ii->i_state); 569*05fe58fdSRyusuke Konishi 570*05fe58fdSRyusuke Konishi nilfs_write_inode_common(inode, raw_inode, 0); 571*05fe58fdSRyusuke Konishi /* XXX: call with has_bmap = 0 is a workaround to avoid 572*05fe58fdSRyusuke Konishi deadlock of bmap. This delays update of i_bmap to just 573*05fe58fdSRyusuke Konishi before writing */ 574*05fe58fdSRyusuke Konishi nilfs_ifile_unmap_inode(sbi->s_ifile, ino, ibh); 575*05fe58fdSRyusuke Konishi } 576*05fe58fdSRyusuke Konishi 577*05fe58fdSRyusuke Konishi #define NILFS_MAX_TRUNCATE_BLOCKS 16384 /* 64MB for 4KB block */ 578*05fe58fdSRyusuke Konishi 579*05fe58fdSRyusuke Konishi static void nilfs_truncate_bmap(struct nilfs_inode_info *ii, 580*05fe58fdSRyusuke Konishi unsigned long from) 581*05fe58fdSRyusuke Konishi { 582*05fe58fdSRyusuke Konishi unsigned long b; 583*05fe58fdSRyusuke Konishi int ret; 584*05fe58fdSRyusuke Konishi 585*05fe58fdSRyusuke Konishi if (!test_bit(NILFS_I_BMAP, &ii->i_state)) 586*05fe58fdSRyusuke Konishi return; 587*05fe58fdSRyusuke Konishi repeat: 588*05fe58fdSRyusuke Konishi ret = nilfs_bmap_last_key(ii->i_bmap, &b); 589*05fe58fdSRyusuke Konishi if (ret == -ENOENT) 590*05fe58fdSRyusuke Konishi return; 591*05fe58fdSRyusuke Konishi else if (ret < 0) 592*05fe58fdSRyusuke Konishi goto failed; 593*05fe58fdSRyusuke Konishi 594*05fe58fdSRyusuke Konishi if (b < from) 595*05fe58fdSRyusuke Konishi return; 596*05fe58fdSRyusuke Konishi 597*05fe58fdSRyusuke Konishi b -= min_t(unsigned long, NILFS_MAX_TRUNCATE_BLOCKS, b - from); 598*05fe58fdSRyusuke Konishi ret = nilfs_bmap_truncate(ii->i_bmap, b); 599*05fe58fdSRyusuke Konishi nilfs_relax_pressure_in_lock(ii->vfs_inode.i_sb); 600*05fe58fdSRyusuke Konishi if (!ret || (ret == -ENOMEM && 601*05fe58fdSRyusuke Konishi nilfs_bmap_truncate(ii->i_bmap, b) == 0)) 602*05fe58fdSRyusuke Konishi goto repeat; 603*05fe58fdSRyusuke Konishi 604*05fe58fdSRyusuke Konishi failed: 605*05fe58fdSRyusuke Konishi if (ret == -EINVAL) 606*05fe58fdSRyusuke Konishi nilfs_error(ii->vfs_inode.i_sb, __func__, 607*05fe58fdSRyusuke Konishi "bmap is broken (ino=%lu)", ii->vfs_inode.i_ino); 608*05fe58fdSRyusuke Konishi else 609*05fe58fdSRyusuke Konishi nilfs_warning(ii->vfs_inode.i_sb, __func__, 610*05fe58fdSRyusuke Konishi "failed to truncate bmap (ino=%lu, err=%d)", 611*05fe58fdSRyusuke Konishi ii->vfs_inode.i_ino, ret); 612*05fe58fdSRyusuke Konishi } 613*05fe58fdSRyusuke Konishi 614*05fe58fdSRyusuke Konishi void nilfs_truncate(struct inode *inode) 615*05fe58fdSRyusuke Konishi { 616*05fe58fdSRyusuke Konishi unsigned long blkoff; 617*05fe58fdSRyusuke Konishi unsigned int blocksize; 618*05fe58fdSRyusuke Konishi struct nilfs_transaction_info ti; 619*05fe58fdSRyusuke Konishi struct super_block *sb = inode->i_sb; 620*05fe58fdSRyusuke Konishi struct nilfs_inode_info *ii = NILFS_I(inode); 621*05fe58fdSRyusuke Konishi int ret; 622*05fe58fdSRyusuke Konishi 623*05fe58fdSRyusuke Konishi if (!test_bit(NILFS_I_BMAP, &ii->i_state)) 624*05fe58fdSRyusuke Konishi return; 625*05fe58fdSRyusuke Konishi if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) 626*05fe58fdSRyusuke Konishi return; 627*05fe58fdSRyusuke Konishi 628*05fe58fdSRyusuke Konishi blocksize = sb->s_blocksize; 629*05fe58fdSRyusuke Konishi blkoff = (inode->i_size + blocksize - 1) >> sb->s_blocksize_bits; 630*05fe58fdSRyusuke Konishi ret = nilfs_transaction_begin(sb, &ti, 0); 631*05fe58fdSRyusuke Konishi BUG_ON(ret); 632*05fe58fdSRyusuke Konishi 633*05fe58fdSRyusuke Konishi block_truncate_page(inode->i_mapping, inode->i_size, nilfs_get_block); 634*05fe58fdSRyusuke Konishi 635*05fe58fdSRyusuke Konishi nilfs_truncate_bmap(ii, blkoff); 636*05fe58fdSRyusuke Konishi 637*05fe58fdSRyusuke Konishi inode->i_mtime = inode->i_ctime = CURRENT_TIME; 638*05fe58fdSRyusuke Konishi if (IS_SYNC(inode)) 639*05fe58fdSRyusuke Konishi nilfs_set_transaction_flag(NILFS_TI_SYNC); 640*05fe58fdSRyusuke Konishi 641*05fe58fdSRyusuke Konishi nilfs_set_file_dirty(NILFS_SB(sb), inode, 0); 642*05fe58fdSRyusuke Konishi nilfs_transaction_end(sb, 1); 643*05fe58fdSRyusuke Konishi /* May construct a logical segment and may fail in sync mode. 644*05fe58fdSRyusuke Konishi But truncate has no return value. */ 645*05fe58fdSRyusuke Konishi } 646*05fe58fdSRyusuke Konishi 647*05fe58fdSRyusuke Konishi void nilfs_delete_inode(struct inode *inode) 648*05fe58fdSRyusuke Konishi { 649*05fe58fdSRyusuke Konishi struct nilfs_transaction_info ti; 650*05fe58fdSRyusuke Konishi struct super_block *sb = inode->i_sb; 651*05fe58fdSRyusuke Konishi struct nilfs_inode_info *ii = NILFS_I(inode); 652*05fe58fdSRyusuke Konishi int err; 653*05fe58fdSRyusuke Konishi 654*05fe58fdSRyusuke Konishi if (unlikely(is_bad_inode(inode))) { 655*05fe58fdSRyusuke Konishi if (inode->i_data.nrpages) 656*05fe58fdSRyusuke Konishi truncate_inode_pages(&inode->i_data, 0); 657*05fe58fdSRyusuke Konishi clear_inode(inode); 658*05fe58fdSRyusuke Konishi return; 659*05fe58fdSRyusuke Konishi } 660*05fe58fdSRyusuke Konishi err = nilfs_transaction_begin(sb, &ti, 0); 661*05fe58fdSRyusuke Konishi BUG_ON(err); 662*05fe58fdSRyusuke Konishi if (inode->i_data.nrpages) 663*05fe58fdSRyusuke Konishi truncate_inode_pages(&inode->i_data, 0); 664*05fe58fdSRyusuke Konishi 665*05fe58fdSRyusuke Konishi nilfs_truncate_bmap(ii, 0); 666*05fe58fdSRyusuke Konishi nilfs_free_inode(inode); 667*05fe58fdSRyusuke Konishi /* nilfs_free_inode() marks inode buffer dirty */ 668*05fe58fdSRyusuke Konishi if (IS_SYNC(inode)) 669*05fe58fdSRyusuke Konishi nilfs_set_transaction_flag(NILFS_TI_SYNC); 670*05fe58fdSRyusuke Konishi nilfs_transaction_end(sb, 1); 671*05fe58fdSRyusuke Konishi /* May construct a logical segment and may fail in sync mode. 672*05fe58fdSRyusuke Konishi But delete_inode has no return value. */ 673*05fe58fdSRyusuke Konishi } 674*05fe58fdSRyusuke Konishi 675*05fe58fdSRyusuke Konishi int nilfs_setattr(struct dentry *dentry, struct iattr *iattr) 676*05fe58fdSRyusuke Konishi { 677*05fe58fdSRyusuke Konishi struct nilfs_transaction_info ti; 678*05fe58fdSRyusuke Konishi struct inode *inode = dentry->d_inode; 679*05fe58fdSRyusuke Konishi struct super_block *sb = inode->i_sb; 680*05fe58fdSRyusuke Konishi int err, err2; 681*05fe58fdSRyusuke Konishi 682*05fe58fdSRyusuke Konishi err = inode_change_ok(inode, iattr); 683*05fe58fdSRyusuke Konishi if (err) 684*05fe58fdSRyusuke Konishi return err; 685*05fe58fdSRyusuke Konishi 686*05fe58fdSRyusuke Konishi err = nilfs_transaction_begin(sb, &ti, 0); 687*05fe58fdSRyusuke Konishi if (unlikely(err)) 688*05fe58fdSRyusuke Konishi return err; 689*05fe58fdSRyusuke Konishi err = inode_setattr(inode, iattr); 690*05fe58fdSRyusuke Konishi if (!err && (iattr->ia_valid & ATTR_MODE)) 691*05fe58fdSRyusuke Konishi err = nilfs_acl_chmod(inode); 692*05fe58fdSRyusuke Konishi err2 = nilfs_transaction_end(sb, 1); 693*05fe58fdSRyusuke Konishi return err ? : err2; 694*05fe58fdSRyusuke Konishi } 695*05fe58fdSRyusuke Konishi 696*05fe58fdSRyusuke Konishi int nilfs_load_inode_block(struct nilfs_sb_info *sbi, struct inode *inode, 697*05fe58fdSRyusuke Konishi struct buffer_head **pbh) 698*05fe58fdSRyusuke Konishi { 699*05fe58fdSRyusuke Konishi struct nilfs_inode_info *ii = NILFS_I(inode); 700*05fe58fdSRyusuke Konishi int err; 701*05fe58fdSRyusuke Konishi 702*05fe58fdSRyusuke Konishi spin_lock(&sbi->s_inode_lock); 703*05fe58fdSRyusuke Konishi /* Caller of this function MUST lock s_inode_lock */ 704*05fe58fdSRyusuke Konishi if (ii->i_bh == NULL) { 705*05fe58fdSRyusuke Konishi spin_unlock(&sbi->s_inode_lock); 706*05fe58fdSRyusuke Konishi err = nilfs_ifile_get_inode_block(sbi->s_ifile, inode->i_ino, 707*05fe58fdSRyusuke Konishi pbh); 708*05fe58fdSRyusuke Konishi if (unlikely(err)) 709*05fe58fdSRyusuke Konishi return err; 710*05fe58fdSRyusuke Konishi spin_lock(&sbi->s_inode_lock); 711*05fe58fdSRyusuke Konishi if (ii->i_bh == NULL) 712*05fe58fdSRyusuke Konishi ii->i_bh = *pbh; 713*05fe58fdSRyusuke Konishi else { 714*05fe58fdSRyusuke Konishi brelse(*pbh); 715*05fe58fdSRyusuke Konishi *pbh = ii->i_bh; 716*05fe58fdSRyusuke Konishi } 717*05fe58fdSRyusuke Konishi } else 718*05fe58fdSRyusuke Konishi *pbh = ii->i_bh; 719*05fe58fdSRyusuke Konishi 720*05fe58fdSRyusuke Konishi get_bh(*pbh); 721*05fe58fdSRyusuke Konishi spin_unlock(&sbi->s_inode_lock); 722*05fe58fdSRyusuke Konishi return 0; 723*05fe58fdSRyusuke Konishi } 724*05fe58fdSRyusuke Konishi 725*05fe58fdSRyusuke Konishi int nilfs_inode_dirty(struct inode *inode) 726*05fe58fdSRyusuke Konishi { 727*05fe58fdSRyusuke Konishi struct nilfs_inode_info *ii = NILFS_I(inode); 728*05fe58fdSRyusuke Konishi struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb); 729*05fe58fdSRyusuke Konishi int ret = 0; 730*05fe58fdSRyusuke Konishi 731*05fe58fdSRyusuke Konishi if (!list_empty(&ii->i_dirty)) { 732*05fe58fdSRyusuke Konishi spin_lock(&sbi->s_inode_lock); 733*05fe58fdSRyusuke Konishi ret = test_bit(NILFS_I_DIRTY, &ii->i_state) || 734*05fe58fdSRyusuke Konishi test_bit(NILFS_I_BUSY, &ii->i_state); 735*05fe58fdSRyusuke Konishi spin_unlock(&sbi->s_inode_lock); 736*05fe58fdSRyusuke Konishi } 737*05fe58fdSRyusuke Konishi return ret; 738*05fe58fdSRyusuke Konishi } 739*05fe58fdSRyusuke Konishi 740*05fe58fdSRyusuke Konishi int nilfs_set_file_dirty(struct nilfs_sb_info *sbi, struct inode *inode, 741*05fe58fdSRyusuke Konishi unsigned nr_dirty) 742*05fe58fdSRyusuke Konishi { 743*05fe58fdSRyusuke Konishi struct nilfs_inode_info *ii = NILFS_I(inode); 744*05fe58fdSRyusuke Konishi 745*05fe58fdSRyusuke Konishi atomic_add(nr_dirty, &sbi->s_nilfs->ns_ndirtyblks); 746*05fe58fdSRyusuke Konishi 747*05fe58fdSRyusuke Konishi if (test_and_set_bit(NILFS_I_DIRTY, &ii->i_state) || 748*05fe58fdSRyusuke Konishi unlikely(inode->i_ino == NILFS_SKETCH_INO)) 749*05fe58fdSRyusuke Konishi return 0; 750*05fe58fdSRyusuke Konishi 751*05fe58fdSRyusuke Konishi spin_lock(&sbi->s_inode_lock); 752*05fe58fdSRyusuke Konishi if (!test_bit(NILFS_I_QUEUED, &ii->i_state) && 753*05fe58fdSRyusuke Konishi !test_bit(NILFS_I_BUSY, &ii->i_state)) { 754*05fe58fdSRyusuke Konishi /* Because this routine may race with nilfs_dispose_list(), 755*05fe58fdSRyusuke Konishi we have to check NILFS_I_QUEUED here, too. */ 756*05fe58fdSRyusuke Konishi if (list_empty(&ii->i_dirty) && igrab(inode) == NULL) { 757*05fe58fdSRyusuke Konishi /* This will happen when somebody is freeing 758*05fe58fdSRyusuke Konishi this inode. */ 759*05fe58fdSRyusuke Konishi nilfs_warning(sbi->s_super, __func__, 760*05fe58fdSRyusuke Konishi "cannot get inode (ino=%lu)\n", 761*05fe58fdSRyusuke Konishi inode->i_ino); 762*05fe58fdSRyusuke Konishi spin_unlock(&sbi->s_inode_lock); 763*05fe58fdSRyusuke Konishi return -EINVAL; /* NILFS_I_DIRTY may remain for 764*05fe58fdSRyusuke Konishi freeing inode */ 765*05fe58fdSRyusuke Konishi } 766*05fe58fdSRyusuke Konishi list_del(&ii->i_dirty); 767*05fe58fdSRyusuke Konishi list_add_tail(&ii->i_dirty, &sbi->s_dirty_files); 768*05fe58fdSRyusuke Konishi set_bit(NILFS_I_QUEUED, &ii->i_state); 769*05fe58fdSRyusuke Konishi } 770*05fe58fdSRyusuke Konishi spin_unlock(&sbi->s_inode_lock); 771*05fe58fdSRyusuke Konishi return 0; 772*05fe58fdSRyusuke Konishi } 773*05fe58fdSRyusuke Konishi 774*05fe58fdSRyusuke Konishi int nilfs_mark_inode_dirty(struct inode *inode) 775*05fe58fdSRyusuke Konishi { 776*05fe58fdSRyusuke Konishi struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb); 777*05fe58fdSRyusuke Konishi struct buffer_head *ibh; 778*05fe58fdSRyusuke Konishi int err; 779*05fe58fdSRyusuke Konishi 780*05fe58fdSRyusuke Konishi err = nilfs_load_inode_block(sbi, inode, &ibh); 781*05fe58fdSRyusuke Konishi if (unlikely(err)) { 782*05fe58fdSRyusuke Konishi nilfs_warning(inode->i_sb, __func__, 783*05fe58fdSRyusuke Konishi "failed to reget inode block.\n"); 784*05fe58fdSRyusuke Konishi return err; 785*05fe58fdSRyusuke Konishi } 786*05fe58fdSRyusuke Konishi lock_buffer(ibh); 787*05fe58fdSRyusuke Konishi nilfs_update_inode(inode, ibh); 788*05fe58fdSRyusuke Konishi unlock_buffer(ibh); 789*05fe58fdSRyusuke Konishi nilfs_mdt_mark_buffer_dirty(ibh); 790*05fe58fdSRyusuke Konishi nilfs_mdt_mark_dirty(sbi->s_ifile); 791*05fe58fdSRyusuke Konishi brelse(ibh); 792*05fe58fdSRyusuke Konishi return 0; 793*05fe58fdSRyusuke Konishi } 794*05fe58fdSRyusuke Konishi 795*05fe58fdSRyusuke Konishi /** 796*05fe58fdSRyusuke Konishi * nilfs_dirty_inode - reflect changes on given inode to an inode block. 797*05fe58fdSRyusuke Konishi * @inode: inode of the file to be registered. 798*05fe58fdSRyusuke Konishi * 799*05fe58fdSRyusuke Konishi * nilfs_dirty_inode() loads a inode block containing the specified 800*05fe58fdSRyusuke Konishi * @inode and copies data from a nilfs_inode to a corresponding inode 801*05fe58fdSRyusuke Konishi * entry in the inode block. This operation is excluded from the segment 802*05fe58fdSRyusuke Konishi * construction. This function can be called both as a single operation 803*05fe58fdSRyusuke Konishi * and as a part of indivisible file operations. 804*05fe58fdSRyusuke Konishi */ 805*05fe58fdSRyusuke Konishi void nilfs_dirty_inode(struct inode *inode) 806*05fe58fdSRyusuke Konishi { 807*05fe58fdSRyusuke Konishi struct nilfs_transaction_info ti; 808*05fe58fdSRyusuke Konishi 809*05fe58fdSRyusuke Konishi if (is_bad_inode(inode)) { 810*05fe58fdSRyusuke Konishi nilfs_warning(inode->i_sb, __func__, 811*05fe58fdSRyusuke Konishi "tried to mark bad_inode dirty. ignored.\n"); 812*05fe58fdSRyusuke Konishi dump_stack(); 813*05fe58fdSRyusuke Konishi return; 814*05fe58fdSRyusuke Konishi } 815*05fe58fdSRyusuke Konishi nilfs_transaction_begin(inode->i_sb, &ti, 0); 816*05fe58fdSRyusuke Konishi if (likely(inode->i_ino != NILFS_SKETCH_INO)) 817*05fe58fdSRyusuke Konishi nilfs_mark_inode_dirty(inode); 818*05fe58fdSRyusuke Konishi nilfs_transaction_end(inode->i_sb, 1); /* never fails */ 819*05fe58fdSRyusuke Konishi } 820