diff options
Diffstat (limited to 'fs/ocfs2/file.c')
| -rw-r--r-- | fs/ocfs2/file.c | 163 |
1 files changed, 99 insertions, 64 deletions
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index b75b2e1f0e42..ed5d5232e85d 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c | |||
| @@ -51,6 +51,7 @@ | |||
| 51 | #include "inode.h" | 51 | #include "inode.h" |
| 52 | #include "ioctl.h" | 52 | #include "ioctl.h" |
| 53 | #include "journal.h" | 53 | #include "journal.h" |
| 54 | #include "locks.h" | ||
| 54 | #include "mmap.h" | 55 | #include "mmap.h" |
| 55 | #include "suballoc.h" | 56 | #include "suballoc.h" |
| 56 | #include "super.h" | 57 | #include "super.h" |
| @@ -63,6 +64,35 @@ static int ocfs2_sync_inode(struct inode *inode) | |||
| 63 | return sync_mapping_buffers(inode->i_mapping); | 64 | return sync_mapping_buffers(inode->i_mapping); |
| 64 | } | 65 | } |
| 65 | 66 | ||
| 67 | static int ocfs2_init_file_private(struct inode *inode, struct file *file) | ||
| 68 | { | ||
| 69 | struct ocfs2_file_private *fp; | ||
| 70 | |||
| 71 | fp = kzalloc(sizeof(struct ocfs2_file_private), GFP_KERNEL); | ||
| 72 | if (!fp) | ||
| 73 | return -ENOMEM; | ||
| 74 | |||
| 75 | fp->fp_file = file; | ||
| 76 | mutex_init(&fp->fp_mutex); | ||
| 77 | ocfs2_file_lock_res_init(&fp->fp_flock, fp); | ||
| 78 | file->private_data = fp; | ||
| 79 | |||
| 80 | return 0; | ||
| 81 | } | ||
| 82 | |||
| 83 | static void ocfs2_free_file_private(struct inode *inode, struct file *file) | ||
| 84 | { | ||
| 85 | struct ocfs2_file_private *fp = file->private_data; | ||
| 86 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | ||
| 87 | |||
| 88 | if (fp) { | ||
| 89 | ocfs2_simple_drop_lockres(osb, &fp->fp_flock); | ||
| 90 | ocfs2_lock_res_free(&fp->fp_flock); | ||
| 91 | kfree(fp); | ||
| 92 | file->private_data = NULL; | ||
| 93 | } | ||
| 94 | } | ||
| 95 | |||
| 66 | static int ocfs2_file_open(struct inode *inode, struct file *file) | 96 | static int ocfs2_file_open(struct inode *inode, struct file *file) |
| 67 | { | 97 | { |
| 68 | int status; | 98 | int status; |
| @@ -89,7 +119,18 @@ static int ocfs2_file_open(struct inode *inode, struct file *file) | |||
| 89 | 119 | ||
| 90 | oi->ip_open_count++; | 120 | oi->ip_open_count++; |
| 91 | spin_unlock(&oi->ip_lock); | 121 | spin_unlock(&oi->ip_lock); |
| 92 | status = 0; | 122 | |
| 123 | status = ocfs2_init_file_private(inode, file); | ||
| 124 | if (status) { | ||
| 125 | /* | ||
| 126 | * We want to set open count back if we're failing the | ||
| 127 | * open. | ||
| 128 | */ | ||
| 129 | spin_lock(&oi->ip_lock); | ||
| 130 | oi->ip_open_count--; | ||
| 131 | spin_unlock(&oi->ip_lock); | ||
| 132 | } | ||
| 133 | |||
| 93 | leave: | 134 | leave: |
| 94 | mlog_exit(status); | 135 | mlog_exit(status); |
| 95 | return status; | 136 | return status; |
| @@ -108,11 +149,24 @@ static int ocfs2_file_release(struct inode *inode, struct file *file) | |||
| 108 | oi->ip_flags &= ~OCFS2_INODE_OPEN_DIRECT; | 149 | oi->ip_flags &= ~OCFS2_INODE_OPEN_DIRECT; |
| 109 | spin_unlock(&oi->ip_lock); | 150 | spin_unlock(&oi->ip_lock); |
| 110 | 151 | ||
| 152 | ocfs2_free_file_private(inode, file); | ||
| 153 | |||
| 111 | mlog_exit(0); | 154 | mlog_exit(0); |
| 112 | 155 | ||
| 113 | return 0; | 156 | return 0; |
| 114 | } | 157 | } |
| 115 | 158 | ||
| 159 | static int ocfs2_dir_open(struct inode *inode, struct file *file) | ||
| 160 | { | ||
| 161 | return ocfs2_init_file_private(inode, file); | ||
| 162 | } | ||
| 163 | |||
| 164 | static int ocfs2_dir_release(struct inode *inode, struct file *file) | ||
| 165 | { | ||
| 166 | ocfs2_free_file_private(inode, file); | ||
| 167 | return 0; | ||
| 168 | } | ||
| 169 | |||
| 116 | static int ocfs2_sync_file(struct file *file, | 170 | static int ocfs2_sync_file(struct file *file, |
| 117 | struct dentry *dentry, | 171 | struct dentry *dentry, |
| 118 | int datasync) | 172 | int datasync) |
| @@ -382,18 +436,13 @@ static int ocfs2_truncate_file(struct inode *inode, | |||
| 382 | 436 | ||
| 383 | down_write(&OCFS2_I(inode)->ip_alloc_sem); | 437 | down_write(&OCFS2_I(inode)->ip_alloc_sem); |
| 384 | 438 | ||
| 385 | /* This forces other nodes to sync and drop their pages. Do | 439 | /* |
| 386 | * this even if we have a truncate without allocation change - | 440 | * The inode lock forced other nodes to sync and drop their |
| 387 | * ocfs2 cluster sizes can be much greater than page size, so | 441 | * pages, which (correctly) happens even if we have a truncate |
| 388 | * we have to truncate them anyway. */ | 442 | * without allocation change - ocfs2 cluster sizes can be much |
| 389 | status = ocfs2_data_lock(inode, 1); | 443 | * greater than page size, so we have to truncate them |
| 390 | if (status < 0) { | 444 | * anyway. |
| 391 | up_write(&OCFS2_I(inode)->ip_alloc_sem); | 445 | */ |
| 392 | |||
| 393 | mlog_errno(status); | ||
| 394 | goto bail; | ||
| 395 | } | ||
| 396 | |||
| 397 | unmap_mapping_range(inode->i_mapping, new_i_size + PAGE_SIZE - 1, 0, 1); | 446 | unmap_mapping_range(inode->i_mapping, new_i_size + PAGE_SIZE - 1, 0, 1); |
| 398 | truncate_inode_pages(inode->i_mapping, new_i_size); | 447 | truncate_inode_pages(inode->i_mapping, new_i_size); |
| 399 | 448 | ||
| @@ -403,7 +452,7 @@ static int ocfs2_truncate_file(struct inode *inode, | |||
| 403 | if (status) | 452 | if (status) |
| 404 | mlog_errno(status); | 453 | mlog_errno(status); |
| 405 | 454 | ||
| 406 | goto bail_unlock_data; | 455 | goto bail_unlock_sem; |
| 407 | } | 456 | } |
| 408 | 457 | ||
| 409 | /* alright, we're going to need to do a full blown alloc size | 458 | /* alright, we're going to need to do a full blown alloc size |
| @@ -413,25 +462,23 @@ static int ocfs2_truncate_file(struct inode *inode, | |||
| 413 | status = ocfs2_orphan_for_truncate(osb, inode, di_bh, new_i_size); | 462 | status = ocfs2_orphan_for_truncate(osb, inode, di_bh, new_i_size); |
| 414 | if (status < 0) { | 463 | if (status < 0) { |
| 415 | mlog_errno(status); | 464 | mlog_errno(status); |
| 416 | goto bail_unlock_data; | 465 | goto bail_unlock_sem; |
| 417 | } | 466 | } |
| 418 | 467 | ||
| 419 | status = ocfs2_prepare_truncate(osb, inode, di_bh, &tc); | 468 | status = ocfs2_prepare_truncate(osb, inode, di_bh, &tc); |
| 420 | if (status < 0) { | 469 | if (status < 0) { |
| 421 | mlog_errno(status); | 470 | mlog_errno(status); |
| 422 | goto bail_unlock_data; | 471 | goto bail_unlock_sem; |
| 423 | } | 472 | } |
| 424 | 473 | ||
| 425 | status = ocfs2_commit_truncate(osb, inode, di_bh, tc); | 474 | status = ocfs2_commit_truncate(osb, inode, di_bh, tc); |
| 426 | if (status < 0) { | 475 | if (status < 0) { |
| 427 | mlog_errno(status); | 476 | mlog_errno(status); |
| 428 | goto bail_unlock_data; | 477 | goto bail_unlock_sem; |
| 429 | } | 478 | } |
| 430 | 479 | ||
| 431 | /* TODO: orphan dir cleanup here. */ | 480 | /* TODO: orphan dir cleanup here. */ |
| 432 | bail_unlock_data: | 481 | bail_unlock_sem: |
| 433 | ocfs2_data_unlock(inode, 1); | ||
| 434 | |||
| 435 | up_write(&OCFS2_I(inode)->ip_alloc_sem); | 482 | up_write(&OCFS2_I(inode)->ip_alloc_sem); |
| 436 | 483 | ||
| 437 | bail: | 484 | bail: |
| @@ -579,7 +626,7 @@ int ocfs2_lock_allocators(struct inode *inode, struct ocfs2_dinode *di, | |||
| 579 | 626 | ||
| 580 | mlog(0, "extend inode %llu, i_size = %lld, di->i_clusters = %u, " | 627 | mlog(0, "extend inode %llu, i_size = %lld, di->i_clusters = %u, " |
| 581 | "clusters_to_add = %u, extents_to_split = %u\n", | 628 | "clusters_to_add = %u, extents_to_split = %u\n", |
| 582 | (unsigned long long)OCFS2_I(inode)->ip_blkno, i_size_read(inode), | 629 | (unsigned long long)OCFS2_I(inode)->ip_blkno, (long long)i_size_read(inode), |
| 583 | le32_to_cpu(di->i_clusters), clusters_to_add, extents_to_split); | 630 | le32_to_cpu(di->i_clusters), clusters_to_add, extents_to_split); |
| 584 | 631 | ||
| 585 | num_free_extents = ocfs2_num_free_extents(osb, inode, di); | 632 | num_free_extents = ocfs2_num_free_extents(osb, inode, di); |
| @@ -760,7 +807,7 @@ restarted_transaction: | |||
| 760 | le32_to_cpu(fe->i_clusters), | 807 | le32_to_cpu(fe->i_clusters), |
| 761 | (unsigned long long)le64_to_cpu(fe->i_size)); | 808 | (unsigned long long)le64_to_cpu(fe->i_size)); |
| 762 | mlog(0, "inode: ip_clusters=%u, i_size=%lld\n", | 809 | mlog(0, "inode: ip_clusters=%u, i_size=%lld\n", |
| 763 | OCFS2_I(inode)->ip_clusters, i_size_read(inode)); | 810 | OCFS2_I(inode)->ip_clusters, (long long)i_size_read(inode)); |
| 764 | 811 | ||
| 765 | leave: | 812 | leave: |
| 766 | if (handle) { | 813 | if (handle) { |
| @@ -917,7 +964,7 @@ static int ocfs2_extend_file(struct inode *inode, | |||
| 917 | struct buffer_head *di_bh, | 964 | struct buffer_head *di_bh, |
| 918 | u64 new_i_size) | 965 | u64 new_i_size) |
| 919 | { | 966 | { |
| 920 | int ret = 0, data_locked = 0; | 967 | int ret = 0; |
| 921 | struct ocfs2_inode_info *oi = OCFS2_I(inode); | 968 | struct ocfs2_inode_info *oi = OCFS2_I(inode); |
| 922 | 969 | ||
| 923 | BUG_ON(!di_bh); | 970 | BUG_ON(!di_bh); |
| @@ -943,20 +990,6 @@ static int ocfs2_extend_file(struct inode *inode, | |||
| 943 | && ocfs2_sparse_alloc(OCFS2_SB(inode->i_sb))) | 990 | && ocfs2_sparse_alloc(OCFS2_SB(inode->i_sb))) |
| 944 | goto out_update_size; | 991 | goto out_update_size; |
| 945 | 992 | ||
| 946 | /* | ||
| 947 | * protect the pages that ocfs2_zero_extend is going to be | ||
| 948 | * pulling into the page cache.. we do this before the | ||
| 949 | * metadata extend so that we don't get into the situation | ||
| 950 | * where we've extended the metadata but can't get the data | ||
| 951 | * lock to zero. | ||
| 952 | */ | ||
| 953 | ret = ocfs2_data_lock(inode, 1); | ||
| 954 | if (ret < 0) { | ||
| 955 | mlog_errno(ret); | ||
| 956 | goto out; | ||
| 957 | } | ||
| 958 | data_locked = 1; | ||
| 959 | |||
| 960 | /* | 993 | /* |
| 961 | * The alloc sem blocks people in read/write from reading our | 994 | * The alloc sem blocks people in read/write from reading our |
| 962 | * allocation until we're done changing it. We depend on | 995 | * allocation until we're done changing it. We depend on |
| @@ -980,7 +1013,7 @@ static int ocfs2_extend_file(struct inode *inode, | |||
| 980 | up_write(&oi->ip_alloc_sem); | 1013 | up_write(&oi->ip_alloc_sem); |
| 981 | 1014 | ||
| 982 | mlog_errno(ret); | 1015 | mlog_errno(ret); |
| 983 | goto out_unlock; | 1016 | goto out; |
| 984 | } | 1017 | } |
| 985 | } | 1018 | } |
| 986 | 1019 | ||
| @@ -991,7 +1024,7 @@ static int ocfs2_extend_file(struct inode *inode, | |||
| 991 | 1024 | ||
| 992 | if (ret < 0) { | 1025 | if (ret < 0) { |
| 993 | mlog_errno(ret); | 1026 | mlog_errno(ret); |
| 994 | goto out_unlock; | 1027 | goto out; |
| 995 | } | 1028 | } |
| 996 | 1029 | ||
| 997 | out_update_size: | 1030 | out_update_size: |
| @@ -999,10 +1032,6 @@ out_update_size: | |||
| 999 | if (ret < 0) | 1032 | if (ret < 0) |
| 1000 | mlog_errno(ret); | 1033 | mlog_errno(ret); |
| 1001 | 1034 | ||
| 1002 | out_unlock: | ||
| 1003 | if (data_locked) | ||
| 1004 | ocfs2_data_unlock(inode, 1); | ||
| 1005 | |||
| 1006 | out: | 1035 | out: |
| 1007 | return ret; | 1036 | return ret; |
| 1008 | } | 1037 | } |
| @@ -1050,7 +1079,7 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 1050 | } | 1079 | } |
| 1051 | } | 1080 | } |
| 1052 | 1081 | ||
| 1053 | status = ocfs2_meta_lock(inode, &bh, 1); | 1082 | status = ocfs2_inode_lock(inode, &bh, 1); |
| 1054 | if (status < 0) { | 1083 | if (status < 0) { |
| 1055 | if (status != -ENOENT) | 1084 | if (status != -ENOENT) |
| 1056 | mlog_errno(status); | 1085 | mlog_errno(status); |
| @@ -1102,7 +1131,7 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 1102 | bail_commit: | 1131 | bail_commit: |
| 1103 | ocfs2_commit_trans(osb, handle); | 1132 | ocfs2_commit_trans(osb, handle); |
| 1104 | bail_unlock: | 1133 | bail_unlock: |
| 1105 | ocfs2_meta_unlock(inode, 1); | 1134 | ocfs2_inode_unlock(inode, 1); |
| 1106 | bail_unlock_rw: | 1135 | bail_unlock_rw: |
| 1107 | if (size_change) | 1136 | if (size_change) |
| 1108 | ocfs2_rw_unlock(inode, 1); | 1137 | ocfs2_rw_unlock(inode, 1); |
| @@ -1149,7 +1178,7 @@ int ocfs2_permission(struct inode *inode, int mask, struct nameidata *nd) | |||
| 1149 | 1178 | ||
| 1150 | mlog_entry_void(); | 1179 | mlog_entry_void(); |
| 1151 | 1180 | ||
| 1152 | ret = ocfs2_meta_lock(inode, NULL, 0); | 1181 | ret = ocfs2_inode_lock(inode, NULL, 0); |
| 1153 | if (ret) { | 1182 | if (ret) { |
| 1154 | if (ret != -ENOENT) | 1183 | if (ret != -ENOENT) |
| 1155 | mlog_errno(ret); | 1184 | mlog_errno(ret); |
| @@ -1158,7 +1187,7 @@ int ocfs2_permission(struct inode *inode, int mask, struct nameidata *nd) | |||
| 1158 | 1187 | ||
| 1159 | ret = generic_permission(inode, mask, NULL); | 1188 | ret = generic_permission(inode, mask, NULL); |
| 1160 | 1189 | ||
| 1161 | ocfs2_meta_unlock(inode, 0); | 1190 | ocfs2_inode_unlock(inode, 0); |
| 1162 | out: | 1191 | out: |
| 1163 | mlog_exit(ret); | 1192 | mlog_exit(ret); |
| 1164 | return ret; | 1193 | return ret; |
| @@ -1630,7 +1659,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode, | |||
| 1630 | goto out; | 1659 | goto out; |
| 1631 | } | 1660 | } |
| 1632 | 1661 | ||
| 1633 | ret = ocfs2_meta_lock(inode, &di_bh, 1); | 1662 | ret = ocfs2_inode_lock(inode, &di_bh, 1); |
| 1634 | if (ret) { | 1663 | if (ret) { |
| 1635 | mlog_errno(ret); | 1664 | mlog_errno(ret); |
| 1636 | goto out_rw_unlock; | 1665 | goto out_rw_unlock; |
| @@ -1638,7 +1667,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode, | |||
| 1638 | 1667 | ||
| 1639 | if (inode->i_flags & (S_IMMUTABLE|S_APPEND)) { | 1668 | if (inode->i_flags & (S_IMMUTABLE|S_APPEND)) { |
| 1640 | ret = -EPERM; | 1669 | ret = -EPERM; |
| 1641 | goto out_meta_unlock; | 1670 | goto out_inode_unlock; |
| 1642 | } | 1671 | } |
| 1643 | 1672 | ||
| 1644 | switch (sr->l_whence) { | 1673 | switch (sr->l_whence) { |
| @@ -1652,7 +1681,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode, | |||
| 1652 | break; | 1681 | break; |
| 1653 | default: | 1682 | default: |
| 1654 | ret = -EINVAL; | 1683 | ret = -EINVAL; |
| 1655 | goto out_meta_unlock; | 1684 | goto out_inode_unlock; |
| 1656 | } | 1685 | } |
| 1657 | sr->l_whence = 0; | 1686 | sr->l_whence = 0; |
| 1658 | 1687 | ||
| @@ -1663,14 +1692,14 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode, | |||
| 1663 | || (sr->l_start + llen) < 0 | 1692 | || (sr->l_start + llen) < 0 |
| 1664 | || (sr->l_start + llen) > max_off) { | 1693 | || (sr->l_start + llen) > max_off) { |
| 1665 | ret = -EINVAL; | 1694 | ret = -EINVAL; |
| 1666 | goto out_meta_unlock; | 1695 | goto out_inode_unlock; |
| 1667 | } | 1696 | } |
| 1668 | size = sr->l_start + sr->l_len; | 1697 | size = sr->l_start + sr->l_len; |
| 1669 | 1698 | ||
| 1670 | if (cmd == OCFS2_IOC_RESVSP || cmd == OCFS2_IOC_RESVSP64) { | 1699 | if (cmd == OCFS2_IOC_RESVSP || cmd == OCFS2_IOC_RESVSP64) { |
| 1671 | if (sr->l_len <= 0) { | 1700 | if (sr->l_len <= 0) { |
| 1672 | ret = -EINVAL; | 1701 | ret = -EINVAL; |
| 1673 | goto out_meta_unlock; | 1702 | goto out_inode_unlock; |
| 1674 | } | 1703 | } |
| 1675 | } | 1704 | } |
| 1676 | 1705 | ||
| @@ -1678,7 +1707,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode, | |||
| 1678 | ret = __ocfs2_write_remove_suid(inode, di_bh); | 1707 | ret = __ocfs2_write_remove_suid(inode, di_bh); |
| 1679 | if (ret) { | 1708 | if (ret) { |
| 1680 | mlog_errno(ret); | 1709 | mlog_errno(ret); |
| 1681 | goto out_meta_unlock; | 1710 | goto out_inode_unlock; |
| 1682 | } | 1711 | } |
| 1683 | } | 1712 | } |
| 1684 | 1713 | ||
| @@ -1704,7 +1733,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode, | |||
| 1704 | up_write(&OCFS2_I(inode)->ip_alloc_sem); | 1733 | up_write(&OCFS2_I(inode)->ip_alloc_sem); |
| 1705 | if (ret) { | 1734 | if (ret) { |
| 1706 | mlog_errno(ret); | 1735 | mlog_errno(ret); |
| 1707 | goto out_meta_unlock; | 1736 | goto out_inode_unlock; |
| 1708 | } | 1737 | } |
| 1709 | 1738 | ||
| 1710 | /* | 1739 | /* |
| @@ -1714,7 +1743,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode, | |||
| 1714 | if (IS_ERR(handle)) { | 1743 | if (IS_ERR(handle)) { |
| 1715 | ret = PTR_ERR(handle); | 1744 | ret = PTR_ERR(handle); |
| 1716 | mlog_errno(ret); | 1745 | mlog_errno(ret); |
| 1717 | goto out_meta_unlock; | 1746 | goto out_inode_unlock; |
| 1718 | } | 1747 | } |
| 1719 | 1748 | ||
| 1720 | if (change_size && i_size_read(inode) < size) | 1749 | if (change_size && i_size_read(inode) < size) |
| @@ -1727,9 +1756,9 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode, | |||
| 1727 | 1756 | ||
| 1728 | ocfs2_commit_trans(osb, handle); | 1757 | ocfs2_commit_trans(osb, handle); |
| 1729 | 1758 | ||
| 1730 | out_meta_unlock: | 1759 | out_inode_unlock: |
| 1731 | brelse(di_bh); | 1760 | brelse(di_bh); |
| 1732 | ocfs2_meta_unlock(inode, 1); | 1761 | ocfs2_inode_unlock(inode, 1); |
| 1733 | out_rw_unlock: | 1762 | out_rw_unlock: |
| 1734 | ocfs2_rw_unlock(inode, 1); | 1763 | ocfs2_rw_unlock(inode, 1); |
| 1735 | 1764 | ||
| @@ -1799,7 +1828,7 @@ static int ocfs2_prepare_inode_for_write(struct dentry *dentry, | |||
| 1799 | * if we need to make modifications here. | 1828 | * if we need to make modifications here. |
| 1800 | */ | 1829 | */ |
| 1801 | for(;;) { | 1830 | for(;;) { |
| 1802 | ret = ocfs2_meta_lock(inode, NULL, meta_level); | 1831 | ret = ocfs2_inode_lock(inode, NULL, meta_level); |
| 1803 | if (ret < 0) { | 1832 | if (ret < 0) { |
| 1804 | meta_level = -1; | 1833 | meta_level = -1; |
| 1805 | mlog_errno(ret); | 1834 | mlog_errno(ret); |
| @@ -1817,7 +1846,7 @@ static int ocfs2_prepare_inode_for_write(struct dentry *dentry, | |||
| 1817 | * set inode->i_size at the end of a write. */ | 1846 | * set inode->i_size at the end of a write. */ |
| 1818 | if (should_remove_suid(dentry)) { | 1847 | if (should_remove_suid(dentry)) { |
| 1819 | if (meta_level == 0) { | 1848 | if (meta_level == 0) { |
| 1820 | ocfs2_meta_unlock(inode, meta_level); | 1849 | ocfs2_inode_unlock(inode, meta_level); |
| 1821 | meta_level = 1; | 1850 | meta_level = 1; |
| 1822 | continue; | 1851 | continue; |
| 1823 | } | 1852 | } |
| @@ -1886,7 +1915,7 @@ static int ocfs2_prepare_inode_for_write(struct dentry *dentry, | |||
| 1886 | *ppos = saved_pos; | 1915 | *ppos = saved_pos; |
| 1887 | 1916 | ||
| 1888 | out_unlock: | 1917 | out_unlock: |
| 1889 | ocfs2_meta_unlock(inode, meta_level); | 1918 | ocfs2_inode_unlock(inode, meta_level); |
| 1890 | 1919 | ||
| 1891 | out: | 1920 | out: |
| 1892 | return ret; | 1921 | return ret; |
| @@ -2099,12 +2128,12 @@ static ssize_t ocfs2_file_splice_read(struct file *in, | |||
| 2099 | /* | 2128 | /* |
| 2100 | * See the comment in ocfs2_file_aio_read() | 2129 | * See the comment in ocfs2_file_aio_read() |
| 2101 | */ | 2130 | */ |
| 2102 | ret = ocfs2_meta_lock(inode, NULL, 0); | 2131 | ret = ocfs2_inode_lock(inode, NULL, 0); |
| 2103 | if (ret < 0) { | 2132 | if (ret < 0) { |
| 2104 | mlog_errno(ret); | 2133 | mlog_errno(ret); |
| 2105 | goto bail; | 2134 | goto bail; |
| 2106 | } | 2135 | } |
| 2107 | ocfs2_meta_unlock(inode, 0); | 2136 | ocfs2_inode_unlock(inode, 0); |
| 2108 | 2137 | ||
| 2109 | ret = generic_file_splice_read(in, ppos, pipe, len, flags); | 2138 | ret = generic_file_splice_read(in, ppos, pipe, len, flags); |
| 2110 | 2139 | ||
| @@ -2160,12 +2189,12 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb, | |||
| 2160 | * like i_size. This allows the checks down below | 2189 | * like i_size. This allows the checks down below |
| 2161 | * generic_file_aio_read() a chance of actually working. | 2190 | * generic_file_aio_read() a chance of actually working. |
| 2162 | */ | 2191 | */ |
| 2163 | ret = ocfs2_meta_lock_atime(inode, filp->f_vfsmnt, &lock_level); | 2192 | ret = ocfs2_inode_lock_atime(inode, filp->f_vfsmnt, &lock_level); |
| 2164 | if (ret < 0) { | 2193 | if (ret < 0) { |
| 2165 | mlog_errno(ret); | 2194 | mlog_errno(ret); |
| 2166 | goto bail; | 2195 | goto bail; |
| 2167 | } | 2196 | } |
| 2168 | ocfs2_meta_unlock(inode, lock_level); | 2197 | ocfs2_inode_unlock(inode, lock_level); |
| 2169 | 2198 | ||
| 2170 | ret = generic_file_aio_read(iocb, iov, nr_segs, iocb->ki_pos); | 2199 | ret = generic_file_aio_read(iocb, iov, nr_segs, iocb->ki_pos); |
| 2171 | if (ret == -EINVAL) | 2200 | if (ret == -EINVAL) |
| @@ -2204,6 +2233,7 @@ const struct inode_operations ocfs2_special_file_iops = { | |||
| 2204 | }; | 2233 | }; |
| 2205 | 2234 | ||
| 2206 | const struct file_operations ocfs2_fops = { | 2235 | const struct file_operations ocfs2_fops = { |
| 2236 | .llseek = generic_file_llseek, | ||
| 2207 | .read = do_sync_read, | 2237 | .read = do_sync_read, |
| 2208 | .write = do_sync_write, | 2238 | .write = do_sync_write, |
| 2209 | .mmap = ocfs2_mmap, | 2239 | .mmap = ocfs2_mmap, |
| @@ -2216,16 +2246,21 @@ const struct file_operations ocfs2_fops = { | |||
| 2216 | #ifdef CONFIG_COMPAT | 2246 | #ifdef CONFIG_COMPAT |
| 2217 | .compat_ioctl = ocfs2_compat_ioctl, | 2247 | .compat_ioctl = ocfs2_compat_ioctl, |
| 2218 | #endif | 2248 | #endif |
| 2249 | .flock = ocfs2_flock, | ||
| 2219 | .splice_read = ocfs2_file_splice_read, | 2250 | .splice_read = ocfs2_file_splice_read, |
| 2220 | .splice_write = ocfs2_file_splice_write, | 2251 | .splice_write = ocfs2_file_splice_write, |
| 2221 | }; | 2252 | }; |
| 2222 | 2253 | ||
| 2223 | const struct file_operations ocfs2_dops = { | 2254 | const struct file_operations ocfs2_dops = { |
| 2255 | .llseek = generic_file_llseek, | ||
| 2224 | .read = generic_read_dir, | 2256 | .read = generic_read_dir, |
| 2225 | .readdir = ocfs2_readdir, | 2257 | .readdir = ocfs2_readdir, |
| 2226 | .fsync = ocfs2_sync_file, | 2258 | .fsync = ocfs2_sync_file, |
| 2259 | .release = ocfs2_dir_release, | ||
| 2260 | .open = ocfs2_dir_open, | ||
| 2227 | .ioctl = ocfs2_ioctl, | 2261 | .ioctl = ocfs2_ioctl, |
| 2228 | #ifdef CONFIG_COMPAT | 2262 | #ifdef CONFIG_COMPAT |
| 2229 | .compat_ioctl = ocfs2_compat_ioctl, | 2263 | .compat_ioctl = ocfs2_compat_ioctl, |
| 2230 | #endif | 2264 | #endif |
| 2265 | .flock = ocfs2_flock, | ||
| 2231 | }; | 2266 | }; |
