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 | }; |