diff options
Diffstat (limited to 'fs/ocfs2/file.c')
| -rw-r--r-- | fs/ocfs2/file.c | 209 |
1 files changed, 96 insertions, 113 deletions
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index e2570a3bc2b2..e8f795f978aa 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #include <linux/mount.h> | 35 | #include <linux/mount.h> |
| 36 | #include <linux/writeback.h> | 36 | #include <linux/writeback.h> |
| 37 | #include <linux/falloc.h> | 37 | #include <linux/falloc.h> |
| 38 | #include <linux/quotaops.h> | ||
| 38 | 39 | ||
| 39 | #define MLOG_MASK_PREFIX ML_INODE | 40 | #define MLOG_MASK_PREFIX ML_INODE |
| 40 | #include <cluster/masklog.h> | 41 | #include <cluster/masklog.h> |
| @@ -56,6 +57,8 @@ | |||
| 56 | #include "suballoc.h" | 57 | #include "suballoc.h" |
| 57 | #include "super.h" | 58 | #include "super.h" |
| 58 | #include "xattr.h" | 59 | #include "xattr.h" |
| 60 | #include "acl.h" | ||
| 61 | #include "quota.h" | ||
| 59 | 62 | ||
| 60 | #include "buffer_head_io.h" | 63 | #include "buffer_head_io.h" |
| 61 | 64 | ||
| @@ -253,8 +256,8 @@ int ocfs2_update_inode_atime(struct inode *inode, | |||
| 253 | goto out; | 256 | goto out; |
| 254 | } | 257 | } |
| 255 | 258 | ||
| 256 | ret = ocfs2_journal_access(handle, inode, bh, | 259 | ret = ocfs2_journal_access_di(handle, inode, bh, |
| 257 | OCFS2_JOURNAL_ACCESS_WRITE); | 260 | OCFS2_JOURNAL_ACCESS_WRITE); |
| 258 | if (ret) { | 261 | if (ret) { |
| 259 | mlog_errno(ret); | 262 | mlog_errno(ret); |
| 260 | goto out_commit; | 263 | goto out_commit; |
| @@ -303,9 +306,9 @@ bail: | |||
| 303 | return status; | 306 | return status; |
| 304 | } | 307 | } |
| 305 | 308 | ||
| 306 | static int ocfs2_simple_size_update(struct inode *inode, | 309 | int ocfs2_simple_size_update(struct inode *inode, |
| 307 | struct buffer_head *di_bh, | 310 | struct buffer_head *di_bh, |
| 308 | u64 new_i_size) | 311 | u64 new_i_size) |
| 309 | { | 312 | { |
| 310 | int ret; | 313 | int ret; |
| 311 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | 314 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); |
| @@ -350,8 +353,8 @@ static int ocfs2_orphan_for_truncate(struct ocfs2_super *osb, | |||
| 350 | goto out; | 353 | goto out; |
| 351 | } | 354 | } |
| 352 | 355 | ||
| 353 | status = ocfs2_journal_access(handle, inode, fe_bh, | 356 | status = ocfs2_journal_access_di(handle, inode, fe_bh, |
| 354 | OCFS2_JOURNAL_ACCESS_WRITE); | 357 | OCFS2_JOURNAL_ACCESS_WRITE); |
| 355 | if (status < 0) { | 358 | if (status < 0) { |
| 356 | mlog_errno(status); | 359 | mlog_errno(status); |
| 357 | goto out_commit; | 360 | goto out_commit; |
| @@ -401,12 +404,9 @@ static int ocfs2_truncate_file(struct inode *inode, | |||
| 401 | (unsigned long long)OCFS2_I(inode)->ip_blkno, | 404 | (unsigned long long)OCFS2_I(inode)->ip_blkno, |
| 402 | (unsigned long long)new_i_size); | 405 | (unsigned long long)new_i_size); |
| 403 | 406 | ||
| 407 | /* We trust di_bh because it comes from ocfs2_inode_lock(), which | ||
| 408 | * already validated it */ | ||
| 404 | fe = (struct ocfs2_dinode *) di_bh->b_data; | 409 | fe = (struct ocfs2_dinode *) di_bh->b_data; |
| 405 | if (!OCFS2_IS_VALID_DINODE(fe)) { | ||
| 406 | OCFS2_RO_ON_INVALID_DINODE(inode->i_sb, fe); | ||
| 407 | status = -EIO; | ||
| 408 | goto bail; | ||
| 409 | } | ||
| 410 | 410 | ||
| 411 | mlog_bug_on_msg(le64_to_cpu(fe->i_size) != i_size_read(inode), | 411 | mlog_bug_on_msg(le64_to_cpu(fe->i_size) != i_size_read(inode), |
| 412 | "Inode %llu, inode i_size = %lld != di " | 412 | "Inode %llu, inode i_size = %lld != di " |
| @@ -536,6 +536,7 @@ static int __ocfs2_extend_allocation(struct inode *inode, u32 logical_start, | |||
| 536 | enum ocfs2_alloc_restarted why; | 536 | enum ocfs2_alloc_restarted why; |
| 537 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | 537 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); |
| 538 | struct ocfs2_extent_tree et; | 538 | struct ocfs2_extent_tree et; |
| 539 | int did_quota = 0; | ||
| 539 | 540 | ||
| 540 | mlog_entry("(clusters_to_add = %u)\n", clusters_to_add); | 541 | mlog_entry("(clusters_to_add = %u)\n", clusters_to_add); |
| 541 | 542 | ||
| @@ -545,18 +546,12 @@ static int __ocfs2_extend_allocation(struct inode *inode, u32 logical_start, | |||
| 545 | */ | 546 | */ |
| 546 | BUG_ON(mark_unwritten && !ocfs2_sparse_alloc(osb)); | 547 | BUG_ON(mark_unwritten && !ocfs2_sparse_alloc(osb)); |
| 547 | 548 | ||
| 548 | status = ocfs2_read_block(inode, OCFS2_I(inode)->ip_blkno, &bh); | 549 | status = ocfs2_read_inode_block(inode, &bh); |
| 549 | if (status < 0) { | 550 | if (status < 0) { |
| 550 | mlog_errno(status); | 551 | mlog_errno(status); |
| 551 | goto leave; | 552 | goto leave; |
| 552 | } | 553 | } |
| 553 | |||
| 554 | fe = (struct ocfs2_dinode *) bh->b_data; | 554 | fe = (struct ocfs2_dinode *) bh->b_data; |
| 555 | if (!OCFS2_IS_VALID_DINODE(fe)) { | ||
| 556 | OCFS2_RO_ON_INVALID_DINODE(inode->i_sb, fe); | ||
| 557 | status = -EIO; | ||
| 558 | goto leave; | ||
| 559 | } | ||
| 560 | 555 | ||
| 561 | restart_all: | 556 | restart_all: |
| 562 | BUG_ON(le32_to_cpu(fe->i_clusters) != OCFS2_I(inode)->ip_clusters); | 557 | BUG_ON(le32_to_cpu(fe->i_clusters) != OCFS2_I(inode)->ip_clusters); |
| @@ -585,11 +580,18 @@ restart_all: | |||
| 585 | } | 580 | } |
| 586 | 581 | ||
| 587 | restarted_transaction: | 582 | restarted_transaction: |
| 583 | if (vfs_dq_alloc_space_nodirty(inode, ocfs2_clusters_to_bytes(osb->sb, | ||
| 584 | clusters_to_add))) { | ||
| 585 | status = -EDQUOT; | ||
| 586 | goto leave; | ||
| 587 | } | ||
| 588 | did_quota = 1; | ||
| 589 | |||
| 588 | /* reserve a write to the file entry early on - that we if we | 590 | /* reserve a write to the file entry early on - that we if we |
| 589 | * run out of credits in the allocation path, we can still | 591 | * run out of credits in the allocation path, we can still |
| 590 | * update i_size. */ | 592 | * update i_size. */ |
| 591 | status = ocfs2_journal_access(handle, inode, bh, | 593 | status = ocfs2_journal_access_di(handle, inode, bh, |
| 592 | OCFS2_JOURNAL_ACCESS_WRITE); | 594 | OCFS2_JOURNAL_ACCESS_WRITE); |
| 593 | if (status < 0) { | 595 | if (status < 0) { |
| 594 | mlog_errno(status); | 596 | mlog_errno(status); |
| 595 | goto leave; | 597 | goto leave; |
| @@ -622,6 +624,10 @@ restarted_transaction: | |||
| 622 | spin_lock(&OCFS2_I(inode)->ip_lock); | 624 | spin_lock(&OCFS2_I(inode)->ip_lock); |
| 623 | clusters_to_add -= (OCFS2_I(inode)->ip_clusters - prev_clusters); | 625 | clusters_to_add -= (OCFS2_I(inode)->ip_clusters - prev_clusters); |
| 624 | spin_unlock(&OCFS2_I(inode)->ip_lock); | 626 | spin_unlock(&OCFS2_I(inode)->ip_lock); |
| 627 | /* Release unused quota reservation */ | ||
| 628 | vfs_dq_free_space(inode, | ||
| 629 | ocfs2_clusters_to_bytes(osb->sb, clusters_to_add)); | ||
| 630 | did_quota = 0; | ||
| 625 | 631 | ||
| 626 | if (why != RESTART_NONE && clusters_to_add) { | 632 | if (why != RESTART_NONE && clusters_to_add) { |
| 627 | if (why == RESTART_META) { | 633 | if (why == RESTART_META) { |
| @@ -654,6 +660,9 @@ restarted_transaction: | |||
| 654 | OCFS2_I(inode)->ip_clusters, (long long)i_size_read(inode)); | 660 | OCFS2_I(inode)->ip_clusters, (long long)i_size_read(inode)); |
| 655 | 661 | ||
| 656 | leave: | 662 | leave: |
| 663 | if (status < 0 && did_quota) | ||
| 664 | vfs_dq_free_space(inode, | ||
| 665 | ocfs2_clusters_to_bytes(osb->sb, clusters_to_add)); | ||
| 657 | if (handle) { | 666 | if (handle) { |
| 658 | ocfs2_commit_trans(osb, handle); | 667 | ocfs2_commit_trans(osb, handle); |
| 659 | handle = NULL; | 668 | handle = NULL; |
| @@ -885,6 +894,9 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 885 | struct ocfs2_super *osb = OCFS2_SB(sb); | 894 | struct ocfs2_super *osb = OCFS2_SB(sb); |
| 886 | struct buffer_head *bh = NULL; | 895 | struct buffer_head *bh = NULL; |
| 887 | handle_t *handle = NULL; | 896 | handle_t *handle = NULL; |
| 897 | int locked[MAXQUOTAS] = {0, 0}; | ||
| 898 | int credits, qtype; | ||
| 899 | struct ocfs2_mem_dqinfo *oinfo; | ||
| 888 | 900 | ||
| 889 | mlog_entry("(0x%p, '%.*s')\n", dentry, | 901 | mlog_entry("(0x%p, '%.*s')\n", dentry, |
| 890 | dentry->d_name.len, dentry->d_name.name); | 902 | dentry->d_name.len, dentry->d_name.name); |
| @@ -955,11 +967,47 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 955 | } | 967 | } |
| 956 | } | 968 | } |
| 957 | 969 | ||
| 958 | handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS); | 970 | if ((attr->ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) || |
| 959 | if (IS_ERR(handle)) { | 971 | (attr->ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) { |
| 960 | status = PTR_ERR(handle); | 972 | credits = OCFS2_INODE_UPDATE_CREDITS; |
| 961 | mlog_errno(status); | 973 | if (attr->ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid |
| 962 | goto bail_unlock; | 974 | && OCFS2_HAS_RO_COMPAT_FEATURE(sb, |
| 975 | OCFS2_FEATURE_RO_COMPAT_USRQUOTA)) { | ||
| 976 | oinfo = sb_dqinfo(sb, USRQUOTA)->dqi_priv; | ||
| 977 | status = ocfs2_lock_global_qf(oinfo, 1); | ||
| 978 | if (status < 0) | ||
| 979 | goto bail_unlock; | ||
| 980 | credits += ocfs2_calc_qinit_credits(sb, USRQUOTA) + | ||
| 981 | ocfs2_calc_qdel_credits(sb, USRQUOTA); | ||
| 982 | locked[USRQUOTA] = 1; | ||
| 983 | } | ||
| 984 | if (attr->ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid | ||
| 985 | && OCFS2_HAS_RO_COMPAT_FEATURE(sb, | ||
| 986 | OCFS2_FEATURE_RO_COMPAT_GRPQUOTA)) { | ||
| 987 | oinfo = sb_dqinfo(sb, GRPQUOTA)->dqi_priv; | ||
| 988 | status = ocfs2_lock_global_qf(oinfo, 1); | ||
| 989 | if (status < 0) | ||
| 990 | goto bail_unlock; | ||
| 991 | credits += ocfs2_calc_qinit_credits(sb, GRPQUOTA) + | ||
| 992 | ocfs2_calc_qdel_credits(sb, GRPQUOTA); | ||
| 993 | locked[GRPQUOTA] = 1; | ||
| 994 | } | ||
| 995 | handle = ocfs2_start_trans(osb, credits); | ||
| 996 | if (IS_ERR(handle)) { | ||
| 997 | status = PTR_ERR(handle); | ||
| 998 | mlog_errno(status); | ||
| 999 | goto bail_unlock; | ||
| 1000 | } | ||
| 1001 | status = vfs_dq_transfer(inode, attr) ? -EDQUOT : 0; | ||
| 1002 | if (status < 0) | ||
| 1003 | goto bail_commit; | ||
| 1004 | } else { | ||
| 1005 | handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS); | ||
| 1006 | if (IS_ERR(handle)) { | ||
| 1007 | status = PTR_ERR(handle); | ||
| 1008 | mlog_errno(status); | ||
| 1009 | goto bail_unlock; | ||
| 1010 | } | ||
| 963 | } | 1011 | } |
| 964 | 1012 | ||
| 965 | /* | 1013 | /* |
| @@ -982,6 +1030,12 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 982 | bail_commit: | 1030 | bail_commit: |
| 983 | ocfs2_commit_trans(osb, handle); | 1031 | ocfs2_commit_trans(osb, handle); |
| 984 | bail_unlock: | 1032 | bail_unlock: |
| 1033 | for (qtype = 0; qtype < MAXQUOTAS; qtype++) { | ||
| 1034 | if (!locked[qtype]) | ||
| 1035 | continue; | ||
| 1036 | oinfo = sb_dqinfo(sb, qtype)->dqi_priv; | ||
| 1037 | ocfs2_unlock_global_qf(oinfo, 1); | ||
| 1038 | } | ||
| 985 | ocfs2_inode_unlock(inode, 1); | 1039 | ocfs2_inode_unlock(inode, 1); |
| 986 | bail_unlock_rw: | 1040 | bail_unlock_rw: |
| 987 | if (size_change) | 1041 | if (size_change) |
| @@ -989,6 +1043,12 @@ bail_unlock_rw: | |||
| 989 | bail: | 1043 | bail: |
| 990 | brelse(bh); | 1044 | brelse(bh); |
| 991 | 1045 | ||
| 1046 | if (!status && attr->ia_valid & ATTR_MODE) { | ||
| 1047 | status = ocfs2_acl_chmod(inode); | ||
| 1048 | if (status < 0) | ||
| 1049 | mlog_errno(status); | ||
| 1050 | } | ||
| 1051 | |||
| 992 | mlog_exit(status); | 1052 | mlog_exit(status); |
| 993 | return status; | 1053 | return status; |
| 994 | } | 1054 | } |
| @@ -1035,7 +1095,7 @@ int ocfs2_permission(struct inode *inode, int mask) | |||
| 1035 | goto out; | 1095 | goto out; |
| 1036 | } | 1096 | } |
| 1037 | 1097 | ||
| 1038 | ret = generic_permission(inode, mask, NULL); | 1098 | ret = generic_permission(inode, mask, ocfs2_check_acl); |
| 1039 | 1099 | ||
| 1040 | ocfs2_inode_unlock(inode, 0); | 1100 | ocfs2_inode_unlock(inode, 0); |
| 1041 | out: | 1101 | out: |
| @@ -1061,8 +1121,8 @@ static int __ocfs2_write_remove_suid(struct inode *inode, | |||
| 1061 | goto out; | 1121 | goto out; |
| 1062 | } | 1122 | } |
| 1063 | 1123 | ||
| 1064 | ret = ocfs2_journal_access(handle, inode, bh, | 1124 | ret = ocfs2_journal_access_di(handle, inode, bh, |
| 1065 | OCFS2_JOURNAL_ACCESS_WRITE); | 1125 | OCFS2_JOURNAL_ACCESS_WRITE); |
| 1066 | if (ret < 0) { | 1126 | if (ret < 0) { |
| 1067 | mlog_errno(ret); | 1127 | mlog_errno(ret); |
| 1068 | goto out_trans; | 1128 | goto out_trans; |
| @@ -1128,9 +1188,8 @@ static int ocfs2_write_remove_suid(struct inode *inode) | |||
| 1128 | { | 1188 | { |
| 1129 | int ret; | 1189 | int ret; |
| 1130 | struct buffer_head *bh = NULL; | 1190 | struct buffer_head *bh = NULL; |
| 1131 | struct ocfs2_inode_info *oi = OCFS2_I(inode); | ||
| 1132 | 1191 | ||
| 1133 | ret = ocfs2_read_block(inode, oi->ip_blkno, &bh); | 1192 | ret = ocfs2_read_inode_block(inode, &bh); |
| 1134 | if (ret < 0) { | 1193 | if (ret < 0) { |
| 1135 | mlog_errno(ret); | 1194 | mlog_errno(ret); |
| 1136 | goto out; | 1195 | goto out; |
| @@ -1156,8 +1215,7 @@ static int ocfs2_allocate_unwritten_extents(struct inode *inode, | |||
| 1156 | struct buffer_head *di_bh = NULL; | 1215 | struct buffer_head *di_bh = NULL; |
| 1157 | 1216 | ||
| 1158 | if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) { | 1217 | if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) { |
| 1159 | ret = ocfs2_read_block(inode, OCFS2_I(inode)->ip_blkno, | 1218 | ret = ocfs2_read_inode_block(inode, &di_bh); |
| 1160 | &di_bh); | ||
| 1161 | if (ret) { | 1219 | if (ret) { |
| 1162 | mlog_errno(ret); | 1220 | mlog_errno(ret); |
| 1163 | goto out; | 1221 | goto out; |
| @@ -1226,83 +1284,6 @@ out: | |||
| 1226 | return ret; | 1284 | return ret; |
| 1227 | } | 1285 | } |
| 1228 | 1286 | ||
| 1229 | static int __ocfs2_remove_inode_range(struct inode *inode, | ||
| 1230 | struct buffer_head *di_bh, | ||
| 1231 | u32 cpos, u32 phys_cpos, u32 len, | ||
| 1232 | struct ocfs2_cached_dealloc_ctxt *dealloc) | ||
| 1233 | { | ||
| 1234 | int ret; | ||
| 1235 | u64 phys_blkno = ocfs2_clusters_to_blocks(inode->i_sb, phys_cpos); | ||
| 1236 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | ||
| 1237 | struct inode *tl_inode = osb->osb_tl_inode; | ||
| 1238 | handle_t *handle; | ||
| 1239 | struct ocfs2_alloc_context *meta_ac = NULL; | ||
| 1240 | struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; | ||
| 1241 | struct ocfs2_extent_tree et; | ||
| 1242 | |||
| 1243 | ocfs2_init_dinode_extent_tree(&et, inode, di_bh); | ||
| 1244 | |||
| 1245 | ret = ocfs2_lock_allocators(inode, &et, 0, 1, NULL, &meta_ac); | ||
| 1246 | if (ret) { | ||
| 1247 | mlog_errno(ret); | ||
| 1248 | return ret; | ||
| 1249 | } | ||
| 1250 | |||
| 1251 | mutex_lock(&tl_inode->i_mutex); | ||
| 1252 | |||
| 1253 | if (ocfs2_truncate_log_needs_flush(osb)) { | ||
| 1254 | ret = __ocfs2_flush_truncate_log(osb); | ||
| 1255 | if (ret < 0) { | ||
| 1256 | mlog_errno(ret); | ||
| 1257 | goto out; | ||
| 1258 | } | ||
| 1259 | } | ||
| 1260 | |||
| 1261 | handle = ocfs2_start_trans(osb, OCFS2_REMOVE_EXTENT_CREDITS); | ||
| 1262 | if (IS_ERR(handle)) { | ||
| 1263 | ret = PTR_ERR(handle); | ||
| 1264 | mlog_errno(ret); | ||
| 1265 | goto out; | ||
| 1266 | } | ||
| 1267 | |||
| 1268 | ret = ocfs2_journal_access(handle, inode, di_bh, | ||
| 1269 | OCFS2_JOURNAL_ACCESS_WRITE); | ||
| 1270 | if (ret) { | ||
| 1271 | mlog_errno(ret); | ||
| 1272 | goto out; | ||
| 1273 | } | ||
| 1274 | |||
| 1275 | ret = ocfs2_remove_extent(inode, &et, cpos, len, handle, meta_ac, | ||
| 1276 | dealloc); | ||
| 1277 | if (ret) { | ||
| 1278 | mlog_errno(ret); | ||
| 1279 | goto out_commit; | ||
| 1280 | } | ||
| 1281 | |||
| 1282 | OCFS2_I(inode)->ip_clusters -= len; | ||
| 1283 | di->i_clusters = cpu_to_le32(OCFS2_I(inode)->ip_clusters); | ||
| 1284 | |||
| 1285 | ret = ocfs2_journal_dirty(handle, di_bh); | ||
| 1286 | if (ret) { | ||
| 1287 | mlog_errno(ret); | ||
| 1288 | goto out_commit; | ||
| 1289 | } | ||
| 1290 | |||
| 1291 | ret = ocfs2_truncate_log_append(osb, handle, phys_blkno, len); | ||
| 1292 | if (ret) | ||
| 1293 | mlog_errno(ret); | ||
| 1294 | |||
| 1295 | out_commit: | ||
| 1296 | ocfs2_commit_trans(osb, handle); | ||
| 1297 | out: | ||
| 1298 | mutex_unlock(&tl_inode->i_mutex); | ||
| 1299 | |||
| 1300 | if (meta_ac) | ||
| 1301 | ocfs2_free_alloc_context(meta_ac); | ||
| 1302 | |||
| 1303 | return ret; | ||
| 1304 | } | ||
| 1305 | |||
| 1306 | /* | 1287 | /* |
| 1307 | * Truncate a byte range, avoiding pages within partial clusters. This | 1288 | * Truncate a byte range, avoiding pages within partial clusters. This |
| 1308 | * preserves those pages for the zeroing code to write to. | 1289 | * preserves those pages for the zeroing code to write to. |
| @@ -1402,7 +1383,9 @@ static int ocfs2_remove_inode_range(struct inode *inode, | |||
| 1402 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | 1383 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); |
| 1403 | struct ocfs2_cached_dealloc_ctxt dealloc; | 1384 | struct ocfs2_cached_dealloc_ctxt dealloc; |
| 1404 | struct address_space *mapping = inode->i_mapping; | 1385 | struct address_space *mapping = inode->i_mapping; |
| 1386 | struct ocfs2_extent_tree et; | ||
| 1405 | 1387 | ||
| 1388 | ocfs2_init_dinode_extent_tree(&et, inode, di_bh); | ||
| 1406 | ocfs2_init_dealloc_ctxt(&dealloc); | 1389 | ocfs2_init_dealloc_ctxt(&dealloc); |
| 1407 | 1390 | ||
| 1408 | if (byte_len == 0) | 1391 | if (byte_len == 0) |
| @@ -1458,9 +1441,9 @@ static int ocfs2_remove_inode_range(struct inode *inode, | |||
| 1458 | 1441 | ||
| 1459 | /* Only do work for non-holes */ | 1442 | /* Only do work for non-holes */ |
| 1460 | if (phys_cpos != 0) { | 1443 | if (phys_cpos != 0) { |
| 1461 | ret = __ocfs2_remove_inode_range(inode, di_bh, cpos, | 1444 | ret = ocfs2_remove_btree_range(inode, &et, cpos, |
| 1462 | phys_cpos, alloc_size, | 1445 | phys_cpos, alloc_size, |
| 1463 | &dealloc); | 1446 | &dealloc); |
| 1464 | if (ret) { | 1447 | if (ret) { |
| 1465 | mlog_errno(ret); | 1448 | mlog_errno(ret); |
| 1466 | goto out; | 1449 | goto out; |
