Lines Matching refs:inode

43 static int __ext2_write_inode(struct inode *inode, int do_sync);
48 static inline int ext2_inode_is_fast_symlink(struct inode *inode) in ext2_inode_is_fast_symlink() argument
50 int ea_blocks = EXT2_I(inode)->i_file_acl ? in ext2_inode_is_fast_symlink()
51 (inode->i_sb->s_blocksize >> 9) : 0; in ext2_inode_is_fast_symlink()
53 return (S_ISLNK(inode->i_mode) && in ext2_inode_is_fast_symlink()
54 inode->i_blocks - ea_blocks == 0); in ext2_inode_is_fast_symlink()
57 static void ext2_truncate_blocks(struct inode *inode, loff_t offset);
61 struct inode *inode = mapping->host; in ext2_write_failed() local
63 if (to > inode->i_size) { in ext2_write_failed()
64 truncate_pagecache(inode, inode->i_size); in ext2_write_failed()
65 ext2_truncate_blocks(inode, inode->i_size); in ext2_write_failed()
72 void ext2_evict_inode(struct inode * inode) in ext2_evict_inode() argument
77 if (!inode->i_nlink && !is_bad_inode(inode)) { in ext2_evict_inode()
79 dquot_initialize(inode); in ext2_evict_inode()
81 dquot_drop(inode); in ext2_evict_inode()
84 truncate_inode_pages_final(&inode->i_data); in ext2_evict_inode()
87 sb_start_intwrite(inode->i_sb); in ext2_evict_inode()
89 EXT2_I(inode)->i_dtime = ktime_get_real_seconds(); in ext2_evict_inode()
90 mark_inode_dirty(inode); in ext2_evict_inode()
91 __ext2_write_inode(inode, inode_needs_sync(inode)); in ext2_evict_inode()
93 inode->i_size = 0; in ext2_evict_inode()
94 if (inode->i_blocks) in ext2_evict_inode()
95 ext2_truncate_blocks(inode, 0); in ext2_evict_inode()
96 ext2_xattr_delete_inode(inode); in ext2_evict_inode()
99 invalidate_inode_buffers(inode); in ext2_evict_inode()
100 clear_inode(inode); in ext2_evict_inode()
102 ext2_discard_reservation(inode); in ext2_evict_inode()
103 rsv = EXT2_I(inode)->i_block_alloc_info; in ext2_evict_inode()
104 EXT2_I(inode)->i_block_alloc_info = NULL; in ext2_evict_inode()
109 ext2_free_inode(inode); in ext2_evict_inode()
110 sb_end_intwrite(inode->i_sb); in ext2_evict_inode()
163 static int ext2_block_to_path(struct inode *inode, in ext2_block_to_path() argument
166 int ptrs = EXT2_ADDR_PER_BLOCK(inode->i_sb); in ext2_block_to_path()
167 int ptrs_bits = EXT2_ADDR_PER_BLOCK_BITS(inode->i_sb); in ext2_block_to_path()
175 ext2_msg(inode->i_sb, KERN_WARNING, in ext2_block_to_path()
196 ext2_msg(inode->i_sb, KERN_WARNING, in ext2_block_to_path()
234 static Indirect *ext2_get_branch(struct inode *inode, in ext2_get_branch() argument
240 struct super_block *sb = inode->i_sb; in ext2_get_branch()
246 add_chain (chain, NULL, EXT2_I(inode)->i_data + *offsets); in ext2_get_branch()
253 read_lock(&EXT2_I(inode)->i_meta_lock); in ext2_get_branch()
257 read_unlock(&EXT2_I(inode)->i_meta_lock); in ext2_get_branch()
264 read_unlock(&EXT2_I(inode)->i_meta_lock); in ext2_get_branch()
294 static ext2_fsblk_t ext2_find_near(struct inode *inode, Indirect *ind) in ext2_find_near() argument
296 struct ext2_inode_info *ei = EXT2_I(inode); in ext2_find_near()
315 bg_start = ext2_group_first_block_no(inode->i_sb, ei->i_block_group); in ext2_find_near()
317 (EXT2_BLOCKS_PER_GROUP(inode->i_sb) / 16); in ext2_find_near()
330 static inline ext2_fsblk_t ext2_find_goal(struct inode *inode, long block, in ext2_find_goal() argument
335 block_i = EXT2_I(inode)->i_block_alloc_info; in ext2_find_goal()
346 return ext2_find_near(inode, partial); in ext2_find_goal()
399 static int ext2_alloc_blocks(struct inode *inode, in ext2_alloc_blocks() argument
422 current_block = ext2_new_blocks(inode, goal, &count, err, 0); in ext2_alloc_blocks()
446 ext2_free_blocks(inode, new_blocks[i], 1); in ext2_alloc_blocks()
448 mark_inode_dirty(inode); in ext2_alloc_blocks()
479 static int ext2_alloc_branch(struct inode *inode, in ext2_alloc_branch() argument
483 int blocksize = inode->i_sb->s_blocksize; in ext2_alloc_branch()
491 num = ext2_alloc_blocks(inode, goal, indirect_blks, in ext2_alloc_branch()
506 bh = sb_getblk(inode->i_sb, new_blocks[n-1]); in ext2_alloc_branch()
529 mark_buffer_dirty_inode(bh, inode); in ext2_alloc_branch()
534 if (S_ISDIR(inode->i_mode) && IS_DIRSYNC(inode)) in ext2_alloc_branch()
544 ext2_free_blocks(inode, new_blocks[i], 1); in ext2_alloc_branch()
545 ext2_free_blocks(inode, new_blocks[i], num); in ext2_alloc_branch()
561 static void ext2_splice_branch(struct inode *inode, in ext2_splice_branch() argument
568 block_i = EXT2_I(inode)->i_block_alloc_info; in ext2_splice_branch()
600 mark_buffer_dirty_inode(where->bh, inode); in ext2_splice_branch()
602 inode_set_ctime_current(inode); in ext2_splice_branch()
603 mark_inode_dirty(inode); in ext2_splice_branch()
624 static int ext2_get_blocks(struct inode *inode, in ext2_get_blocks() argument
637 struct ext2_inode_info *ei = EXT2_I(inode); in ext2_get_blocks()
643 depth = ext2_block_to_path(inode,iblock,offsets,&blocks_to_boundary); in ext2_get_blocks()
648 partial = ext2_get_branch(inode, depth, offsets, chain, &err); in ext2_get_blocks()
701 partial = ext2_get_branch(inode, depth, offsets, chain, &err); in ext2_get_blocks()
718 if (S_ISREG(inode->i_mode) && (!ei->i_block_alloc_info)) in ext2_get_blocks()
719 ext2_init_block_alloc_info(inode); in ext2_get_blocks()
721 goal = ext2_find_goal(inode, iblock, partial); in ext2_get_blocks()
734 err = ext2_alloc_branch(inode, indirect_blks, &count, goal, in ext2_get_blocks()
742 if (IS_DAX(inode)) { in ext2_get_blocks()
747 clean_bdev_aliases(inode->i_sb->s_bdev, in ext2_get_blocks()
755 err = sb_issue_zeroout(inode->i_sb, in ext2_get_blocks()
765 ext2_splice_branch(inode, iblock, partial, indirect_blks, count); in ext2_get_blocks()
783 int ext2_get_block(struct inode *inode, sector_t iblock, in ext2_get_block() argument
786 unsigned max_blocks = bh_result->b_size >> inode->i_blkbits; in ext2_get_block()
791 ret = ext2_get_blocks(inode, iblock, max_blocks, &bno, &new, &boundary, in ext2_get_block()
796 map_bh(bh_result, inode->i_sb, bno); in ext2_get_block()
797 bh_result->b_size = (ret << inode->i_blkbits); in ext2_get_block()
806 static int ext2_iomap_begin(struct inode *inode, loff_t offset, loff_t length, in ext2_iomap_begin() argument
809 unsigned int blkbits = inode->i_blkbits; in ext2_iomap_begin()
812 struct ext2_sb_info *sbi = EXT2_SB(inode->i_sb); in ext2_iomap_begin()
824 (first_block << blkbits) < i_size_read(inode)) in ext2_iomap_begin()
832 if ((flags & IOMAP_WRITE) && offset + length > i_size_read(inode)) in ext2_iomap_begin()
835 ret = ext2_get_blocks(inode, first_block, max_blocks, in ext2_iomap_begin()
845 iomap->bdev = inode->i_sb->s_bdev; in ext2_iomap_begin()
872 ext2_iomap_end(struct inode *inode, loff_t offset, loff_t length, in ext2_iomap_end() argument
885 ext2_write_failed(inode->i_mapping, offset + length); in ext2_iomap_end()
894 int ext2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, in ext2_fiemap() argument
900 inode_lock(inode); in ext2_fiemap()
901 i_size = i_size_read(inode); in ext2_fiemap()
911 ret = iomap_fiemap(inode, fieinfo, start, len, &ext2_iomap_ops); in ext2_fiemap()
912 inode_unlock(inode); in ext2_fiemap()
1037 static Indirect *ext2_find_shared(struct inode *inode, in ext2_find_shared() argument
1049 partial = ext2_get_branch(inode, k, offsets, chain, &err); in ext2_find_shared()
1056 write_lock(&EXT2_I(inode)->i_meta_lock); in ext2_find_shared()
1058 write_unlock(&EXT2_I(inode)->i_meta_lock); in ext2_find_shared()
1075 write_unlock(&EXT2_I(inode)->i_meta_lock); in ext2_find_shared()
1096 static inline void ext2_free_data(struct inode *inode, __le32 *p, __le32 *q) in ext2_free_data() argument
1111 ext2_free_blocks (inode, block_to_free, count); in ext2_free_data()
1112 mark_inode_dirty(inode); in ext2_free_data()
1120 ext2_free_blocks (inode, block_to_free, count); in ext2_free_data()
1121 mark_inode_dirty(inode); in ext2_free_data()
1136 static void ext2_free_branches(struct inode *inode, __le32 *p, __le32 *q, int depth) in ext2_free_branches() argument
1142 int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb); in ext2_free_branches()
1148 bh = sb_bread(inode->i_sb, nr); in ext2_free_branches()
1154 ext2_error(inode->i_sb, "ext2_free_branches", in ext2_free_branches()
1156 inode->i_ino, nr); in ext2_free_branches()
1159 ext2_free_branches(inode, in ext2_free_branches()
1164 ext2_free_blocks(inode, nr, 1); in ext2_free_branches()
1165 mark_inode_dirty(inode); in ext2_free_branches()
1168 ext2_free_data(inode, p, q); in ext2_free_branches()
1172 static void __ext2_truncate_blocks(struct inode *inode, loff_t offset) in __ext2_truncate_blocks() argument
1174 __le32 *i_data = EXT2_I(inode)->i_data; in __ext2_truncate_blocks()
1175 struct ext2_inode_info *ei = EXT2_I(inode); in __ext2_truncate_blocks()
1176 int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb); in __ext2_truncate_blocks()
1184 blocksize = inode->i_sb->s_blocksize; in __ext2_truncate_blocks()
1185 iblock = (offset + blocksize-1) >> EXT2_BLOCK_SIZE_BITS(inode->i_sb); in __ext2_truncate_blocks()
1188 WARN_ON(!rwsem_is_locked(&inode->i_mapping->invalidate_lock)); in __ext2_truncate_blocks()
1191 n = ext2_block_to_path(inode, iblock, offsets, NULL); in __ext2_truncate_blocks()
1202 ext2_free_data(inode, i_data+offsets[0], in __ext2_truncate_blocks()
1207 partial = ext2_find_shared(inode, n, offsets, chain, &nr); in __ext2_truncate_blocks()
1211 mark_inode_dirty(inode); in __ext2_truncate_blocks()
1213 mark_buffer_dirty_inode(partial->bh, inode); in __ext2_truncate_blocks()
1214 ext2_free_branches(inode, &nr, &nr+1, (chain+n-1) - partial); in __ext2_truncate_blocks()
1218 ext2_free_branches(inode, in __ext2_truncate_blocks()
1222 mark_buffer_dirty_inode(partial->bh, inode); in __ext2_truncate_blocks()
1233 mark_inode_dirty(inode); in __ext2_truncate_blocks()
1234 ext2_free_branches(inode, &nr, &nr+1, 1); in __ext2_truncate_blocks()
1241 mark_inode_dirty(inode); in __ext2_truncate_blocks()
1242 ext2_free_branches(inode, &nr, &nr+1, 2); in __ext2_truncate_blocks()
1249 mark_inode_dirty(inode); in __ext2_truncate_blocks()
1250 ext2_free_branches(inode, &nr, &nr+1, 3); in __ext2_truncate_blocks()
1257 ext2_discard_reservation(inode); in __ext2_truncate_blocks()
1262 static void ext2_truncate_blocks(struct inode *inode, loff_t offset) in ext2_truncate_blocks() argument
1264 if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || in ext2_truncate_blocks()
1265 S_ISLNK(inode->i_mode))) in ext2_truncate_blocks()
1267 if (ext2_inode_is_fast_symlink(inode)) in ext2_truncate_blocks()
1270 filemap_invalidate_lock(inode->i_mapping); in ext2_truncate_blocks()
1271 __ext2_truncate_blocks(inode, offset); in ext2_truncate_blocks()
1272 filemap_invalidate_unlock(inode->i_mapping); in ext2_truncate_blocks()
1275 static int ext2_setsize(struct inode *inode, loff_t newsize) in ext2_setsize() argument
1279 if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || in ext2_setsize()
1280 S_ISLNK(inode->i_mode))) in ext2_setsize()
1282 if (ext2_inode_is_fast_symlink(inode)) in ext2_setsize()
1284 if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) in ext2_setsize()
1287 inode_dio_wait(inode); in ext2_setsize()
1289 if (IS_DAX(inode)) in ext2_setsize()
1290 error = dax_truncate_page(inode, newsize, NULL, in ext2_setsize()
1293 error = block_truncate_page(inode->i_mapping, in ext2_setsize()
1298 filemap_invalidate_lock(inode->i_mapping); in ext2_setsize()
1299 truncate_setsize(inode, newsize); in ext2_setsize()
1300 __ext2_truncate_blocks(inode, newsize); in ext2_setsize()
1301 filemap_invalidate_unlock(inode->i_mapping); in ext2_setsize()
1303 inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode)); in ext2_setsize()
1304 if (inode_needs_sync(inode)) { in ext2_setsize()
1305 sync_mapping_buffers(inode->i_mapping); in ext2_setsize()
1306 sync_inode_metadata(inode, 1); in ext2_setsize()
1308 mark_inode_dirty(inode); in ext2_setsize()
1357 void ext2_set_inode_flags(struct inode *inode) in ext2_set_inode_flags() argument
1359 unsigned int flags = EXT2_I(inode)->i_flags; in ext2_set_inode_flags()
1361 inode->i_flags &= ~(S_SYNC | S_APPEND | S_IMMUTABLE | S_NOATIME | in ext2_set_inode_flags()
1364 inode->i_flags |= S_SYNC; in ext2_set_inode_flags()
1366 inode->i_flags |= S_APPEND; in ext2_set_inode_flags()
1368 inode->i_flags |= S_IMMUTABLE; in ext2_set_inode_flags()
1370 inode->i_flags |= S_NOATIME; in ext2_set_inode_flags()
1372 inode->i_flags |= S_DIRSYNC; in ext2_set_inode_flags()
1373 if (test_opt(inode->i_sb, DAX) && S_ISREG(inode->i_mode)) in ext2_set_inode_flags()
1374 inode->i_flags |= S_DAX; in ext2_set_inode_flags()
1377 void ext2_set_file_ops(struct inode *inode) in ext2_set_file_ops() argument
1379 inode->i_op = &ext2_file_inode_operations; in ext2_set_file_ops()
1380 inode->i_fop = &ext2_file_operations; in ext2_set_file_ops()
1381 if (IS_DAX(inode)) in ext2_set_file_ops()
1382 inode->i_mapping->a_ops = &ext2_dax_aops; in ext2_set_file_ops()
1384 inode->i_mapping->a_ops = &ext2_aops; in ext2_set_file_ops()
1387 struct inode *ext2_iget (struct super_block *sb, unsigned long ino) in ext2_iget()
1392 struct inode *inode; in ext2_iget() local
1398 inode = iget_locked(sb, ino); in ext2_iget()
1399 if (!inode) in ext2_iget()
1401 if (!(inode->i_state & I_NEW)) in ext2_iget()
1402 return inode; in ext2_iget()
1404 ei = EXT2_I(inode); in ext2_iget()
1407 raw_inode = ext2_get_inode(inode->i_sb, ino, &bh); in ext2_iget()
1413 inode->i_mode = le16_to_cpu(raw_inode->i_mode); in ext2_iget()
1416 if (!(test_opt (inode->i_sb, NO_UID32))) { in ext2_iget()
1420 i_uid_write(inode, i_uid); in ext2_iget()
1421 i_gid_write(inode, i_gid); in ext2_iget()
1422 set_nlink(inode, le16_to_cpu(raw_inode->i_links_count)); in ext2_iget()
1423 inode->i_size = le32_to_cpu(raw_inode->i_size); in ext2_iget()
1424 inode_set_atime(inode, (signed)le32_to_cpu(raw_inode->i_atime), 0); in ext2_iget()
1425 inode_set_ctime(inode, (signed)le32_to_cpu(raw_inode->i_ctime), 0); in ext2_iget()
1426 inode_set_mtime(inode, (signed)le32_to_cpu(raw_inode->i_mtime), 0); in ext2_iget()
1433 if (inode->i_nlink == 0 && (inode->i_mode == 0 || ei->i_dtime)) { in ext2_iget()
1438 inode->i_blocks = le32_to_cpu(raw_inode->i_blocks); in ext2_iget()
1440 ext2_set_inode_flags(inode); in ext2_iget()
1455 if (S_ISREG(inode->i_mode)) in ext2_iget()
1456 inode->i_size |= ((__u64)le32_to_cpu(raw_inode->i_size_high)) << 32; in ext2_iget()
1459 if (i_size_read(inode) < 0) { in ext2_iget()
1464 inode->i_generation = le32_to_cpu(raw_inode->i_generation); in ext2_iget()
1466 ei->i_block_group = (ino - 1) / EXT2_INODES_PER_GROUP(inode->i_sb); in ext2_iget()
1476 if (S_ISREG(inode->i_mode)) { in ext2_iget()
1477 ext2_set_file_ops(inode); in ext2_iget()
1478 } else if (S_ISDIR(inode->i_mode)) { in ext2_iget()
1479 inode->i_op = &ext2_dir_inode_operations; in ext2_iget()
1480 inode->i_fop = &ext2_dir_operations; in ext2_iget()
1481 inode->i_mapping->a_ops = &ext2_aops; in ext2_iget()
1482 } else if (S_ISLNK(inode->i_mode)) { in ext2_iget()
1483 if (ext2_inode_is_fast_symlink(inode)) { in ext2_iget()
1484 inode->i_link = (char *)ei->i_data; in ext2_iget()
1485 inode->i_op = &ext2_fast_symlink_inode_operations; in ext2_iget()
1486 nd_terminate_link(ei->i_data, inode->i_size, in ext2_iget()
1489 inode->i_op = &ext2_symlink_inode_operations; in ext2_iget()
1490 inode_nohighmem(inode); in ext2_iget()
1491 inode->i_mapping->a_ops = &ext2_aops; in ext2_iget()
1494 inode->i_op = &ext2_special_inode_operations; in ext2_iget()
1496 init_special_inode(inode, inode->i_mode, in ext2_iget()
1499 init_special_inode(inode, inode->i_mode, in ext2_iget()
1503 unlock_new_inode(inode); in ext2_iget()
1504 return inode; in ext2_iget()
1508 iget_failed(inode); in ext2_iget()
1512 static int __ext2_write_inode(struct inode *inode, int do_sync) in __ext2_write_inode() argument
1514 struct ext2_inode_info *ei = EXT2_I(inode); in __ext2_write_inode()
1515 struct super_block *sb = inode->i_sb; in __ext2_write_inode()
1516 ino_t ino = inode->i_ino; in __ext2_write_inode()
1517 uid_t uid = i_uid_read(inode); in __ext2_write_inode()
1518 gid_t gid = i_gid_read(inode); in __ext2_write_inode()
1532 raw_inode->i_mode = cpu_to_le16(inode->i_mode); in __ext2_write_inode()
1553 raw_inode->i_links_count = cpu_to_le16(inode->i_nlink); in __ext2_write_inode()
1554 raw_inode->i_size = cpu_to_le32(inode->i_size); in __ext2_write_inode()
1555 raw_inode->i_atime = cpu_to_le32(inode_get_atime_sec(inode)); in __ext2_write_inode()
1556 raw_inode->i_ctime = cpu_to_le32(inode_get_ctime_sec(inode)); in __ext2_write_inode()
1557 raw_inode->i_mtime = cpu_to_le32(inode_get_mtime_sec(inode)); in __ext2_write_inode()
1559 raw_inode->i_blocks = cpu_to_le32(inode->i_blocks); in __ext2_write_inode()
1566 if (!S_ISREG(inode->i_mode)) in __ext2_write_inode()
1569 raw_inode->i_size_high = cpu_to_le32(inode->i_size >> 32); in __ext2_write_inode()
1570 if (inode->i_size > 0x7fffffffULL) { in __ext2_write_inode()
1588 raw_inode->i_generation = cpu_to_le32(inode->i_generation); in __ext2_write_inode()
1589 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) { in __ext2_write_inode()
1590 if (old_valid_dev(inode->i_rdev)) { in __ext2_write_inode()
1592 cpu_to_le32(old_encode_dev(inode->i_rdev)); in __ext2_write_inode()
1597 cpu_to_le32(new_encode_dev(inode->i_rdev)); in __ext2_write_inode()
1616 int ext2_write_inode(struct inode *inode, struct writeback_control *wbc) in ext2_write_inode() argument
1618 return __ext2_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL); in ext2_write_inode()
1624 struct inode *inode = d_inode(path->dentry); in ext2_getattr() local
1625 struct ext2_inode_info *ei = EXT2_I(inode); in ext2_getattr()
1643 generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat); in ext2_getattr()
1650 struct inode *inode = d_inode(dentry); in ext2_setattr() local
1657 if (is_quota_modification(&nop_mnt_idmap, inode, iattr)) { in ext2_setattr()
1658 error = dquot_initialize(inode); in ext2_setattr()
1662 if (i_uid_needs_update(&nop_mnt_idmap, iattr, inode) || in ext2_setattr()
1663 i_gid_needs_update(&nop_mnt_idmap, iattr, inode)) { in ext2_setattr()
1664 error = dquot_transfer(&nop_mnt_idmap, inode, iattr); in ext2_setattr()
1668 if (iattr->ia_valid & ATTR_SIZE && iattr->ia_size != inode->i_size) { in ext2_setattr()
1669 error = ext2_setsize(inode, iattr->ia_size); in ext2_setattr()
1673 setattr_copy(&nop_mnt_idmap, inode, iattr); in ext2_setattr()
1675 error = posix_acl_chmod(&nop_mnt_idmap, dentry, inode->i_mode); in ext2_setattr()
1676 mark_inode_dirty(inode); in ext2_setattr()