diff options
Diffstat (limited to 'fs/ocfs2/file.c')
-rw-r--r-- | fs/ocfs2/file.c | 211 |
1 files changed, 97 insertions, 114 deletions
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index e2570a3bc2b2..a5887df2cd8a 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; |
@@ -1622,7 +1605,7 @@ int ocfs2_change_file_space(struct file *file, unsigned int cmd, | |||
1622 | struct ocfs2_space_resv *sr) | 1605 | struct ocfs2_space_resv *sr) |
1623 | { | 1606 | { |
1624 | struct inode *inode = file->f_path.dentry->d_inode; | 1607 | struct inode *inode = file->f_path.dentry->d_inode; |
1625 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);; | 1608 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); |
1626 | 1609 | ||
1627 | if ((cmd == OCFS2_IOC_RESVSP || cmd == OCFS2_IOC_RESVSP64) && | 1610 | if ((cmd == OCFS2_IOC_RESVSP || cmd == OCFS2_IOC_RESVSP64) && |
1628 | !ocfs2_writes_unwritten_extents(osb)) | 1611 | !ocfs2_writes_unwritten_extents(osb)) |