diff options
Diffstat (limited to 'fs/ocfs2/file.c')
-rw-r--r-- | fs/ocfs2/file.c | 333 |
1 files changed, 118 insertions, 215 deletions
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index ed38796052d2..8d3225a78073 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c | |||
@@ -55,6 +55,7 @@ | |||
55 | #include "mmap.h" | 55 | #include "mmap.h" |
56 | #include "suballoc.h" | 56 | #include "suballoc.h" |
57 | #include "super.h" | 57 | #include "super.h" |
58 | #include "xattr.h" | ||
58 | 59 | ||
59 | #include "buffer_head_io.h" | 60 | #include "buffer_head_io.h" |
60 | 61 | ||
@@ -184,7 +185,7 @@ static int ocfs2_sync_file(struct file *file, | |||
184 | goto bail; | 185 | goto bail; |
185 | 186 | ||
186 | journal = osb->journal->j_journal; | 187 | journal = osb->journal->j_journal; |
187 | err = journal_force_commit(journal); | 188 | err = jbd2_journal_force_commit(journal); |
188 | 189 | ||
189 | bail: | 190 | bail: |
190 | mlog_exit(err); | 191 | mlog_exit(err); |
@@ -488,7 +489,7 @@ bail: | |||
488 | } | 489 | } |
489 | 490 | ||
490 | /* | 491 | /* |
491 | * extend allocation only here. | 492 | * extend file allocation only here. |
492 | * we'll update all the disk stuff, and oip->alloc_size | 493 | * we'll update all the disk stuff, and oip->alloc_size |
493 | * | 494 | * |
494 | * expect stuff to be locked, a transaction started and enough data / | 495 | * expect stuff to be locked, a transaction started and enough data / |
@@ -497,189 +498,25 @@ bail: | |||
497 | * Will return -EAGAIN, and a reason if a restart is needed. | 498 | * Will return -EAGAIN, and a reason if a restart is needed. |
498 | * If passed in, *reason will always be set, even in error. | 499 | * If passed in, *reason will always be set, even in error. |
499 | */ | 500 | */ |
500 | int ocfs2_do_extend_allocation(struct ocfs2_super *osb, | 501 | int ocfs2_add_inode_data(struct ocfs2_super *osb, |
501 | struct inode *inode, | 502 | struct inode *inode, |
502 | u32 *logical_offset, | 503 | u32 *logical_offset, |
503 | u32 clusters_to_add, | 504 | u32 clusters_to_add, |
504 | int mark_unwritten, | 505 | int mark_unwritten, |
505 | struct buffer_head *fe_bh, | 506 | struct buffer_head *fe_bh, |
506 | handle_t *handle, | 507 | handle_t *handle, |
507 | struct ocfs2_alloc_context *data_ac, | 508 | struct ocfs2_alloc_context *data_ac, |
508 | struct ocfs2_alloc_context *meta_ac, | 509 | struct ocfs2_alloc_context *meta_ac, |
509 | enum ocfs2_alloc_restarted *reason_ret) | 510 | enum ocfs2_alloc_restarted *reason_ret) |
510 | { | 511 | { |
511 | int status = 0; | 512 | int ret; |
512 | int free_extents; | 513 | struct ocfs2_extent_tree et; |
513 | struct ocfs2_dinode *fe = (struct ocfs2_dinode *) fe_bh->b_data; | ||
514 | enum ocfs2_alloc_restarted reason = RESTART_NONE; | ||
515 | u32 bit_off, num_bits; | ||
516 | u64 block; | ||
517 | u8 flags = 0; | ||
518 | |||
519 | BUG_ON(!clusters_to_add); | ||
520 | |||
521 | if (mark_unwritten) | ||
522 | flags = OCFS2_EXT_UNWRITTEN; | ||
523 | |||
524 | free_extents = ocfs2_num_free_extents(osb, inode, fe); | ||
525 | if (free_extents < 0) { | ||
526 | status = free_extents; | ||
527 | mlog_errno(status); | ||
528 | goto leave; | ||
529 | } | ||
530 | |||
531 | /* there are two cases which could cause us to EAGAIN in the | ||
532 | * we-need-more-metadata case: | ||
533 | * 1) we haven't reserved *any* | ||
534 | * 2) we are so fragmented, we've needed to add metadata too | ||
535 | * many times. */ | ||
536 | if (!free_extents && !meta_ac) { | ||
537 | mlog(0, "we haven't reserved any metadata!\n"); | ||
538 | status = -EAGAIN; | ||
539 | reason = RESTART_META; | ||
540 | goto leave; | ||
541 | } else if ((!free_extents) | ||
542 | && (ocfs2_alloc_context_bits_left(meta_ac) | ||
543 | < ocfs2_extend_meta_needed(fe))) { | ||
544 | mlog(0, "filesystem is really fragmented...\n"); | ||
545 | status = -EAGAIN; | ||
546 | reason = RESTART_META; | ||
547 | goto leave; | ||
548 | } | ||
549 | |||
550 | status = __ocfs2_claim_clusters(osb, handle, data_ac, 1, | ||
551 | clusters_to_add, &bit_off, &num_bits); | ||
552 | if (status < 0) { | ||
553 | if (status != -ENOSPC) | ||
554 | mlog_errno(status); | ||
555 | goto leave; | ||
556 | } | ||
557 | |||
558 | BUG_ON(num_bits > clusters_to_add); | ||
559 | |||
560 | /* reserve our write early -- insert_extent may update the inode */ | ||
561 | status = ocfs2_journal_access(handle, inode, fe_bh, | ||
562 | OCFS2_JOURNAL_ACCESS_WRITE); | ||
563 | if (status < 0) { | ||
564 | mlog_errno(status); | ||
565 | goto leave; | ||
566 | } | ||
567 | |||
568 | block = ocfs2_clusters_to_blocks(osb->sb, bit_off); | ||
569 | mlog(0, "Allocating %u clusters at block %u for inode %llu\n", | ||
570 | num_bits, bit_off, (unsigned long long)OCFS2_I(inode)->ip_blkno); | ||
571 | status = ocfs2_insert_extent(osb, handle, inode, fe_bh, | ||
572 | *logical_offset, block, num_bits, | ||
573 | flags, meta_ac); | ||
574 | if (status < 0) { | ||
575 | mlog_errno(status); | ||
576 | goto leave; | ||
577 | } | ||
578 | |||
579 | status = ocfs2_journal_dirty(handle, fe_bh); | ||
580 | if (status < 0) { | ||
581 | mlog_errno(status); | ||
582 | goto leave; | ||
583 | } | ||
584 | |||
585 | clusters_to_add -= num_bits; | ||
586 | *logical_offset += num_bits; | ||
587 | |||
588 | if (clusters_to_add) { | ||
589 | mlog(0, "need to alloc once more, clusters = %u, wanted = " | ||
590 | "%u\n", fe->i_clusters, clusters_to_add); | ||
591 | status = -EAGAIN; | ||
592 | reason = RESTART_TRANS; | ||
593 | } | ||
594 | |||
595 | leave: | ||
596 | mlog_exit(status); | ||
597 | if (reason_ret) | ||
598 | *reason_ret = reason; | ||
599 | return status; | ||
600 | } | ||
601 | |||
602 | /* | ||
603 | * For a given allocation, determine which allocators will need to be | ||
604 | * accessed, and lock them, reserving the appropriate number of bits. | ||
605 | * | ||
606 | * Sparse file systems call this from ocfs2_write_begin_nolock() | ||
607 | * and ocfs2_allocate_unwritten_extents(). | ||
608 | * | ||
609 | * File systems which don't support holes call this from | ||
610 | * ocfs2_extend_allocation(). | ||
611 | */ | ||
612 | int ocfs2_lock_allocators(struct inode *inode, struct ocfs2_dinode *di, | ||
613 | u32 clusters_to_add, u32 extents_to_split, | ||
614 | struct ocfs2_alloc_context **data_ac, | ||
615 | struct ocfs2_alloc_context **meta_ac) | ||
616 | { | ||
617 | int ret = 0, num_free_extents; | ||
618 | unsigned int max_recs_needed = clusters_to_add + 2 * extents_to_split; | ||
619 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | ||
620 | |||
621 | *meta_ac = NULL; | ||
622 | if (data_ac) | ||
623 | *data_ac = NULL; | ||
624 | |||
625 | BUG_ON(clusters_to_add != 0 && data_ac == NULL); | ||
626 | |||
627 | mlog(0, "extend inode %llu, i_size = %lld, di->i_clusters = %u, " | ||
628 | "clusters_to_add = %u, extents_to_split = %u\n", | ||
629 | (unsigned long long)OCFS2_I(inode)->ip_blkno, (long long)i_size_read(inode), | ||
630 | le32_to_cpu(di->i_clusters), clusters_to_add, extents_to_split); | ||
631 | |||
632 | num_free_extents = ocfs2_num_free_extents(osb, inode, di); | ||
633 | if (num_free_extents < 0) { | ||
634 | ret = num_free_extents; | ||
635 | mlog_errno(ret); | ||
636 | goto out; | ||
637 | } | ||
638 | |||
639 | /* | ||
640 | * Sparse allocation file systems need to be more conservative | ||
641 | * with reserving room for expansion - the actual allocation | ||
642 | * happens while we've got a journal handle open so re-taking | ||
643 | * a cluster lock (because we ran out of room for another | ||
644 | * extent) will violate ordering rules. | ||
645 | * | ||
646 | * Most of the time we'll only be seeing this 1 cluster at a time | ||
647 | * anyway. | ||
648 | * | ||
649 | * Always lock for any unwritten extents - we might want to | ||
650 | * add blocks during a split. | ||
651 | */ | ||
652 | if (!num_free_extents || | ||
653 | (ocfs2_sparse_alloc(osb) && num_free_extents < max_recs_needed)) { | ||
654 | ret = ocfs2_reserve_new_metadata(osb, di, meta_ac); | ||
655 | if (ret < 0) { | ||
656 | if (ret != -ENOSPC) | ||
657 | mlog_errno(ret); | ||
658 | goto out; | ||
659 | } | ||
660 | } | ||
661 | |||
662 | if (clusters_to_add == 0) | ||
663 | goto out; | ||
664 | |||
665 | ret = ocfs2_reserve_clusters(osb, clusters_to_add, data_ac); | ||
666 | if (ret < 0) { | ||
667 | if (ret != -ENOSPC) | ||
668 | mlog_errno(ret); | ||
669 | goto out; | ||
670 | } | ||
671 | |||
672 | out: | ||
673 | if (ret) { | ||
674 | if (*meta_ac) { | ||
675 | ocfs2_free_alloc_context(*meta_ac); | ||
676 | *meta_ac = NULL; | ||
677 | } | ||
678 | 514 | ||
679 | /* | 515 | ocfs2_init_dinode_extent_tree(&et, inode, fe_bh); |
680 | * We cannot have an error and a non null *data_ac. | 516 | ret = ocfs2_add_clusters_in_btree(osb, inode, logical_offset, |
681 | */ | 517 | clusters_to_add, mark_unwritten, |
682 | } | 518 | &et, handle, |
519 | data_ac, meta_ac, reason_ret); | ||
683 | 520 | ||
684 | return ret; | 521 | return ret; |
685 | } | 522 | } |
@@ -698,6 +535,7 @@ static int __ocfs2_extend_allocation(struct inode *inode, u32 logical_start, | |||
698 | struct ocfs2_alloc_context *meta_ac = NULL; | 535 | struct ocfs2_alloc_context *meta_ac = NULL; |
699 | enum ocfs2_alloc_restarted why; | 536 | enum ocfs2_alloc_restarted why; |
700 | 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; | ||
701 | 539 | ||
702 | mlog_entry("(clusters_to_add = %u)\n", clusters_to_add); | 540 | mlog_entry("(clusters_to_add = %u)\n", clusters_to_add); |
703 | 541 | ||
@@ -707,8 +545,7 @@ static int __ocfs2_extend_allocation(struct inode *inode, u32 logical_start, | |||
707 | */ | 545 | */ |
708 | BUG_ON(mark_unwritten && !ocfs2_sparse_alloc(osb)); | 546 | BUG_ON(mark_unwritten && !ocfs2_sparse_alloc(osb)); |
709 | 547 | ||
710 | status = ocfs2_read_block(osb, OCFS2_I(inode)->ip_blkno, &bh, | 548 | status = ocfs2_read_block(inode, OCFS2_I(inode)->ip_blkno, &bh); |
711 | OCFS2_BH_CACHED, inode); | ||
712 | if (status < 0) { | 549 | if (status < 0) { |
713 | mlog_errno(status); | 550 | mlog_errno(status); |
714 | goto leave; | 551 | goto leave; |
@@ -724,14 +561,21 @@ static int __ocfs2_extend_allocation(struct inode *inode, u32 logical_start, | |||
724 | restart_all: | 561 | restart_all: |
725 | BUG_ON(le32_to_cpu(fe->i_clusters) != OCFS2_I(inode)->ip_clusters); | 562 | BUG_ON(le32_to_cpu(fe->i_clusters) != OCFS2_I(inode)->ip_clusters); |
726 | 563 | ||
727 | status = ocfs2_lock_allocators(inode, fe, clusters_to_add, 0, &data_ac, | 564 | mlog(0, "extend inode %llu, i_size = %lld, di->i_clusters = %u, " |
728 | &meta_ac); | 565 | "clusters_to_add = %u\n", |
566 | (unsigned long long)OCFS2_I(inode)->ip_blkno, | ||
567 | (long long)i_size_read(inode), le32_to_cpu(fe->i_clusters), | ||
568 | clusters_to_add); | ||
569 | ocfs2_init_dinode_extent_tree(&et, inode, bh); | ||
570 | status = ocfs2_lock_allocators(inode, &et, clusters_to_add, 0, | ||
571 | &data_ac, &meta_ac); | ||
729 | if (status) { | 572 | if (status) { |
730 | mlog_errno(status); | 573 | mlog_errno(status); |
731 | goto leave; | 574 | goto leave; |
732 | } | 575 | } |
733 | 576 | ||
734 | credits = ocfs2_calc_extend_credits(osb->sb, fe, clusters_to_add); | 577 | credits = ocfs2_calc_extend_credits(osb->sb, &fe->id2.i_list, |
578 | clusters_to_add); | ||
735 | handle = ocfs2_start_trans(osb, credits); | 579 | handle = ocfs2_start_trans(osb, credits); |
736 | if (IS_ERR(handle)) { | 580 | if (IS_ERR(handle)) { |
737 | status = PTR_ERR(handle); | 581 | status = PTR_ERR(handle); |
@@ -753,16 +597,16 @@ restarted_transaction: | |||
753 | 597 | ||
754 | prev_clusters = OCFS2_I(inode)->ip_clusters; | 598 | prev_clusters = OCFS2_I(inode)->ip_clusters; |
755 | 599 | ||
756 | status = ocfs2_do_extend_allocation(osb, | 600 | status = ocfs2_add_inode_data(osb, |
757 | inode, | 601 | inode, |
758 | &logical_start, | 602 | &logical_start, |
759 | clusters_to_add, | 603 | clusters_to_add, |
760 | mark_unwritten, | 604 | mark_unwritten, |
761 | bh, | 605 | bh, |
762 | handle, | 606 | handle, |
763 | data_ac, | 607 | data_ac, |
764 | meta_ac, | 608 | meta_ac, |
765 | &why); | 609 | &why); |
766 | if ((status < 0) && (status != -EAGAIN)) { | 610 | if ((status < 0) && (status != -EAGAIN)) { |
767 | if (status != -ENOSPC) | 611 | if (status != -ENOSPC) |
768 | mlog_errno(status); | 612 | mlog_errno(status); |
@@ -789,7 +633,7 @@ restarted_transaction: | |||
789 | mlog(0, "restarting transaction.\n"); | 633 | mlog(0, "restarting transaction.\n"); |
790 | /* TODO: This can be more intelligent. */ | 634 | /* TODO: This can be more intelligent. */ |
791 | credits = ocfs2_calc_extend_credits(osb->sb, | 635 | credits = ocfs2_calc_extend_credits(osb->sb, |
792 | fe, | 636 | &fe->id2.i_list, |
793 | clusters_to_add); | 637 | clusters_to_add); |
794 | status = ocfs2_extend_trans(handle, credits); | 638 | status = ocfs2_extend_trans(handle, credits); |
795 | if (status < 0) { | 639 | if (status < 0) { |
@@ -826,10 +670,8 @@ leave: | |||
826 | restart_func = 0; | 670 | restart_func = 0; |
827 | goto restart_all; | 671 | goto restart_all; |
828 | } | 672 | } |
829 | if (bh) { | 673 | brelse(bh); |
830 | brelse(bh); | 674 | bh = NULL; |
831 | bh = NULL; | ||
832 | } | ||
833 | 675 | ||
834 | mlog_exit(status); | 676 | mlog_exit(status); |
835 | return status; | 677 | return status; |
@@ -1096,9 +938,15 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr *attr) | |||
1096 | goto bail_unlock; | 938 | goto bail_unlock; |
1097 | } | 939 | } |
1098 | 940 | ||
1099 | if (i_size_read(inode) > attr->ia_size) | 941 | if (i_size_read(inode) > attr->ia_size) { |
942 | if (ocfs2_should_order_data(inode)) { | ||
943 | status = ocfs2_begin_ordered_truncate(inode, | ||
944 | attr->ia_size); | ||
945 | if (status) | ||
946 | goto bail_unlock; | ||
947 | } | ||
1100 | status = ocfs2_truncate_file(inode, bh, attr->ia_size); | 948 | status = ocfs2_truncate_file(inode, bh, attr->ia_size); |
1101 | else | 949 | } else |
1102 | status = ocfs2_extend_file(inode, bh, attr->ia_size); | 950 | status = ocfs2_extend_file(inode, bh, attr->ia_size); |
1103 | if (status < 0) { | 951 | if (status < 0) { |
1104 | if (status != -ENOSPC) | 952 | if (status != -ENOSPC) |
@@ -1140,8 +988,7 @@ bail_unlock_rw: | |||
1140 | if (size_change) | 988 | if (size_change) |
1141 | ocfs2_rw_unlock(inode, 1); | 989 | ocfs2_rw_unlock(inode, 1); |
1142 | bail: | 990 | bail: |
1143 | if (bh) | 991 | brelse(bh); |
1144 | brelse(bh); | ||
1145 | 992 | ||
1146 | mlog_exit(status); | 993 | mlog_exit(status); |
1147 | return status; | 994 | return status; |
@@ -1284,8 +1131,7 @@ static int ocfs2_write_remove_suid(struct inode *inode) | |||
1284 | struct buffer_head *bh = NULL; | 1131 | struct buffer_head *bh = NULL; |
1285 | struct ocfs2_inode_info *oi = OCFS2_I(inode); | 1132 | struct ocfs2_inode_info *oi = OCFS2_I(inode); |
1286 | 1133 | ||
1287 | ret = ocfs2_read_block(OCFS2_SB(inode->i_sb), | 1134 | ret = ocfs2_read_block(inode, oi->ip_blkno, &bh); |
1288 | oi->ip_blkno, &bh, OCFS2_BH_CACHED, inode); | ||
1289 | if (ret < 0) { | 1135 | if (ret < 0) { |
1290 | mlog_errno(ret); | 1136 | mlog_errno(ret); |
1291 | goto out; | 1137 | goto out; |
@@ -1311,9 +1157,8 @@ static int ocfs2_allocate_unwritten_extents(struct inode *inode, | |||
1311 | struct buffer_head *di_bh = NULL; | 1157 | struct buffer_head *di_bh = NULL; |
1312 | 1158 | ||
1313 | if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) { | 1159 | if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) { |
1314 | ret = ocfs2_read_block(OCFS2_SB(inode->i_sb), | 1160 | ret = ocfs2_read_block(inode, OCFS2_I(inode)->ip_blkno, |
1315 | OCFS2_I(inode)->ip_blkno, &di_bh, | 1161 | &di_bh); |
1316 | OCFS2_BH_CACHED, inode); | ||
1317 | if (ret) { | 1162 | if (ret) { |
1318 | mlog_errno(ret); | 1163 | mlog_errno(ret); |
1319 | goto out; | 1164 | goto out; |
@@ -1394,8 +1239,11 @@ static int __ocfs2_remove_inode_range(struct inode *inode, | |||
1394 | handle_t *handle; | 1239 | handle_t *handle; |
1395 | struct ocfs2_alloc_context *meta_ac = NULL; | 1240 | struct ocfs2_alloc_context *meta_ac = NULL; |
1396 | struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; | 1241 | struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; |
1242 | struct ocfs2_extent_tree et; | ||
1397 | 1243 | ||
1398 | ret = ocfs2_lock_allocators(inode, di, 0, 1, NULL, &meta_ac); | 1244 | ocfs2_init_dinode_extent_tree(&et, inode, di_bh); |
1245 | |||
1246 | ret = ocfs2_lock_allocators(inode, &et, 0, 1, NULL, &meta_ac); | ||
1399 | if (ret) { | 1247 | if (ret) { |
1400 | mlog_errno(ret); | 1248 | mlog_errno(ret); |
1401 | return ret; | 1249 | return ret; |
@@ -1425,7 +1273,7 @@ static int __ocfs2_remove_inode_range(struct inode *inode, | |||
1425 | goto out; | 1273 | goto out; |
1426 | } | 1274 | } |
1427 | 1275 | ||
1428 | ret = ocfs2_remove_extent(inode, di_bh, cpos, len, handle, meta_ac, | 1276 | ret = ocfs2_remove_extent(inode, &et, cpos, len, handle, meta_ac, |
1429 | dealloc); | 1277 | dealloc); |
1430 | if (ret) { | 1278 | if (ret) { |
1431 | mlog_errno(ret); | 1279 | mlog_errno(ret); |
@@ -2040,7 +1888,7 @@ out_dio: | |||
2040 | */ | 1888 | */ |
2041 | if (old_size != i_size_read(inode) || | 1889 | if (old_size != i_size_read(inode) || |
2042 | old_clusters != OCFS2_I(inode)->ip_clusters) { | 1890 | old_clusters != OCFS2_I(inode)->ip_clusters) { |
2043 | ret = journal_force_commit(osb->journal->j_journal); | 1891 | ret = jbd2_journal_force_commit(osb->journal->j_journal); |
2044 | if (ret < 0) | 1892 | if (ret < 0) |
2045 | written = ret; | 1893 | written = ret; |
2046 | } | 1894 | } |
@@ -2227,6 +2075,10 @@ const struct inode_operations ocfs2_file_iops = { | |||
2227 | .setattr = ocfs2_setattr, | 2075 | .setattr = ocfs2_setattr, |
2228 | .getattr = ocfs2_getattr, | 2076 | .getattr = ocfs2_getattr, |
2229 | .permission = ocfs2_permission, | 2077 | .permission = ocfs2_permission, |
2078 | .setxattr = generic_setxattr, | ||
2079 | .getxattr = generic_getxattr, | ||
2080 | .listxattr = ocfs2_listxattr, | ||
2081 | .removexattr = generic_removexattr, | ||
2230 | .fallocate = ocfs2_fallocate, | 2082 | .fallocate = ocfs2_fallocate, |
2231 | .fiemap = ocfs2_fiemap, | 2083 | .fiemap = ocfs2_fiemap, |
2232 | }; | 2084 | }; |
@@ -2237,6 +2089,10 @@ const struct inode_operations ocfs2_special_file_iops = { | |||
2237 | .permission = ocfs2_permission, | 2089 | .permission = ocfs2_permission, |
2238 | }; | 2090 | }; |
2239 | 2091 | ||
2092 | /* | ||
2093 | * Other than ->lock, keep ocfs2_fops and ocfs2_dops in sync with | ||
2094 | * ocfs2_fops_no_plocks and ocfs2_dops_no_plocks! | ||
2095 | */ | ||
2240 | const struct file_operations ocfs2_fops = { | 2096 | const struct file_operations ocfs2_fops = { |
2241 | .llseek = generic_file_llseek, | 2097 | .llseek = generic_file_llseek, |
2242 | .read = do_sync_read, | 2098 | .read = do_sync_read, |
@@ -2251,6 +2107,7 @@ const struct file_operations ocfs2_fops = { | |||
2251 | #ifdef CONFIG_COMPAT | 2107 | #ifdef CONFIG_COMPAT |
2252 | .compat_ioctl = ocfs2_compat_ioctl, | 2108 | .compat_ioctl = ocfs2_compat_ioctl, |
2253 | #endif | 2109 | #endif |
2110 | .lock = ocfs2_lock, | ||
2254 | .flock = ocfs2_flock, | 2111 | .flock = ocfs2_flock, |
2255 | .splice_read = ocfs2_file_splice_read, | 2112 | .splice_read = ocfs2_file_splice_read, |
2256 | .splice_write = ocfs2_file_splice_write, | 2113 | .splice_write = ocfs2_file_splice_write, |
@@ -2267,5 +2124,51 @@ const struct file_operations ocfs2_dops = { | |||
2267 | #ifdef CONFIG_COMPAT | 2124 | #ifdef CONFIG_COMPAT |
2268 | .compat_ioctl = ocfs2_compat_ioctl, | 2125 | .compat_ioctl = ocfs2_compat_ioctl, |
2269 | #endif | 2126 | #endif |
2127 | .lock = ocfs2_lock, | ||
2128 | .flock = ocfs2_flock, | ||
2129 | }; | ||
2130 | |||
2131 | /* | ||
2132 | * POSIX-lockless variants of our file_operations. | ||
2133 | * | ||
2134 | * These will be used if the underlying cluster stack does not support | ||
2135 | * posix file locking, if the user passes the "localflocks" mount | ||
2136 | * option, or if we have a local-only fs. | ||
2137 | * | ||
2138 | * ocfs2_flock is in here because all stacks handle UNIX file locks, | ||
2139 | * so we still want it in the case of no stack support for | ||
2140 | * plocks. Internally, it will do the right thing when asked to ignore | ||
2141 | * the cluster. | ||
2142 | */ | ||
2143 | const struct file_operations ocfs2_fops_no_plocks = { | ||
2144 | .llseek = generic_file_llseek, | ||
2145 | .read = do_sync_read, | ||
2146 | .write = do_sync_write, | ||
2147 | .mmap = ocfs2_mmap, | ||
2148 | .fsync = ocfs2_sync_file, | ||
2149 | .release = ocfs2_file_release, | ||
2150 | .open = ocfs2_file_open, | ||
2151 | .aio_read = ocfs2_file_aio_read, | ||
2152 | .aio_write = ocfs2_file_aio_write, | ||
2153 | .unlocked_ioctl = ocfs2_ioctl, | ||
2154 | #ifdef CONFIG_COMPAT | ||
2155 | .compat_ioctl = ocfs2_compat_ioctl, | ||
2156 | #endif | ||
2157 | .flock = ocfs2_flock, | ||
2158 | .splice_read = ocfs2_file_splice_read, | ||
2159 | .splice_write = ocfs2_file_splice_write, | ||
2160 | }; | ||
2161 | |||
2162 | const struct file_operations ocfs2_dops_no_plocks = { | ||
2163 | .llseek = generic_file_llseek, | ||
2164 | .read = generic_read_dir, | ||
2165 | .readdir = ocfs2_readdir, | ||
2166 | .fsync = ocfs2_sync_file, | ||
2167 | .release = ocfs2_dir_release, | ||
2168 | .open = ocfs2_dir_open, | ||
2169 | .unlocked_ioctl = ocfs2_ioctl, | ||
2170 | #ifdef CONFIG_COMPAT | ||
2171 | .compat_ioctl = ocfs2_compat_ioctl, | ||
2172 | #endif | ||
2270 | .flock = ocfs2_flock, | 2173 | .flock = ocfs2_flock, |
2271 | }; | 2174 | }; |