Lines Matching refs:inode

35 static int ext3_writepage_trans_blocks(struct inode *inode);
36 static int ext3_block_truncate_page(struct inode *inode, loff_t from);
41 static int ext3_inode_is_fast_symlink(struct inode *inode) in ext3_inode_is_fast_symlink() argument
43 int ea_blocks = EXT3_I(inode)->i_file_acl ? in ext3_inode_is_fast_symlink()
44 (inode->i_sb->s_blocksize >> 9) : 0; in ext3_inode_is_fast_symlink()
46 return (S_ISLNK(inode->i_mode) && inode->i_blocks - ea_blocks == 0); in ext3_inode_is_fast_symlink()
58 int ext3_forget(handle_t *handle, int is_metadata, struct inode *inode, in ext3_forget() argument
65 trace_ext3_forget(inode, is_metadata, blocknr); in ext3_forget()
70 bh, is_metadata, inode->i_mode, in ext3_forget()
71 test_opt(inode->i_sb, DATA_FLAGS)); in ext3_forget()
78 if (test_opt(inode->i_sb, DATA_FLAGS) == EXT3_MOUNT_JOURNAL_DATA || in ext3_forget()
79 (!is_metadata && !ext3_should_journal_data(inode))) { in ext3_forget()
93 ext3_abort(inode->i_sb, __func__, in ext3_forget()
103 static unsigned long blocks_for_truncate(struct inode *inode) in blocks_for_truncate() argument
107 needed = inode->i_blocks >> (inode->i_sb->s_blocksize_bits - 9); in blocks_for_truncate()
123 return EXT3_DATA_TRANS_BLOCKS(inode->i_sb) + needed; in blocks_for_truncate()
136 static handle_t *start_transaction(struct inode *inode) in start_transaction() argument
140 result = ext3_journal_start(inode, blocks_for_truncate(inode)); in start_transaction()
144 ext3_std_error(inode->i_sb, PTR_ERR(result)); in start_transaction()
154 static int try_to_extend_transaction(handle_t *handle, struct inode *inode) in try_to_extend_transaction() argument
158 if (!ext3_journal_extend(handle, blocks_for_truncate(inode))) in try_to_extend_transaction()
168 static int truncate_restart_transaction(handle_t *handle, struct inode *inode) in truncate_restart_transaction() argument
179 mutex_unlock(&EXT3_I(inode)->truncate_mutex); in truncate_restart_transaction()
180 ret = ext3_journal_restart(handle, blocks_for_truncate(inode)); in truncate_restart_transaction()
181 mutex_lock(&EXT3_I(inode)->truncate_mutex); in truncate_restart_transaction()
188 void ext3_evict_inode (struct inode *inode) in ext3_evict_inode() argument
190 struct ext3_inode_info *ei = EXT3_I(inode); in ext3_evict_inode()
195 trace_ext3_evict_inode(inode); in ext3_evict_inode()
196 if (!inode->i_nlink && !is_bad_inode(inode)) { in ext3_evict_inode()
197 dquot_initialize(inode); in ext3_evict_inode()
220 if (inode->i_nlink && ext3_should_journal_data(inode) && in ext3_evict_inode()
221 EXT3_SB(inode->i_sb)->s_journal && in ext3_evict_inode()
222 (S_ISLNK(inode->i_mode) || S_ISREG(inode->i_mode)) && in ext3_evict_inode()
223 inode->i_ino != EXT3_JOURNAL_INO) { in ext3_evict_inode()
225 journal_t *journal = EXT3_SB(inode->i_sb)->s_journal; in ext3_evict_inode()
229 filemap_write_and_wait(&inode->i_data); in ext3_evict_inode()
231 truncate_inode_pages_final(&inode->i_data); in ext3_evict_inode()
233 ext3_discard_reservation(inode); in ext3_evict_inode()
242 handle = start_transaction(inode); in ext3_evict_inode()
249 ext3_orphan_del(NULL, inode); in ext3_evict_inode()
253 if (IS_SYNC(inode)) in ext3_evict_inode()
255 inode->i_size = 0; in ext3_evict_inode()
256 if (inode->i_blocks) in ext3_evict_inode()
257 ext3_truncate(inode); in ext3_evict_inode()
264 ext3_orphan_del(handle, inode); in ext3_evict_inode()
274 if (ext3_mark_inode_dirty(handle, inode)) { in ext3_evict_inode()
276 dquot_drop(inode); in ext3_evict_inode()
277 clear_inode(inode); in ext3_evict_inode()
279 ext3_xattr_delete_inode(handle, inode); in ext3_evict_inode()
280 dquot_free_inode(inode); in ext3_evict_inode()
281 dquot_drop(inode); in ext3_evict_inode()
282 clear_inode(inode); in ext3_evict_inode()
283 ext3_free_inode(handle, inode); in ext3_evict_inode()
288 clear_inode(inode); in ext3_evict_inode()
289 dquot_drop(inode); in ext3_evict_inode()
342 static int ext3_block_to_path(struct inode *inode, in ext3_block_to_path() argument
345 int ptrs = EXT3_ADDR_PER_BLOCK(inode->i_sb); in ext3_block_to_path()
346 int ptrs_bits = EXT3_ADDR_PER_BLOCK_BITS(inode->i_sb); in ext3_block_to_path()
354 ext3_warning (inode->i_sb, "ext3_block_to_path", "block < 0"); in ext3_block_to_path()
374 ext3_warning(inode->i_sb, "ext3_block_to_path", "block > big"); in ext3_block_to_path()
410 static Indirect *ext3_get_branch(struct inode *inode, int depth, int *offsets, in ext3_get_branch() argument
413 struct super_block *sb = inode->i_sb; in ext3_get_branch()
419 add_chain (chain, NULL, EXT3_I(inode)->i_data + *offsets); in ext3_get_branch()
466 static ext3_fsblk_t ext3_find_near(struct inode *inode, Indirect *ind) in ext3_find_near() argument
468 struct ext3_inode_info *ei = EXT3_I(inode); in ext3_find_near()
488 bg_start = ext3_group_first_block_no(inode->i_sb, ei->i_block_group); in ext3_find_near()
490 (EXT3_BLOCKS_PER_GROUP(inode->i_sb) / 16); in ext3_find_near()
504 static ext3_fsblk_t ext3_find_goal(struct inode *inode, long block, in ext3_find_goal() argument
509 block_i = EXT3_I(inode)->i_block_alloc_info; in ext3_find_goal()
520 return ext3_find_near(inode, partial); in ext3_find_goal()
575 static int ext3_alloc_blocks(handle_t *handle, struct inode *inode, in ext3_alloc_blocks() argument
598 current_block = ext3_new_blocks(handle,inode,goal,&count,err); in ext3_alloc_blocks()
622 ext3_free_blocks(handle, inode, new_blocks[i], 1); in ext3_alloc_blocks()
653 static int ext3_alloc_branch(handle_t *handle, struct inode *inode, in ext3_alloc_branch() argument
657 int blocksize = inode->i_sb->s_blocksize; in ext3_alloc_branch()
665 num = ext3_alloc_blocks(handle, inode, goal, indirect_blks, in ext3_alloc_branch()
680 bh = sb_getblk(inode->i_sb, new_blocks[n-1]); in ext3_alloc_branch()
727 ext3_free_blocks(handle, inode, new_blocks[i], 1); in ext3_alloc_branch()
729 ext3_free_blocks(handle, inode, new_blocks[i], num); in ext3_alloc_branch()
747 static int ext3_splice_branch(handle_t *handle, struct inode *inode, in ext3_splice_branch() argument
754 struct ext3_inode_info *ei = EXT3_I(inode); in ext3_splice_branch()
796 if (!timespec_equal(&inode->i_ctime, &now) || !where->bh) { in ext3_splice_branch()
797 inode->i_ctime = now; in ext3_splice_branch()
798 ext3_mark_inode_dirty(handle, inode); in ext3_splice_branch()
831 ext3_free_blocks(handle,inode,le32_to_cpu(where[i-1].key),1); in ext3_splice_branch()
833 ext3_free_blocks(handle, inode, le32_to_cpu(where[num].key), blks); in ext3_splice_branch()
857 int ext3_get_blocks_handle(handle_t *handle, struct inode *inode, in ext3_get_blocks_handle() argument
870 struct ext3_inode_info *ei = EXT3_I(inode); in ext3_get_blocks_handle()
875 trace_ext3_get_blocks_enter(inode, iblock, maxblocks, create); in ext3_get_blocks_handle()
877 depth = ext3_block_to_path(inode,iblock,offsets,&blocks_to_boundary); in ext3_get_blocks_handle()
882 partial = ext3_get_branch(inode, depth, offsets, chain, &err); in ext3_get_blocks_handle()
942 partial = ext3_get_branch(inode, depth, offsets, chain, &err); in ext3_get_blocks_handle()
957 if (S_ISREG(inode->i_mode) && (!ei->i_block_alloc_info)) in ext3_get_blocks_handle()
958 ext3_init_block_alloc_info(inode); in ext3_get_blocks_handle()
960 goal = ext3_find_goal(inode, iblock, partial); in ext3_get_blocks_handle()
971 err = ext3_alloc_branch(handle, inode, indirect_blks, &count, goal, in ext3_get_blocks_handle()
982 err = ext3_splice_branch(handle, inode, iblock, in ext3_get_blocks_handle()
990 map_bh(bh_result, inode->i_sb, le32_to_cpu(chain[depth-1].key)); in ext3_get_blocks_handle()
1004 trace_ext3_get_blocks_exit(inode, iblock, in ext3_get_blocks_handle()
1021 static int ext3_get_block(struct inode *inode, sector_t iblock, in ext3_get_block() argument
1026 unsigned max_blocks = bh_result->b_size >> inode->i_blkbits; in ext3_get_block()
1031 handle = ext3_journal_start(inode, DIO_CREDITS + in ext3_get_block()
1032 EXT3_MAXQUOTAS_TRANS_BLOCKS(inode->i_sb)); in ext3_get_block()
1040 ret = ext3_get_blocks_handle(handle, inode, iblock, in ext3_get_block()
1043 bh_result->b_size = (ret << inode->i_blkbits); in ext3_get_block()
1052 int ext3_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, in ext3_fiemap() argument
1055 return generic_block_fiemap(inode, fieinfo, start, len, in ext3_fiemap()
1062 struct buffer_head *ext3_getblk(handle_t *handle, struct inode *inode, in ext3_getblk() argument
1073 err = ext3_get_blocks_handle(handle, inode, block, 1, in ext3_getblk()
1086 bh = sb_getblk(inode->i_sb, dummy.b_blocknr); in ext3_getblk()
1106 memset(bh->b_data,0,inode->i_sb->s_blocksize); in ext3_getblk()
1128 struct buffer_head *ext3_bread(handle_t *handle, struct inode *inode, in ext3_bread() argument
1133 bh = ext3_getblk(handle, inode, block, create, err); in ext3_bread()
1234 static void ext3_truncate_failed_write(struct inode *inode) in ext3_truncate_failed_write() argument
1236 truncate_inode_pages(inode->i_mapping, inode->i_size); in ext3_truncate_failed_write()
1237 ext3_truncate(inode); in ext3_truncate_failed_write()
1244 static void ext3_truncate_failed_direct_write(struct inode *inode) in ext3_truncate_failed_direct_write() argument
1246 ext3_block_truncate_page(inode, inode->i_size); in ext3_truncate_failed_direct_write()
1247 ext3_truncate(inode); in ext3_truncate_failed_direct_write()
1254 struct inode *inode = mapping->host; in ext3_write_begin() local
1263 int needed_blocks = ext3_writepage_trans_blocks(inode) + 1; in ext3_write_begin()
1265 trace_ext3_write_begin(inode, pos, len, flags); in ext3_write_begin()
1277 handle = ext3_journal_start(inode, needed_blocks); in ext3_write_begin()
1288 if (ext3_should_journal_data(inode)) { in ext3_write_begin()
1303 if (pos + len > inode->i_size && ext3_can_truncate(inode)) in ext3_write_begin()
1304 ext3_orphan_add(handle, inode); in ext3_write_begin()
1308 if (pos + len > inode->i_size) in ext3_write_begin()
1309 ext3_truncate_failed_write(inode); in ext3_write_begin()
1311 if (ret == -ENOSPC && ext3_should_retry_alloc(inode->i_sb, &retries)) in ext3_write_begin()
1354 static void update_file_sizes(struct inode *inode, loff_t pos, unsigned copied) in update_file_sizes() argument
1357 if (pos + copied > inode->i_size) in update_file_sizes()
1358 i_size_write(inode, pos + copied); in update_file_sizes()
1359 if (pos + copied > EXT3_I(inode)->i_disksize) { in update_file_sizes()
1360 EXT3_I(inode)->i_disksize = pos + copied; in update_file_sizes()
1361 mark_inode_dirty(inode); in update_file_sizes()
1378 struct inode *inode = file->f_mapping->host; in ext3_ordered_write_end() local
1382 trace_ext3_ordered_write_end(inode, pos, len, copied); in ext3_ordered_write_end()
1391 update_file_sizes(inode, pos, copied); in ext3_ordered_write_end()
1396 if (pos + len > inode->i_size && ext3_can_truncate(inode)) in ext3_ordered_write_end()
1397 ext3_orphan_add(handle, inode); in ext3_ordered_write_end()
1404 if (pos + len > inode->i_size) in ext3_ordered_write_end()
1405 ext3_truncate_failed_write(inode); in ext3_ordered_write_end()
1415 struct inode *inode = file->f_mapping->host; in ext3_writeback_write_end() local
1418 trace_ext3_writeback_write_end(inode, pos, len, copied); in ext3_writeback_write_end()
1420 update_file_sizes(inode, pos, copied); in ext3_writeback_write_end()
1425 if (pos + len > inode->i_size && ext3_can_truncate(inode)) in ext3_writeback_write_end()
1426 ext3_orphan_add(handle, inode); in ext3_writeback_write_end()
1431 if (pos + len > inode->i_size) in ext3_writeback_write_end()
1432 ext3_truncate_failed_write(inode); in ext3_writeback_write_end()
1442 struct inode *inode = mapping->host; in ext3_journalled_write_end() local
1443 struct ext3_inode_info *ei = EXT3_I(inode); in ext3_journalled_write_end()
1448 trace_ext3_journalled_write_end(inode, pos, len, copied); in ext3_journalled_write_end()
1464 if (pos + copied > inode->i_size) in ext3_journalled_write_end()
1465 i_size_write(inode, pos + copied); in ext3_journalled_write_end()
1470 if (pos + len > inode->i_size && ext3_can_truncate(inode)) in ext3_journalled_write_end()
1471 ext3_orphan_add(handle, inode); in ext3_journalled_write_end()
1472 ext3_set_inode_state(inode, EXT3_STATE_JDATA); in ext3_journalled_write_end()
1474 if (inode->i_size > ei->i_disksize) { in ext3_journalled_write_end()
1475 ei->i_disksize = inode->i_size; in ext3_journalled_write_end()
1476 ret2 = ext3_mark_inode_dirty(handle, inode); in ext3_journalled_write_end()
1487 if (pos + len > inode->i_size) in ext3_journalled_write_end()
1488 ext3_truncate_failed_write(inode); in ext3_journalled_write_end()
1508 struct inode *inode = mapping->host; in ext3_bmap() local
1512 if (ext3_test_inode_state(inode, EXT3_STATE_JDATA)) { in ext3_bmap()
1531 ext3_clear_inode_state(inode, EXT3_STATE_JDATA); in ext3_bmap()
1532 journal = EXT3_JOURNAL(inode); in ext3_bmap()
1577 struct inode *inode = page->mapping->host; in ext3_ordered_writepage() local
1589 WARN_ON_ONCE(IS_RDONLY(inode) && in ext3_ordered_writepage()
1590 !(EXT3_SB(inode->i_sb)->s_mount_state & EXT3_ERROR_FS)); in ext3_ordered_writepage()
1601 create_empty_buffers(page, inode->i_sb->s_blocksize, in ext3_ordered_writepage()
1613 handle = ext3_journal_start(inode, ext3_writepage_trans_blocks(inode)); in ext3_ordered_writepage()
1656 struct inode *inode = page->mapping->host; in ext3_writeback_writepage() local
1667 WARN_ON_ONCE(IS_RDONLY(inode) && in ext3_writeback_writepage()
1668 !(EXT3_SB(inode->i_sb)->s_mount_state & EXT3_ERROR_FS)); in ext3_writeback_writepage()
1683 handle = ext3_journal_start(inode, ext3_writepage_trans_blocks(inode)); in ext3_writeback_writepage()
1705 struct inode *inode = page->mapping->host; in ext3_journalled_writepage() local
1716 WARN_ON_ONCE(IS_RDONLY(inode) && in ext3_journalled_writepage()
1717 !(EXT3_SB(inode->i_sb)->s_mount_state & EXT3_ERROR_FS)); in ext3_journalled_writepage()
1724 handle = ext3_journal_start(inode, in ext3_journalled_writepage()
1725 ext3_writepage_trans_blocks(inode)); in ext3_journalled_writepage()
1748 ext3_set_inode_state(inode, EXT3_STATE_JDATA); in ext3_journalled_writepage()
1749 atomic_set(&EXT3_I(inode)->i_datasync_tid, in ext3_journalled_writepage()
1827 struct inode *inode = file->f_mapping->host; in ext3_direct_IO() local
1828 struct ext3_inode_info *ei = EXT3_I(inode); in ext3_direct_IO()
1835 trace_ext3_direct_IO_enter(inode, offset, count, iov_iter_rw(iter)); in ext3_direct_IO()
1840 if (final_size > inode->i_size) { in ext3_direct_IO()
1842 handle = ext3_journal_start(inode, 2); in ext3_direct_IO()
1847 ret = ext3_orphan_add(handle, inode); in ext3_direct_IO()
1853 ei->i_disksize = inode->i_size; in ext3_direct_IO()
1859 ret = blockdev_direct_IO(iocb, inode, iter, offset, ext3_get_block); in ext3_direct_IO()
1865 loff_t isize = i_size_read(inode); in ext3_direct_IO()
1869 ext3_truncate_failed_direct_write(inode); in ext3_direct_IO()
1871 if (ret == -ENOSPC && ext3_should_retry_alloc(inode->i_sb, &retries)) in ext3_direct_IO()
1878 handle = ext3_journal_start(inode, 2); in ext3_direct_IO()
1883 ext3_truncate_failed_direct_write(inode); in ext3_direct_IO()
1885 if (inode->i_nlink) in ext3_direct_IO()
1886 ext3_orphan_del(NULL, inode); in ext3_direct_IO()
1889 if (inode->i_nlink) in ext3_direct_IO()
1890 ext3_orphan_del(handle, inode); in ext3_direct_IO()
1893 if (end > inode->i_size) { in ext3_direct_IO()
1895 i_size_write(inode, end); in ext3_direct_IO()
1903 ext3_mark_inode_dirty(handle, inode); in ext3_direct_IO()
1911 trace_ext3_direct_IO_exit(inode, offset, count, iov_iter_rw(iter), ret); in ext3_direct_IO()
1979 void ext3_set_aops(struct inode *inode) in ext3_set_aops() argument
1981 if (ext3_should_order_data(inode)) in ext3_set_aops()
1982 inode->i_mapping->a_ops = &ext3_ordered_aops; in ext3_set_aops()
1983 else if (ext3_should_writeback_data(inode)) in ext3_set_aops()
1984 inode->i_mapping->a_ops = &ext3_writeback_aops; in ext3_set_aops()
1986 inode->i_mapping->a_ops = &ext3_journalled_aops; in ext3_set_aops()
1995 static int ext3_block_truncate_page(struct inode *inode, loff_t from) in ext3_block_truncate_page() argument
2006 blocksize = inode->i_sb->s_blocksize; in ext3_block_truncate_page()
2010 page = grab_cache_page(inode->i_mapping, index); in ext3_block_truncate_page()
2014 iblock = index << (PAGE_CACHE_SHIFT - inode->i_sb->s_blocksize_bits); in ext3_block_truncate_page()
2036 ext3_get_block(inode, iblock, bh, 0); in ext3_block_truncate_page()
2056 if (!ext3_should_writeback_data(inode)) { in ext3_block_truncate_page()
2058 handle = ext3_journal_start(inode, 1); in ext3_block_truncate_page()
2067 if (ext3_should_journal_data(inode)) { in ext3_block_truncate_page()
2078 if (ext3_should_journal_data(inode)) { in ext3_block_truncate_page()
2081 if (ext3_should_order_data(inode)) in ext3_block_truncate_page()
2143 static Indirect *ext3_find_shared(struct inode *inode, int depth, in ext3_find_shared() argument
2153 partial = ext3_get_branch(inode, k, offsets, chain, &err); in ext3_find_shared()
2199 static void ext3_clear_blocks(handle_t *handle, struct inode *inode, in ext3_clear_blocks() argument
2204 if (try_to_extend_transaction(handle, inode)) { in ext3_clear_blocks()
2210 ext3_mark_inode_dirty(handle, inode); in ext3_clear_blocks()
2211 truncate_restart_transaction(handle, inode); in ext3_clear_blocks()
2233 bh = sb_find_get_block(inode->i_sb, nr); in ext3_clear_blocks()
2234 ext3_forget(handle, 0, inode, bh, nr); in ext3_clear_blocks()
2238 ext3_free_blocks(handle, inode, block_to_free, count); in ext3_clear_blocks()
2260 static void ext3_free_data(handle_t *handle, struct inode *inode, in ext3_free_data() argument
2294 ext3_clear_blocks(handle, inode, this_bh, in ext3_free_data()
2305 ext3_clear_blocks(handle, inode, this_bh, block_to_free, in ext3_free_data()
2320 ext3_error(inode->i_sb, "ext3_free_data", in ext3_free_data()
2323 inode->i_ino, in ext3_free_data()
2341 static void ext3_free_branches(handle_t *handle, struct inode *inode, in ext3_free_branches() argument
2353 int addr_per_block = EXT3_ADDR_PER_BLOCK(inode->i_sb); in ext3_free_branches()
2361 bh = sb_bread(inode->i_sb, nr); in ext3_free_branches()
2368 ext3_error(inode->i_sb, "ext3_free_branches", in ext3_free_branches()
2370 inode->i_ino, nr); in ext3_free_branches()
2376 ext3_free_branches(handle, inode, bh, in ext3_free_branches()
2399 if (try_to_extend_transaction(handle, inode)) { in ext3_free_branches()
2400 ext3_mark_inode_dirty(handle, inode); in ext3_free_branches()
2401 truncate_restart_transaction(handle, inode); in ext3_free_branches()
2427 ext3_forget(handle, 1, inode, bh, bh->b_blocknr); in ext3_free_branches()
2429 ext3_free_blocks(handle, inode, nr, 1); in ext3_free_branches()
2450 ext3_free_data(handle, inode, parent_bh, first, last); in ext3_free_branches()
2454 int ext3_can_truncate(struct inode *inode) in ext3_can_truncate() argument
2456 if (S_ISREG(inode->i_mode)) in ext3_can_truncate()
2458 if (S_ISDIR(inode->i_mode)) in ext3_can_truncate()
2460 if (S_ISLNK(inode->i_mode)) in ext3_can_truncate()
2461 return !ext3_inode_is_fast_symlink(inode); in ext3_can_truncate()
2493 void ext3_truncate(struct inode *inode) in ext3_truncate() argument
2496 struct ext3_inode_info *ei = EXT3_I(inode); in ext3_truncate()
2498 int addr_per_block = EXT3_ADDR_PER_BLOCK(inode->i_sb); in ext3_truncate()
2505 unsigned blocksize = inode->i_sb->s_blocksize; in ext3_truncate()
2507 trace_ext3_truncate_enter(inode); in ext3_truncate()
2509 if (!ext3_can_truncate(inode)) in ext3_truncate()
2512 if (inode->i_size == 0 && ext3_should_writeback_data(inode)) in ext3_truncate()
2513 ext3_set_inode_state(inode, EXT3_STATE_FLUSH_ON_CLOSE); in ext3_truncate()
2515 handle = start_transaction(inode); in ext3_truncate()
2519 last_block = (inode->i_size + blocksize-1) in ext3_truncate()
2520 >> EXT3_BLOCK_SIZE_BITS(inode->i_sb); in ext3_truncate()
2521 n = ext3_block_to_path(inode, last_block, offsets, NULL); in ext3_truncate()
2534 if (ext3_orphan_add(handle, inode)) in ext3_truncate()
2544 ei->i_disksize = inode->i_size; in ext3_truncate()
2553 ext3_free_data(handle, inode, NULL, i_data+offsets[0], in ext3_truncate()
2558 partial = ext3_find_shared(inode, n, offsets, chain, &nr); in ext3_truncate()
2563 ext3_free_branches(handle, inode, NULL, in ext3_truncate()
2572 ext3_free_branches(handle, inode, partial->bh, in ext3_truncate()
2579 ext3_free_branches(handle, inode, partial->bh, partial->p + 1, in ext3_truncate()
2592 ext3_free_branches(handle, inode, NULL, &nr, &nr+1, 1); in ext3_truncate()
2598 ext3_free_branches(handle, inode, NULL, &nr, &nr+1, 2); in ext3_truncate()
2604 ext3_free_branches(handle, inode, NULL, &nr, &nr+1, 3); in ext3_truncate()
2611 ext3_discard_reservation(inode); in ext3_truncate()
2614 inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC; in ext3_truncate()
2615 ext3_mark_inode_dirty(handle, inode); in ext3_truncate()
2621 if (IS_SYNC(inode)) in ext3_truncate()
2631 if (inode->i_nlink) in ext3_truncate()
2632 ext3_orphan_del(handle, inode); in ext3_truncate()
2635 trace_ext3_truncate_exit(inode); in ext3_truncate()
2642 if (inode->i_nlink) in ext3_truncate()
2643 ext3_orphan_del(NULL, inode); in ext3_truncate()
2644 trace_ext3_truncate_exit(inode); in ext3_truncate()
2687 static int __ext3_get_inode_loc(struct inode *inode, in __ext3_get_inode_loc() argument
2693 block = ext3_get_inode_block(inode->i_sb, inode->i_ino, iloc); in __ext3_get_inode_loc()
2697 bh = sb_getblk(inode->i_sb, block); in __ext3_get_inode_loc()
2699 ext3_error (inode->i_sb, "ext3_get_inode_loc", in __ext3_get_inode_loc()
2702 inode->i_ino, block); in __ext3_get_inode_loc()
2736 block_group = (inode->i_ino - 1) / in __ext3_get_inode_loc()
2737 EXT3_INODES_PER_GROUP(inode->i_sb); in __ext3_get_inode_loc()
2739 EXT3_INODE_SIZE(inode->i_sb); in __ext3_get_inode_loc()
2740 inode_offset = ((inode->i_ino - 1) % in __ext3_get_inode_loc()
2741 EXT3_INODES_PER_GROUP(inode->i_sb)); in __ext3_get_inode_loc()
2745 desc = ext3_get_group_desc(inode->i_sb, in __ext3_get_inode_loc()
2750 bitmap_bh = sb_getblk(inode->i_sb, in __ext3_get_inode_loc()
2786 trace_ext3_load_inode(inode); in __ext3_get_inode_loc()
2792 ext3_error(inode->i_sb, "ext3_get_inode_loc", in __ext3_get_inode_loc()
2795 inode->i_ino, block); in __ext3_get_inode_loc()
2805 int ext3_get_inode_loc(struct inode *inode, struct ext3_iloc *iloc) in ext3_get_inode_loc() argument
2808 return __ext3_get_inode_loc(inode, iloc, in ext3_get_inode_loc()
2809 !ext3_test_inode_state(inode, EXT3_STATE_XATTR)); in ext3_get_inode_loc()
2812 void ext3_set_inode_flags(struct inode *inode) in ext3_set_inode_flags() argument
2814 unsigned int flags = EXT3_I(inode)->i_flags; in ext3_set_inode_flags()
2816 inode->i_flags &= ~(S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC); in ext3_set_inode_flags()
2818 inode->i_flags |= S_SYNC; in ext3_set_inode_flags()
2820 inode->i_flags |= S_APPEND; in ext3_set_inode_flags()
2822 inode->i_flags |= S_IMMUTABLE; in ext3_set_inode_flags()
2824 inode->i_flags |= S_NOATIME; in ext3_set_inode_flags()
2826 inode->i_flags |= S_DIRSYNC; in ext3_set_inode_flags()
2848 struct inode *ext3_iget(struct super_block *sb, unsigned long ino) in ext3_iget()
2854 struct inode *inode; in ext3_iget() local
2862 inode = iget_locked(sb, ino); in ext3_iget()
2863 if (!inode) in ext3_iget()
2865 if (!(inode->i_state & I_NEW)) in ext3_iget()
2866 return inode; in ext3_iget()
2868 ei = EXT3_I(inode); in ext3_iget()
2871 ret = __ext3_get_inode_loc(inode, &iloc, 0); in ext3_iget()
2876 inode->i_mode = le16_to_cpu(raw_inode->i_mode); in ext3_iget()
2879 if(!(test_opt (inode->i_sb, NO_UID32))) { in ext3_iget()
2883 i_uid_write(inode, i_uid); in ext3_iget()
2884 i_gid_write(inode, i_gid); in ext3_iget()
2885 set_nlink(inode, le16_to_cpu(raw_inode->i_links_count)); in ext3_iget()
2886 inode->i_size = le32_to_cpu(raw_inode->i_size); in ext3_iget()
2887 inode->i_atime.tv_sec = (signed)le32_to_cpu(raw_inode->i_atime); in ext3_iget()
2888 inode->i_ctime.tv_sec = (signed)le32_to_cpu(raw_inode->i_ctime); in ext3_iget()
2889 inode->i_mtime.tv_sec = (signed)le32_to_cpu(raw_inode->i_mtime); in ext3_iget()
2890 inode->i_atime.tv_nsec = inode->i_ctime.tv_nsec = inode->i_mtime.tv_nsec = 0; in ext3_iget()
2900 if (inode->i_nlink == 0) { in ext3_iget()
2901 if (inode->i_mode == 0 || in ext3_iget()
2902 !(EXT3_SB(inode->i_sb)->s_mount_state & EXT3_ORPHAN_FS)) { in ext3_iget()
2913 inode->i_blocks = le32_to_cpu(raw_inode->i_blocks); in ext3_iget()
2921 if (!S_ISREG(inode->i_mode)) { in ext3_iget()
2924 inode->i_size |= in ext3_iget()
2927 ei->i_disksize = inode->i_size; in ext3_iget()
2928 inode->i_generation = le32_to_cpu(raw_inode->i_generation); in ext3_iget()
2962 if (inode->i_ino >= EXT3_FIRST_INO(inode->i_sb) + 1 && in ext3_iget()
2963 EXT3_INODE_SIZE(inode->i_sb) > EXT3_GOOD_OLD_INODE_SIZE) { in ext3_iget()
2971 EXT3_INODE_SIZE(inode->i_sb)) { in ext3_iget()
2985 ext3_set_inode_state(inode, EXT3_STATE_XATTR); in ext3_iget()
2990 if (S_ISREG(inode->i_mode)) { in ext3_iget()
2991 inode->i_op = &ext3_file_inode_operations; in ext3_iget()
2992 inode->i_fop = &ext3_file_operations; in ext3_iget()
2993 ext3_set_aops(inode); in ext3_iget()
2994 } else if (S_ISDIR(inode->i_mode)) { in ext3_iget()
2995 inode->i_op = &ext3_dir_inode_operations; in ext3_iget()
2996 inode->i_fop = &ext3_dir_operations; in ext3_iget()
2997 } else if (S_ISLNK(inode->i_mode)) { in ext3_iget()
2998 if (ext3_inode_is_fast_symlink(inode)) { in ext3_iget()
2999 inode->i_op = &ext3_fast_symlink_inode_operations; in ext3_iget()
3000 nd_terminate_link(ei->i_data, inode->i_size, in ext3_iget()
3003 inode->i_op = &ext3_symlink_inode_operations; in ext3_iget()
3004 ext3_set_aops(inode); in ext3_iget()
3007 inode->i_op = &ext3_special_inode_operations; in ext3_iget()
3009 init_special_inode(inode, inode->i_mode, in ext3_iget()
3012 init_special_inode(inode, inode->i_mode, in ext3_iget()
3016 ext3_set_inode_flags(inode); in ext3_iget()
3017 unlock_new_inode(inode); in ext3_iget()
3018 return inode; in ext3_iget()
3021 iget_failed(inode); in ext3_iget()
3033 struct inode *inode, in ext3_do_update_inode() argument
3037 struct ext3_inode_info *ei = EXT3_I(inode); in ext3_do_update_inode()
3051 if (ext3_test_inode_state(inode, EXT3_STATE_NEW)) in ext3_do_update_inode()
3052 memset(raw_inode, 0, EXT3_SB(inode->i_sb)->s_inode_size); in ext3_do_update_inode()
3055 raw_inode->i_mode = cpu_to_le16(inode->i_mode); in ext3_do_update_inode()
3056 i_uid = i_uid_read(inode); in ext3_do_update_inode()
3057 i_gid = i_gid_read(inode); in ext3_do_update_inode()
3058 if(!(test_opt(inode->i_sb, NO_UID32))) { in ext3_do_update_inode()
3082 raw_inode->i_links_count = cpu_to_le16(inode->i_nlink); in ext3_do_update_inode()
3088 raw_inode->i_atime = cpu_to_le32(inode->i_atime.tv_sec); in ext3_do_update_inode()
3089 raw_inode->i_ctime = cpu_to_le32(inode->i_ctime.tv_sec); in ext3_do_update_inode()
3090 raw_inode->i_mtime = cpu_to_le32(inode->i_mtime.tv_sec); in ext3_do_update_inode()
3091 raw_inode->i_blocks = cpu_to_le32(inode->i_blocks); in ext3_do_update_inode()
3100 if (!S_ISREG(inode->i_mode)) { in ext3_do_update_inode()
3109 struct super_block *sb = inode->i_sb; in ext3_do_update_inode()
3134 raw_inode->i_generation = cpu_to_le32(inode->i_generation); in ext3_do_update_inode()
3135 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) { in ext3_do_update_inode()
3136 if (old_valid_dev(inode->i_rdev)) { in ext3_do_update_inode()
3138 cpu_to_le32(old_encode_dev(inode->i_rdev)); in ext3_do_update_inode()
3143 cpu_to_le32(new_encode_dev(inode->i_rdev)); in ext3_do_update_inode()
3157 ext3_clear_inode_state(inode, EXT3_STATE_NEW); in ext3_do_update_inode()
3164 ext3_std_error(inode->i_sb, err); in ext3_do_update_inode()
3202 int ext3_write_inode(struct inode *inode, struct writeback_control *wbc) in ext3_write_inode() argument
3221 return ext3_force_commit(inode->i_sb); in ext3_write_inode()
3243 struct inode *inode = d_inode(dentry); in ext3_setattr() local
3247 error = inode_change_ok(inode, attr); in ext3_setattr()
3251 if (is_quota_modification(inode, attr)) in ext3_setattr()
3252 dquot_initialize(inode); in ext3_setattr()
3253 if ((ia_valid & ATTR_UID && !uid_eq(attr->ia_uid, inode->i_uid)) || in ext3_setattr()
3254 (ia_valid & ATTR_GID && !gid_eq(attr->ia_gid, inode->i_gid))) { in ext3_setattr()
3259 handle = ext3_journal_start(inode, EXT3_MAXQUOTAS_INIT_BLOCKS(inode->i_sb)+ in ext3_setattr()
3260 EXT3_MAXQUOTAS_DEL_BLOCKS(inode->i_sb)+3); in ext3_setattr()
3265 error = dquot_transfer(inode, attr); in ext3_setattr()
3273 inode->i_uid = attr->ia_uid; in ext3_setattr()
3275 inode->i_gid = attr->ia_gid; in ext3_setattr()
3276 error = ext3_mark_inode_dirty(handle, inode); in ext3_setattr()
3281 inode_dio_wait(inode); in ext3_setattr()
3283 if (S_ISREG(inode->i_mode) && in ext3_setattr()
3284 attr->ia_valid & ATTR_SIZE && attr->ia_size < inode->i_size) { in ext3_setattr()
3287 handle = ext3_journal_start(inode, 3); in ext3_setattr()
3293 error = ext3_orphan_add(handle, inode); in ext3_setattr()
3298 EXT3_I(inode)->i_disksize = attr->ia_size; in ext3_setattr()
3299 error = ext3_mark_inode_dirty(handle, inode); in ext3_setattr()
3303 ext3_orphan_del(NULL, inode); in ext3_setattr()
3306 rc = ext3_block_truncate_page(inode, attr->ia_size); in ext3_setattr()
3309 handle = ext3_journal_start(inode, 3); in ext3_setattr()
3311 ext3_orphan_del(NULL, inode); in ext3_setattr()
3314 ext3_orphan_del(handle, inode); in ext3_setattr()
3321 attr->ia_size != i_size_read(inode)) { in ext3_setattr()
3322 truncate_setsize(inode, attr->ia_size); in ext3_setattr()
3323 ext3_truncate(inode); in ext3_setattr()
3326 setattr_copy(inode, attr); in ext3_setattr()
3327 mark_inode_dirty(inode); in ext3_setattr()
3330 rc = posix_acl_chmod(inode, inode->i_mode); in ext3_setattr()
3333 ext3_std_error(inode->i_sb, error); in ext3_setattr()
3367 static int ext3_writepage_trans_blocks(struct inode *inode) in ext3_writepage_trans_blocks() argument
3369 int bpp = ext3_journal_blocks_per_page(inode); in ext3_writepage_trans_blocks()
3373 if (ext3_should_journal_data(inode)) in ext3_writepage_trans_blocks()
3381 ret += EXT3_MAXQUOTAS_TRANS_BLOCKS(inode->i_sb); in ext3_writepage_trans_blocks()
3392 struct inode *inode, struct ext3_iloc *iloc) in ext3_mark_iloc_dirty() argument
3400 err = ext3_do_update_inode(handle, inode, iloc); in ext3_mark_iloc_dirty()
3411 ext3_reserve_inode_write(handle_t *handle, struct inode *inode, in ext3_reserve_inode_write() argument
3416 err = ext3_get_inode_loc(inode, iloc); in ext3_reserve_inode_write()
3426 ext3_std_error(inode->i_sb, err); in ext3_reserve_inode_write()
3443 int ext3_mark_inode_dirty(handle_t *handle, struct inode *inode) in ext3_mark_inode_dirty() argument
3449 trace_ext3_mark_inode_dirty(inode, _RET_IP_); in ext3_mark_inode_dirty()
3450 err = ext3_reserve_inode_write(handle, inode, &iloc); in ext3_mark_inode_dirty()
3452 err = ext3_mark_iloc_dirty(handle, inode, &iloc); in ext3_mark_inode_dirty()
3470 void ext3_dirty_inode(struct inode *inode, int flags) in ext3_dirty_inode() argument
3475 handle = ext3_journal_start(inode, 2); in ext3_dirty_inode()
3486 ext3_mark_inode_dirty(handle, inode); in ext3_dirty_inode()
3501 static int ext3_pin_inode(handle_t *handle, struct inode *inode)
3507 err = ext3_get_inode_loc(inode, &iloc);
3517 ext3_std_error(inode->i_sb, err);
3522 int ext3_change_inode_journal_flag(struct inode *inode, int val) in ext3_change_inode_journal_flag() argument
3538 journal = EXT3_JOURNAL(inode); in ext3_change_inode_journal_flag()
3554 EXT3_I(inode)->i_flags |= EXT3_JOURNAL_DATA_FL; in ext3_change_inode_journal_flag()
3556 EXT3_I(inode)->i_flags &= ~EXT3_JOURNAL_DATA_FL; in ext3_change_inode_journal_flag()
3557 ext3_set_aops(inode); in ext3_change_inode_journal_flag()
3563 handle = ext3_journal_start(inode, 1); in ext3_change_inode_journal_flag()
3567 err = ext3_mark_inode_dirty(handle, inode); in ext3_change_inode_journal_flag()
3570 ext3_std_error(inode->i_sb, err); in ext3_change_inode_journal_flag()