diff options
| -rw-r--r-- | Documentation/filesystems/ocfs2.txt | 13 | ||||
| -rw-r--r-- | fs/Kconfig | 3 | ||||
| -rw-r--r-- | fs/ocfs2/alloc.c | 1 | ||||
| -rw-r--r-- | fs/ocfs2/aops.c | 4 | ||||
| -rw-r--r-- | fs/ocfs2/file.c | 1 | ||||
| -rw-r--r-- | fs/ocfs2/super.c | 69 |
6 files changed, 50 insertions, 41 deletions
diff --git a/Documentation/filesystems/ocfs2.txt b/Documentation/filesystems/ocfs2.txt index 8ccf0c1b58ed..ed55238023a9 100644 --- a/Documentation/filesystems/ocfs2.txt +++ b/Documentation/filesystems/ocfs2.txt | |||
| @@ -28,11 +28,7 @@ Manish Singh <manish.singh@oracle.com> | |||
| 28 | Caveats | 28 | Caveats |
| 29 | ======= | 29 | ======= |
| 30 | Features which OCFS2 does not support yet: | 30 | Features which OCFS2 does not support yet: |
| 31 | - sparse files | ||
| 32 | - extended attributes | 31 | - extended attributes |
| 33 | - shared writable mmap | ||
| 34 | - loopback is supported, but data written will not | ||
| 35 | be cluster coherent. | ||
| 36 | - quotas | 32 | - quotas |
| 37 | - cluster aware flock | 33 | - cluster aware flock |
| 38 | - cluster aware lockf | 34 | - cluster aware lockf |
| @@ -57,3 +53,12 @@ nointr Do not allow signals to interrupt cluster | |||
| 57 | atime_quantum=60(*) OCFS2 will not update atime unless this number | 53 | atime_quantum=60(*) OCFS2 will not update atime unless this number |
| 58 | of seconds has passed since the last update. | 54 | of seconds has passed since the last update. |
| 59 | Set to zero to always update atime. | 55 | Set to zero to always update atime. |
| 56 | data=ordered (*) All data are forced directly out to the main file | ||
| 57 | system prior to its metadata being committed to the | ||
| 58 | journal. | ||
| 59 | data=writeback Data ordering is not preserved, data may be written | ||
| 60 | into the main file system after its metadata has been | ||
| 61 | committed to the journal. | ||
| 62 | preferred_slot=0(*) During mount, try to use this filesystem slot first. If | ||
| 63 | it is in use by another node, the first empty one found | ||
| 64 | will be chosen. Invalid values will be ignored. | ||
diff --git a/fs/Kconfig b/fs/Kconfig index 58a0650293e1..f9eed6d79066 100644 --- a/fs/Kconfig +++ b/fs/Kconfig | |||
| @@ -441,9 +441,6 @@ config OCFS2_FS | |||
| 441 | 441 | ||
| 442 | Note: Features which OCFS2 does not support yet: | 442 | Note: Features which OCFS2 does not support yet: |
| 443 | - extended attributes | 443 | - extended attributes |
| 444 | - shared writeable mmap | ||
| 445 | - loopback is supported, but data written will not | ||
| 446 | be cluster coherent. | ||
| 447 | - quotas | 444 | - quotas |
| 448 | - cluster aware flock | 445 | - cluster aware flock |
| 449 | - Directory change notification (F_NOTIFY) | 446 | - Directory change notification (F_NOTIFY) |
diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c index 4f517665c9a0..778a850b4634 100644 --- a/fs/ocfs2/alloc.c +++ b/fs/ocfs2/alloc.c | |||
| @@ -5602,6 +5602,7 @@ static int ocfs2_do_truncate(struct ocfs2_super *osb, | |||
| 5602 | clusters_to_del; | 5602 | clusters_to_del; |
| 5603 | spin_unlock(&OCFS2_I(inode)->ip_lock); | 5603 | spin_unlock(&OCFS2_I(inode)->ip_lock); |
| 5604 | le32_add_cpu(&fe->i_clusters, -clusters_to_del); | 5604 | le32_add_cpu(&fe->i_clusters, -clusters_to_del); |
| 5605 | inode->i_blocks = ocfs2_inode_sector_count(inode); | ||
| 5605 | 5606 | ||
| 5606 | status = ocfs2_trim_tree(inode, path, handle, tc, | 5607 | status = ocfs2_trim_tree(inode, path, handle, tc, |
| 5607 | clusters_to_del, &delete_blk); | 5608 | clusters_to_del, &delete_blk); |
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 460d440310f2..50cd8a209012 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c | |||
| @@ -855,6 +855,7 @@ static int ocfs2_alloc_write_ctxt(struct ocfs2_write_ctxt **wcp, | |||
| 855 | struct ocfs2_super *osb, loff_t pos, | 855 | struct ocfs2_super *osb, loff_t pos, |
| 856 | unsigned len, struct buffer_head *di_bh) | 856 | unsigned len, struct buffer_head *di_bh) |
| 857 | { | 857 | { |
| 858 | u32 cend; | ||
| 858 | struct ocfs2_write_ctxt *wc; | 859 | struct ocfs2_write_ctxt *wc; |
| 859 | 860 | ||
| 860 | wc = kzalloc(sizeof(struct ocfs2_write_ctxt), GFP_NOFS); | 861 | wc = kzalloc(sizeof(struct ocfs2_write_ctxt), GFP_NOFS); |
| @@ -862,7 +863,8 @@ static int ocfs2_alloc_write_ctxt(struct ocfs2_write_ctxt **wcp, | |||
| 862 | return -ENOMEM; | 863 | return -ENOMEM; |
| 863 | 864 | ||
| 864 | wc->w_cpos = pos >> osb->s_clustersize_bits; | 865 | wc->w_cpos = pos >> osb->s_clustersize_bits; |
| 865 | wc->w_clen = ocfs2_clusters_for_bytes(osb->sb, len); | 866 | cend = (pos + len - 1) >> osb->s_clustersize_bits; |
| 867 | wc->w_clen = cend - wc->w_cpos + 1; | ||
| 866 | get_bh(di_bh); | 868 | get_bh(di_bh); |
| 867 | wc->w_di_bh = di_bh; | 869 | wc->w_di_bh = di_bh; |
| 868 | 870 | ||
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 4ffa715be09c..7e34e66159c6 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c | |||
| @@ -314,7 +314,6 @@ static int ocfs2_orphan_for_truncate(struct ocfs2_super *osb, | |||
| 314 | } | 314 | } |
| 315 | 315 | ||
| 316 | i_size_write(inode, new_i_size); | 316 | i_size_write(inode, new_i_size); |
| 317 | inode->i_blocks = ocfs2_align_bytes_to_sectors(new_i_size); | ||
| 318 | inode->i_ctime = inode->i_mtime = CURRENT_TIME; | 317 | inode->i_ctime = inode->i_mtime = CURRENT_TIME; |
| 319 | 318 | ||
| 320 | di = (struct ocfs2_dinode *) fe_bh->b_data; | 319 | di = (struct ocfs2_dinode *) fe_bh->b_data; |
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index f2fc9a795deb..c034b5129c1e 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c | |||
| @@ -81,8 +81,15 @@ static struct dentry *ocfs2_debugfs_root = NULL; | |||
| 81 | MODULE_AUTHOR("Oracle"); | 81 | MODULE_AUTHOR("Oracle"); |
| 82 | MODULE_LICENSE("GPL"); | 82 | MODULE_LICENSE("GPL"); |
| 83 | 83 | ||
| 84 | struct mount_options | ||
| 85 | { | ||
| 86 | unsigned long mount_opt; | ||
| 87 | unsigned int atime_quantum; | ||
| 88 | signed short slot; | ||
| 89 | }; | ||
| 90 | |||
| 84 | static int ocfs2_parse_options(struct super_block *sb, char *options, | 91 | static int ocfs2_parse_options(struct super_block *sb, char *options, |
| 85 | unsigned long *mount_opt, s16 *slot, | 92 | struct mount_options *mopt, |
| 86 | int is_remount); | 93 | int is_remount); |
| 87 | static void ocfs2_put_super(struct super_block *sb); | 94 | static void ocfs2_put_super(struct super_block *sb); |
| 88 | static int ocfs2_mount_volume(struct super_block *sb); | 95 | static int ocfs2_mount_volume(struct super_block *sb); |
| @@ -367,24 +374,23 @@ static int ocfs2_remount(struct super_block *sb, int *flags, char *data) | |||
| 367 | { | 374 | { |
| 368 | int incompat_features; | 375 | int incompat_features; |
| 369 | int ret = 0; | 376 | int ret = 0; |
| 370 | unsigned long parsed_options; | 377 | struct mount_options parsed_options; |
| 371 | s16 slot; | ||
| 372 | struct ocfs2_super *osb = OCFS2_SB(sb); | 378 | struct ocfs2_super *osb = OCFS2_SB(sb); |
| 373 | 379 | ||
| 374 | if (!ocfs2_parse_options(sb, data, &parsed_options, &slot, 1)) { | 380 | if (!ocfs2_parse_options(sb, data, &parsed_options, 1)) { |
| 375 | ret = -EINVAL; | 381 | ret = -EINVAL; |
| 376 | goto out; | 382 | goto out; |
| 377 | } | 383 | } |
| 378 | 384 | ||
| 379 | if ((osb->s_mount_opt & OCFS2_MOUNT_HB_LOCAL) != | 385 | if ((osb->s_mount_opt & OCFS2_MOUNT_HB_LOCAL) != |
| 380 | (parsed_options & OCFS2_MOUNT_HB_LOCAL)) { | 386 | (parsed_options.mount_opt & OCFS2_MOUNT_HB_LOCAL)) { |
| 381 | ret = -EINVAL; | 387 | ret = -EINVAL; |
| 382 | mlog(ML_ERROR, "Cannot change heartbeat mode on remount\n"); | 388 | mlog(ML_ERROR, "Cannot change heartbeat mode on remount\n"); |
| 383 | goto out; | 389 | goto out; |
| 384 | } | 390 | } |
| 385 | 391 | ||
| 386 | if ((osb->s_mount_opt & OCFS2_MOUNT_DATA_WRITEBACK) != | 392 | if ((osb->s_mount_opt & OCFS2_MOUNT_DATA_WRITEBACK) != |
| 387 | (parsed_options & OCFS2_MOUNT_DATA_WRITEBACK)) { | 393 | (parsed_options.mount_opt & OCFS2_MOUNT_DATA_WRITEBACK)) { |
| 388 | ret = -EINVAL; | 394 | ret = -EINVAL; |
| 389 | mlog(ML_ERROR, "Cannot change data mode on remount\n"); | 395 | mlog(ML_ERROR, "Cannot change data mode on remount\n"); |
| 390 | goto out; | 396 | goto out; |
| @@ -435,7 +441,9 @@ unlock_osb: | |||
| 435 | 441 | ||
| 436 | /* Only save off the new mount options in case of a successful | 442 | /* Only save off the new mount options in case of a successful |
| 437 | * remount. */ | 443 | * remount. */ |
| 438 | osb->s_mount_opt = parsed_options; | 444 | osb->s_mount_opt = parsed_options.mount_opt; |
| 445 | osb->s_atime_quantum = parsed_options.atime_quantum; | ||
| 446 | osb->preferred_slot = parsed_options.slot; | ||
| 439 | } | 447 | } |
| 440 | out: | 448 | out: |
| 441 | return ret; | 449 | return ret; |
| @@ -547,8 +555,7 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) | |||
| 547 | { | 555 | { |
| 548 | struct dentry *root; | 556 | struct dentry *root; |
| 549 | int status, sector_size; | 557 | int status, sector_size; |
| 550 | unsigned long parsed_opt; | 558 | struct mount_options parsed_options; |
| 551 | s16 slot; | ||
| 552 | struct inode *inode = NULL; | 559 | struct inode *inode = NULL; |
| 553 | struct ocfs2_super *osb = NULL; | 560 | struct ocfs2_super *osb = NULL; |
| 554 | struct buffer_head *bh = NULL; | 561 | struct buffer_head *bh = NULL; |
| @@ -556,14 +563,14 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) | |||
| 556 | 563 | ||
| 557 | mlog_entry("%p, %p, %i", sb, data, silent); | 564 | mlog_entry("%p, %p, %i", sb, data, silent); |
| 558 | 565 | ||
| 559 | if (!ocfs2_parse_options(sb, data, &parsed_opt, &slot, 0)) { | 566 | if (!ocfs2_parse_options(sb, data, &parsed_options, 0)) { |
| 560 | status = -EINVAL; | 567 | status = -EINVAL; |
| 561 | goto read_super_error; | 568 | goto read_super_error; |
| 562 | } | 569 | } |
| 563 | 570 | ||
| 564 | /* for now we only have one cluster/node, make sure we see it | 571 | /* for now we only have one cluster/node, make sure we see it |
| 565 | * in the heartbeat universe */ | 572 | * in the heartbeat universe */ |
| 566 | if (parsed_opt & OCFS2_MOUNT_HB_LOCAL) { | 573 | if (parsed_options.mount_opt & OCFS2_MOUNT_HB_LOCAL) { |
| 567 | if (!o2hb_check_local_node_heartbeating()) { | 574 | if (!o2hb_check_local_node_heartbeating()) { |
| 568 | status = -EINVAL; | 575 | status = -EINVAL; |
| 569 | goto read_super_error; | 576 | goto read_super_error; |
| @@ -585,8 +592,9 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) | |||
| 585 | } | 592 | } |
| 586 | brelse(bh); | 593 | brelse(bh); |
| 587 | bh = NULL; | 594 | bh = NULL; |
| 588 | osb->s_mount_opt = parsed_opt; | 595 | osb->s_mount_opt = parsed_options.mount_opt; |
| 589 | osb->preferred_slot = slot; | 596 | osb->s_atime_quantum = parsed_options.atime_quantum; |
| 597 | osb->preferred_slot = parsed_options.slot; | ||
| 590 | 598 | ||
| 591 | sb->s_magic = OCFS2_SUPER_MAGIC; | 599 | sb->s_magic = OCFS2_SUPER_MAGIC; |
| 592 | 600 | ||
| @@ -728,8 +736,7 @@ static struct file_system_type ocfs2_fs_type = { | |||
| 728 | 736 | ||
| 729 | static int ocfs2_parse_options(struct super_block *sb, | 737 | static int ocfs2_parse_options(struct super_block *sb, |
| 730 | char *options, | 738 | char *options, |
| 731 | unsigned long *mount_opt, | 739 | struct mount_options *mopt, |
| 732 | s16 *slot, | ||
| 733 | int is_remount) | 740 | int is_remount) |
| 734 | { | 741 | { |
| 735 | int status; | 742 | int status; |
| @@ -738,8 +745,9 @@ static int ocfs2_parse_options(struct super_block *sb, | |||
| 738 | mlog_entry("remount: %d, options: \"%s\"\n", is_remount, | 745 | mlog_entry("remount: %d, options: \"%s\"\n", is_remount, |
| 739 | options ? options : "(none)"); | 746 | options ? options : "(none)"); |
| 740 | 747 | ||
| 741 | *mount_opt = 0; | 748 | mopt->mount_opt = 0; |
| 742 | *slot = OCFS2_INVALID_SLOT; | 749 | mopt->atime_quantum = OCFS2_DEFAULT_ATIME_QUANTUM; |
| 750 | mopt->slot = OCFS2_INVALID_SLOT; | ||
| 743 | 751 | ||
| 744 | if (!options) { | 752 | if (!options) { |
| 745 | status = 1; | 753 | status = 1; |
| @@ -749,7 +757,6 @@ static int ocfs2_parse_options(struct super_block *sb, | |||
| 749 | while ((p = strsep(&options, ",")) != NULL) { | 757 | while ((p = strsep(&options, ",")) != NULL) { |
| 750 | int token, option; | 758 | int token, option; |
| 751 | substring_t args[MAX_OPT_ARGS]; | 759 | substring_t args[MAX_OPT_ARGS]; |
| 752 | struct ocfs2_super * osb = OCFS2_SB(sb); | ||
| 753 | 760 | ||
| 754 | if (!*p) | 761 | if (!*p) |
| 755 | continue; | 762 | continue; |
| @@ -757,10 +764,10 @@ static int ocfs2_parse_options(struct super_block *sb, | |||
| 757 | token = match_token(p, tokens, args); | 764 | token = match_token(p, tokens, args); |
| 758 | switch (token) { | 765 | switch (token) { |
| 759 | case Opt_hb_local: | 766 | case Opt_hb_local: |
| 760 | *mount_opt |= OCFS2_MOUNT_HB_LOCAL; | 767 | mopt->mount_opt |= OCFS2_MOUNT_HB_LOCAL; |
| 761 | break; | 768 | break; |
| 762 | case Opt_hb_none: | 769 | case Opt_hb_none: |
| 763 | *mount_opt &= ~OCFS2_MOUNT_HB_LOCAL; | 770 | mopt->mount_opt &= ~OCFS2_MOUNT_HB_LOCAL; |
| 764 | break; | 771 | break; |
| 765 | case Opt_barrier: | 772 | case Opt_barrier: |
| 766 | if (match_int(&args[0], &option)) { | 773 | if (match_int(&args[0], &option)) { |
| @@ -768,27 +775,27 @@ static int ocfs2_parse_options(struct super_block *sb, | |||
| 768 | goto bail; | 775 | goto bail; |
| 769 | } | 776 | } |
| 770 | if (option) | 777 | if (option) |
| 771 | *mount_opt |= OCFS2_MOUNT_BARRIER; | 778 | mopt->mount_opt |= OCFS2_MOUNT_BARRIER; |
| 772 | else | 779 | else |
| 773 | *mount_opt &= ~OCFS2_MOUNT_BARRIER; | 780 | mopt->mount_opt &= ~OCFS2_MOUNT_BARRIER; |
| 774 | break; | 781 | break; |
| 775 | case Opt_intr: | 782 | case Opt_intr: |
| 776 | *mount_opt &= ~OCFS2_MOUNT_NOINTR; | 783 | mopt->mount_opt &= ~OCFS2_MOUNT_NOINTR; |
| 777 | break; | 784 | break; |
| 778 | case Opt_nointr: | 785 | case Opt_nointr: |
| 779 | *mount_opt |= OCFS2_MOUNT_NOINTR; | 786 | mopt->mount_opt |= OCFS2_MOUNT_NOINTR; |
| 780 | break; | 787 | break; |
| 781 | case Opt_err_panic: | 788 | case Opt_err_panic: |
| 782 | *mount_opt |= OCFS2_MOUNT_ERRORS_PANIC; | 789 | mopt->mount_opt |= OCFS2_MOUNT_ERRORS_PANIC; |
| 783 | break; | 790 | break; |
| 784 | case Opt_err_ro: | 791 | case Opt_err_ro: |
| 785 | *mount_opt &= ~OCFS2_MOUNT_ERRORS_PANIC; | 792 | mopt->mount_opt &= ~OCFS2_MOUNT_ERRORS_PANIC; |
| 786 | break; | 793 | break; |
| 787 | case Opt_data_ordered: | 794 | case Opt_data_ordered: |
| 788 | *mount_opt &= ~OCFS2_MOUNT_DATA_WRITEBACK; | 795 | mopt->mount_opt &= ~OCFS2_MOUNT_DATA_WRITEBACK; |
| 789 | break; | 796 | break; |
| 790 | case Opt_data_writeback: | 797 | case Opt_data_writeback: |
| 791 | *mount_opt |= OCFS2_MOUNT_DATA_WRITEBACK; | 798 | mopt->mount_opt |= OCFS2_MOUNT_DATA_WRITEBACK; |
| 792 | break; | 799 | break; |
| 793 | case Opt_atime_quantum: | 800 | case Opt_atime_quantum: |
| 794 | if (match_int(&args[0], &option)) { | 801 | if (match_int(&args[0], &option)) { |
| @@ -796,9 +803,7 @@ static int ocfs2_parse_options(struct super_block *sb, | |||
| 796 | goto bail; | 803 | goto bail; |
| 797 | } | 804 | } |
| 798 | if (option >= 0) | 805 | if (option >= 0) |
| 799 | osb->s_atime_quantum = option; | 806 | mopt->atime_quantum = option; |
| 800 | else | ||
| 801 | osb->s_atime_quantum = OCFS2_DEFAULT_ATIME_QUANTUM; | ||
| 802 | break; | 807 | break; |
| 803 | case Opt_slot: | 808 | case Opt_slot: |
| 804 | option = 0; | 809 | option = 0; |
| @@ -807,7 +812,7 @@ static int ocfs2_parse_options(struct super_block *sb, | |||
| 807 | goto bail; | 812 | goto bail; |
| 808 | } | 813 | } |
| 809 | if (option) | 814 | if (option) |
| 810 | *slot = (s16)option; | 815 | mopt->slot = (s16)option; |
| 811 | break; | 816 | break; |
| 812 | default: | 817 | default: |
| 813 | mlog(ML_ERROR, | 818 | mlog(ML_ERROR, |
