Lines Matching refs:inode
40 static int __ext2_write_inode(struct inode *inode, int do_sync);
45 static inline int ext2_inode_is_fast_symlink(struct inode *inode) in ext2_inode_is_fast_symlink() argument
47 int ea_blocks = EXT2_I(inode)->i_file_acl ? in ext2_inode_is_fast_symlink()
48 (inode->i_sb->s_blocksize >> 9) : 0; in ext2_inode_is_fast_symlink()
50 return (S_ISLNK(inode->i_mode) && in ext2_inode_is_fast_symlink()
51 inode->i_blocks - ea_blocks == 0); in ext2_inode_is_fast_symlink()
54 static void ext2_truncate_blocks(struct inode *inode, loff_t offset);
58 struct inode *inode = mapping->host; in ext2_write_failed() local
60 if (to > inode->i_size) { in ext2_write_failed()
61 truncate_pagecache(inode, inode->i_size); in ext2_write_failed()
62 ext2_truncate_blocks(inode, inode->i_size); in ext2_write_failed()
69 void ext2_evict_inode(struct inode * inode) in ext2_evict_inode() argument
74 if (!inode->i_nlink && !is_bad_inode(inode)) { in ext2_evict_inode()
76 dquot_initialize(inode); in ext2_evict_inode()
78 dquot_drop(inode); in ext2_evict_inode()
81 truncate_inode_pages_final(&inode->i_data); in ext2_evict_inode()
84 sb_start_intwrite(inode->i_sb); in ext2_evict_inode()
86 EXT2_I(inode)->i_dtime = get_seconds(); in ext2_evict_inode()
87 mark_inode_dirty(inode); in ext2_evict_inode()
88 __ext2_write_inode(inode, inode_needs_sync(inode)); in ext2_evict_inode()
90 inode->i_size = 0; in ext2_evict_inode()
91 if (inode->i_blocks) in ext2_evict_inode()
92 ext2_truncate_blocks(inode, 0); in ext2_evict_inode()
93 ext2_xattr_delete_inode(inode); in ext2_evict_inode()
96 invalidate_inode_buffers(inode); in ext2_evict_inode()
97 clear_inode(inode); in ext2_evict_inode()
99 ext2_discard_reservation(inode); in ext2_evict_inode()
100 rsv = EXT2_I(inode)->i_block_alloc_info; in ext2_evict_inode()
101 EXT2_I(inode)->i_block_alloc_info = NULL; in ext2_evict_inode()
106 ext2_free_inode(inode); in ext2_evict_inode()
107 sb_end_intwrite(inode->i_sb); in ext2_evict_inode()
160 static int ext2_block_to_path(struct inode *inode, in ext2_block_to_path() argument
163 int ptrs = EXT2_ADDR_PER_BLOCK(inode->i_sb); in ext2_block_to_path()
164 int ptrs_bits = EXT2_ADDR_PER_BLOCK_BITS(inode->i_sb); in ext2_block_to_path()
172 ext2_msg(inode->i_sb, KERN_WARNING, in ext2_block_to_path()
193 ext2_msg(inode->i_sb, KERN_WARNING, in ext2_block_to_path()
231 static Indirect *ext2_get_branch(struct inode *inode, in ext2_get_branch() argument
237 struct super_block *sb = inode->i_sb; in ext2_get_branch()
243 add_chain (chain, NULL, EXT2_I(inode)->i_data + *offsets); in ext2_get_branch()
250 read_lock(&EXT2_I(inode)->i_meta_lock); in ext2_get_branch()
254 read_unlock(&EXT2_I(inode)->i_meta_lock); in ext2_get_branch()
261 read_unlock(&EXT2_I(inode)->i_meta_lock); in ext2_get_branch()
291 static ext2_fsblk_t ext2_find_near(struct inode *inode, Indirect *ind) in ext2_find_near() argument
293 struct ext2_inode_info *ei = EXT2_I(inode); in ext2_find_near()
312 bg_start = ext2_group_first_block_no(inode->i_sb, ei->i_block_group); in ext2_find_near()
314 (EXT2_BLOCKS_PER_GROUP(inode->i_sb) / 16); in ext2_find_near()
327 static inline ext2_fsblk_t ext2_find_goal(struct inode *inode, long block, in ext2_find_goal() argument
332 block_i = EXT2_I(inode)->i_block_alloc_info; in ext2_find_goal()
343 return ext2_find_near(inode, partial); in ext2_find_goal()
395 static int ext2_alloc_blocks(struct inode *inode, in ext2_alloc_blocks() argument
418 current_block = ext2_new_blocks(inode,goal,&count,err); in ext2_alloc_blocks()
442 ext2_free_blocks(inode, new_blocks[i], 1); in ext2_alloc_blocks()
444 mark_inode_dirty(inode); in ext2_alloc_blocks()
473 static int ext2_alloc_branch(struct inode *inode, in ext2_alloc_branch() argument
477 int blocksize = inode->i_sb->s_blocksize; in ext2_alloc_branch()
485 num = ext2_alloc_blocks(inode, goal, indirect_blks, in ext2_alloc_branch()
500 bh = sb_getblk(inode->i_sb, new_blocks[n-1]); in ext2_alloc_branch()
523 mark_buffer_dirty_inode(bh, inode); in ext2_alloc_branch()
528 if (S_ISDIR(inode->i_mode) && IS_DIRSYNC(inode)) in ext2_alloc_branch()
538 ext2_free_blocks(inode, new_blocks[i], 1); in ext2_alloc_branch()
539 ext2_free_blocks(inode, new_blocks[i], num); in ext2_alloc_branch()
555 static void ext2_splice_branch(struct inode *inode, in ext2_splice_branch() argument
562 block_i = EXT2_I(inode)->i_block_alloc_info; in ext2_splice_branch()
594 mark_buffer_dirty_inode(where->bh, inode); in ext2_splice_branch()
596 inode->i_ctime = CURRENT_TIME_SEC; in ext2_splice_branch()
597 mark_inode_dirty(inode); in ext2_splice_branch()
618 static int ext2_get_blocks(struct inode *inode, in ext2_get_blocks() argument
631 struct ext2_inode_info *ei = EXT2_I(inode); in ext2_get_blocks()
637 depth = ext2_block_to_path(inode,iblock,offsets,&blocks_to_boundary); in ext2_get_blocks()
642 partial = ext2_get_branch(inode, depth, offsets, chain, &err); in ext2_get_blocks()
695 partial = ext2_get_branch(inode, depth, offsets, chain, &err); in ext2_get_blocks()
710 if (S_ISREG(inode->i_mode) && (!ei->i_block_alloc_info)) in ext2_get_blocks()
711 ext2_init_block_alloc_info(inode); in ext2_get_blocks()
713 goal = ext2_find_goal(inode, iblock, partial); in ext2_get_blocks()
726 err = ext2_alloc_branch(inode, indirect_blks, &count, goal, in ext2_get_blocks()
734 if (IS_DAX(inode)) { in ext2_get_blocks()
740 err = dax_clear_blocks(inode, le32_to_cpu(chain[depth-1].key), in ext2_get_blocks()
741 1 << inode->i_blkbits); in ext2_get_blocks()
748 ext2_splice_branch(inode, iblock, partial, indirect_blks, count); in ext2_get_blocks()
752 map_bh(bh_result, inode->i_sb, le32_to_cpu(chain[depth-1].key)); in ext2_get_blocks()
766 int ext2_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create) in ext2_get_block() argument
768 unsigned max_blocks = bh_result->b_size >> inode->i_blkbits; in ext2_get_block()
769 int ret = ext2_get_blocks(inode, iblock, max_blocks, in ext2_get_block()
772 bh_result->b_size = (ret << inode->i_blkbits); in ext2_get_block()
779 int ext2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, in ext2_fiemap() argument
782 return generic_block_fiemap(inode, fieinfo, start, len, in ext2_fiemap()
859 struct inode *inode = mapping->host; in ext2_direct_IO() local
863 if (IS_DAX(inode)) in ext2_direct_IO()
864 ret = dax_do_io(iocb, inode, iter, offset, ext2_get_block, NULL, in ext2_direct_IO()
867 ret = blockdev_direct_IO(iocb, inode, iter, offset, in ext2_direct_IO()
954 static Indirect *ext2_find_shared(struct inode *inode, in ext2_find_shared() argument
966 partial = ext2_get_branch(inode, k, offsets, chain, &err); in ext2_find_shared()
973 write_lock(&EXT2_I(inode)->i_meta_lock); in ext2_find_shared()
975 write_unlock(&EXT2_I(inode)->i_meta_lock); in ext2_find_shared()
992 write_unlock(&EXT2_I(inode)->i_meta_lock); in ext2_find_shared()
1013 static inline void ext2_free_data(struct inode *inode, __le32 *p, __le32 *q) in ext2_free_data() argument
1028 ext2_free_blocks (inode, block_to_free, count); in ext2_free_data()
1029 mark_inode_dirty(inode); in ext2_free_data()
1037 ext2_free_blocks (inode, block_to_free, count); in ext2_free_data()
1038 mark_inode_dirty(inode); in ext2_free_data()
1053 static void ext2_free_branches(struct inode *inode, __le32 *p, __le32 *q, int depth) in ext2_free_branches() argument
1059 int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb); in ext2_free_branches()
1065 bh = sb_bread(inode->i_sb, nr); in ext2_free_branches()
1071 ext2_error(inode->i_sb, "ext2_free_branches", in ext2_free_branches()
1073 inode->i_ino, nr); in ext2_free_branches()
1076 ext2_free_branches(inode, in ext2_free_branches()
1081 ext2_free_blocks(inode, nr, 1); in ext2_free_branches()
1082 mark_inode_dirty(inode); in ext2_free_branches()
1085 ext2_free_data(inode, p, q); in ext2_free_branches()
1089 static void __ext2_truncate_blocks(struct inode *inode, loff_t offset) in __ext2_truncate_blocks() argument
1091 __le32 *i_data = EXT2_I(inode)->i_data; in __ext2_truncate_blocks()
1092 struct ext2_inode_info *ei = EXT2_I(inode); in __ext2_truncate_blocks()
1093 int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb); in __ext2_truncate_blocks()
1101 blocksize = inode->i_sb->s_blocksize; in __ext2_truncate_blocks()
1102 iblock = (offset + blocksize-1) >> EXT2_BLOCK_SIZE_BITS(inode->i_sb); in __ext2_truncate_blocks()
1108 n = ext2_block_to_path(inode, iblock, offsets, NULL); in __ext2_truncate_blocks()
1119 ext2_free_data(inode, i_data+offsets[0], in __ext2_truncate_blocks()
1124 partial = ext2_find_shared(inode, n, offsets, chain, &nr); in __ext2_truncate_blocks()
1128 mark_inode_dirty(inode); in __ext2_truncate_blocks()
1130 mark_buffer_dirty_inode(partial->bh, inode); in __ext2_truncate_blocks()
1131 ext2_free_branches(inode, &nr, &nr+1, (chain+n-1) - partial); in __ext2_truncate_blocks()
1135 ext2_free_branches(inode, in __ext2_truncate_blocks()
1139 mark_buffer_dirty_inode(partial->bh, inode); in __ext2_truncate_blocks()
1150 mark_inode_dirty(inode); in __ext2_truncate_blocks()
1151 ext2_free_branches(inode, &nr, &nr+1, 1); in __ext2_truncate_blocks()
1157 mark_inode_dirty(inode); in __ext2_truncate_blocks()
1158 ext2_free_branches(inode, &nr, &nr+1, 2); in __ext2_truncate_blocks()
1164 mark_inode_dirty(inode); in __ext2_truncate_blocks()
1165 ext2_free_branches(inode, &nr, &nr+1, 3); in __ext2_truncate_blocks()
1171 ext2_discard_reservation(inode); in __ext2_truncate_blocks()
1176 static void ext2_truncate_blocks(struct inode *inode, loff_t offset) in ext2_truncate_blocks() argument
1186 if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || in ext2_truncate_blocks()
1187 S_ISLNK(inode->i_mode))) in ext2_truncate_blocks()
1189 if (ext2_inode_is_fast_symlink(inode)) in ext2_truncate_blocks()
1191 if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) in ext2_truncate_blocks()
1194 dax_sem_down_write(EXT2_I(inode)); in ext2_truncate_blocks()
1195 __ext2_truncate_blocks(inode, offset); in ext2_truncate_blocks()
1196 dax_sem_up_write(EXT2_I(inode)); in ext2_truncate_blocks()
1199 static int ext2_setsize(struct inode *inode, loff_t newsize) in ext2_setsize() argument
1203 if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || in ext2_setsize()
1204 S_ISLNK(inode->i_mode))) in ext2_setsize()
1206 if (ext2_inode_is_fast_symlink(inode)) in ext2_setsize()
1208 if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) in ext2_setsize()
1211 inode_dio_wait(inode); in ext2_setsize()
1213 if (IS_DAX(inode)) in ext2_setsize()
1214 error = dax_truncate_page(inode, newsize, ext2_get_block); in ext2_setsize()
1215 else if (test_opt(inode->i_sb, NOBH)) in ext2_setsize()
1216 error = nobh_truncate_page(inode->i_mapping, in ext2_setsize()
1219 error = block_truncate_page(inode->i_mapping, in ext2_setsize()
1224 dax_sem_down_write(EXT2_I(inode)); in ext2_setsize()
1225 truncate_setsize(inode, newsize); in ext2_setsize()
1226 __ext2_truncate_blocks(inode, newsize); in ext2_setsize()
1227 dax_sem_up_write(EXT2_I(inode)); in ext2_setsize()
1229 inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC; in ext2_setsize()
1230 if (inode_needs_sync(inode)) { in ext2_setsize()
1231 sync_mapping_buffers(inode->i_mapping); in ext2_setsize()
1232 sync_inode_metadata(inode, 1); in ext2_setsize()
1234 mark_inode_dirty(inode); in ext2_setsize()
1283 void ext2_set_inode_flags(struct inode *inode) in ext2_set_inode_flags() argument
1285 unsigned int flags = EXT2_I(inode)->i_flags; in ext2_set_inode_flags()
1287 inode->i_flags &= ~(S_SYNC | S_APPEND | S_IMMUTABLE | S_NOATIME | in ext2_set_inode_flags()
1290 inode->i_flags |= S_SYNC; in ext2_set_inode_flags()
1292 inode->i_flags |= S_APPEND; in ext2_set_inode_flags()
1294 inode->i_flags |= S_IMMUTABLE; in ext2_set_inode_flags()
1296 inode->i_flags |= S_NOATIME; in ext2_set_inode_flags()
1298 inode->i_flags |= S_DIRSYNC; in ext2_set_inode_flags()
1299 if (test_opt(inode->i_sb, DAX)) in ext2_set_inode_flags()
1300 inode->i_flags |= S_DAX; in ext2_set_inode_flags()
1322 struct inode *ext2_iget (struct super_block *sb, unsigned long ino) in ext2_iget()
1327 struct inode *inode; in ext2_iget() local
1333 inode = iget_locked(sb, ino); in ext2_iget()
1334 if (!inode) in ext2_iget()
1336 if (!(inode->i_state & I_NEW)) in ext2_iget()
1337 return inode; in ext2_iget()
1339 ei = EXT2_I(inode); in ext2_iget()
1342 raw_inode = ext2_get_inode(inode->i_sb, ino, &bh); in ext2_iget()
1348 inode->i_mode = le16_to_cpu(raw_inode->i_mode); in ext2_iget()
1351 if (!(test_opt (inode->i_sb, NO_UID32))) { in ext2_iget()
1355 i_uid_write(inode, i_uid); in ext2_iget()
1356 i_gid_write(inode, i_gid); in ext2_iget()
1357 set_nlink(inode, le16_to_cpu(raw_inode->i_links_count)); in ext2_iget()
1358 inode->i_size = le32_to_cpu(raw_inode->i_size); in ext2_iget()
1359 inode->i_atime.tv_sec = (signed)le32_to_cpu(raw_inode->i_atime); in ext2_iget()
1360 inode->i_ctime.tv_sec = (signed)le32_to_cpu(raw_inode->i_ctime); in ext2_iget()
1361 inode->i_mtime.tv_sec = (signed)le32_to_cpu(raw_inode->i_mtime); in ext2_iget()
1362 inode->i_atime.tv_nsec = inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec = 0; in ext2_iget()
1369 if (inode->i_nlink == 0 && (inode->i_mode == 0 || ei->i_dtime)) { in ext2_iget()
1375 inode->i_blocks = le32_to_cpu(raw_inode->i_blocks); in ext2_iget()
1382 if (S_ISREG(inode->i_mode)) in ext2_iget()
1383 inode->i_size |= ((__u64)le32_to_cpu(raw_inode->i_size_high)) << 32; in ext2_iget()
1387 inode->i_generation = le32_to_cpu(raw_inode->i_generation); in ext2_iget()
1389 ei->i_block_group = (ino - 1) / EXT2_INODES_PER_GROUP(inode->i_sb); in ext2_iget()
1399 if (S_ISREG(inode->i_mode)) { in ext2_iget()
1400 inode->i_op = &ext2_file_inode_operations; in ext2_iget()
1401 if (test_opt(inode->i_sb, NOBH)) { in ext2_iget()
1402 inode->i_mapping->a_ops = &ext2_nobh_aops; in ext2_iget()
1403 inode->i_fop = &ext2_file_operations; in ext2_iget()
1405 inode->i_mapping->a_ops = &ext2_aops; in ext2_iget()
1406 inode->i_fop = &ext2_file_operations; in ext2_iget()
1408 } else if (S_ISDIR(inode->i_mode)) { in ext2_iget()
1409 inode->i_op = &ext2_dir_inode_operations; in ext2_iget()
1410 inode->i_fop = &ext2_dir_operations; in ext2_iget()
1411 if (test_opt(inode->i_sb, NOBH)) in ext2_iget()
1412 inode->i_mapping->a_ops = &ext2_nobh_aops; in ext2_iget()
1414 inode->i_mapping->a_ops = &ext2_aops; in ext2_iget()
1415 } else if (S_ISLNK(inode->i_mode)) { in ext2_iget()
1416 if (ext2_inode_is_fast_symlink(inode)) { in ext2_iget()
1417 inode->i_link = (char *)ei->i_data; in ext2_iget()
1418 inode->i_op = &ext2_fast_symlink_inode_operations; in ext2_iget()
1419 nd_terminate_link(ei->i_data, inode->i_size, in ext2_iget()
1422 inode->i_op = &ext2_symlink_inode_operations; in ext2_iget()
1423 if (test_opt(inode->i_sb, NOBH)) in ext2_iget()
1424 inode->i_mapping->a_ops = &ext2_nobh_aops; in ext2_iget()
1426 inode->i_mapping->a_ops = &ext2_aops; in ext2_iget()
1429 inode->i_op = &ext2_special_inode_operations; in ext2_iget()
1431 init_special_inode(inode, inode->i_mode, in ext2_iget()
1434 init_special_inode(inode, inode->i_mode, in ext2_iget()
1438 ext2_set_inode_flags(inode); in ext2_iget()
1439 unlock_new_inode(inode); in ext2_iget()
1440 return inode; in ext2_iget()
1443 iget_failed(inode); in ext2_iget()
1447 static int __ext2_write_inode(struct inode *inode, int do_sync) in __ext2_write_inode() argument
1449 struct ext2_inode_info *ei = EXT2_I(inode); in __ext2_write_inode()
1450 struct super_block *sb = inode->i_sb; in __ext2_write_inode()
1451 ino_t ino = inode->i_ino; in __ext2_write_inode()
1452 uid_t uid = i_uid_read(inode); in __ext2_write_inode()
1453 gid_t gid = i_gid_read(inode); in __ext2_write_inode()
1468 raw_inode->i_mode = cpu_to_le16(inode->i_mode); in __ext2_write_inode()
1489 raw_inode->i_links_count = cpu_to_le16(inode->i_nlink); in __ext2_write_inode()
1490 raw_inode->i_size = cpu_to_le32(inode->i_size); in __ext2_write_inode()
1491 raw_inode->i_atime = cpu_to_le32(inode->i_atime.tv_sec); in __ext2_write_inode()
1492 raw_inode->i_ctime = cpu_to_le32(inode->i_ctime.tv_sec); in __ext2_write_inode()
1493 raw_inode->i_mtime = cpu_to_le32(inode->i_mtime.tv_sec); in __ext2_write_inode()
1495 raw_inode->i_blocks = cpu_to_le32(inode->i_blocks); in __ext2_write_inode()
1502 if (!S_ISREG(inode->i_mode)) in __ext2_write_inode()
1505 raw_inode->i_size_high = cpu_to_le32(inode->i_size >> 32); in __ext2_write_inode()
1506 if (inode->i_size > 0x7fffffffULL) { in __ext2_write_inode()
1524 raw_inode->i_generation = cpu_to_le32(inode->i_generation); in __ext2_write_inode()
1525 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) { in __ext2_write_inode()
1526 if (old_valid_dev(inode->i_rdev)) { in __ext2_write_inode()
1528 cpu_to_le32(old_encode_dev(inode->i_rdev)); in __ext2_write_inode()
1533 cpu_to_le32(new_encode_dev(inode->i_rdev)); in __ext2_write_inode()
1552 int ext2_write_inode(struct inode *inode, struct writeback_control *wbc) in ext2_write_inode() argument
1554 return __ext2_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL); in ext2_write_inode()
1559 struct inode *inode = d_inode(dentry); in ext2_setattr() local
1562 error = inode_change_ok(inode, iattr); in ext2_setattr()
1566 if (is_quota_modification(inode, iattr)) { in ext2_setattr()
1567 error = dquot_initialize(inode); in ext2_setattr()
1571 if ((iattr->ia_valid & ATTR_UID && !uid_eq(iattr->ia_uid, inode->i_uid)) || in ext2_setattr()
1572 (iattr->ia_valid & ATTR_GID && !gid_eq(iattr->ia_gid, inode->i_gid))) { in ext2_setattr()
1573 error = dquot_transfer(inode, iattr); in ext2_setattr()
1577 if (iattr->ia_valid & ATTR_SIZE && iattr->ia_size != inode->i_size) { in ext2_setattr()
1578 error = ext2_setsize(inode, iattr->ia_size); in ext2_setattr()
1582 setattr_copy(inode, iattr); in ext2_setattr()
1584 error = posix_acl_chmod(inode, inode->i_mode); in ext2_setattr()
1585 mark_inode_dirty(inode); in ext2_setattr()