diff options
Diffstat (limited to 'fs/ocfs2/super.c')
| -rw-r--r-- | fs/ocfs2/super.c | 62 |
1 files changed, 53 insertions, 9 deletions
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index 70334d85aff1..304b63ac78cf 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c | |||
| @@ -64,6 +64,7 @@ | |||
| 64 | #include "sysfile.h" | 64 | #include "sysfile.h" |
| 65 | #include "uptodate.h" | 65 | #include "uptodate.h" |
| 66 | #include "ver.h" | 66 | #include "ver.h" |
| 67 | #include "xattr.h" | ||
| 67 | 68 | ||
| 68 | #include "buffer_head_io.h" | 69 | #include "buffer_head_io.h" |
| 69 | 70 | ||
| @@ -154,6 +155,9 @@ enum { | |||
| 154 | Opt_localalloc, | 155 | Opt_localalloc, |
| 155 | Opt_localflocks, | 156 | Opt_localflocks, |
| 156 | Opt_stack, | 157 | Opt_stack, |
| 158 | Opt_user_xattr, | ||
| 159 | Opt_nouser_xattr, | ||
| 160 | Opt_inode64, | ||
| 157 | Opt_err, | 161 | Opt_err, |
| 158 | }; | 162 | }; |
| 159 | 163 | ||
| @@ -173,6 +177,9 @@ static const match_table_t tokens = { | |||
| 173 | {Opt_localalloc, "localalloc=%d"}, | 177 | {Opt_localalloc, "localalloc=%d"}, |
| 174 | {Opt_localflocks, "localflocks"}, | 178 | {Opt_localflocks, "localflocks"}, |
| 175 | {Opt_stack, "cluster_stack=%s"}, | 179 | {Opt_stack, "cluster_stack=%s"}, |
| 180 | {Opt_user_xattr, "user_xattr"}, | ||
| 181 | {Opt_nouser_xattr, "nouser_xattr"}, | ||
| 182 | {Opt_inode64, "inode64"}, | ||
| 176 | {Opt_err, NULL} | 183 | {Opt_err, NULL} |
| 177 | }; | 184 | }; |
| 178 | 185 | ||
| @@ -205,10 +212,11 @@ static int ocfs2_sync_fs(struct super_block *sb, int wait) | |||
| 205 | ocfs2_schedule_truncate_log_flush(osb, 0); | 212 | ocfs2_schedule_truncate_log_flush(osb, 0); |
| 206 | } | 213 | } |
| 207 | 214 | ||
| 208 | if (journal_start_commit(OCFS2_SB(sb)->journal->j_journal, &target)) { | 215 | if (jbd2_journal_start_commit(OCFS2_SB(sb)->journal->j_journal, |
| 216 | &target)) { | ||
| 209 | if (wait) | 217 | if (wait) |
| 210 | log_wait_commit(OCFS2_SB(sb)->journal->j_journal, | 218 | jbd2_log_wait_commit(OCFS2_SB(sb)->journal->j_journal, |
| 211 | target); | 219 | target); |
| 212 | } | 220 | } |
| 213 | return 0; | 221 | return 0; |
| 214 | } | 222 | } |
| @@ -325,6 +333,7 @@ static struct inode *ocfs2_alloc_inode(struct super_block *sb) | |||
| 325 | if (!oi) | 333 | if (!oi) |
| 326 | return NULL; | 334 | return NULL; |
| 327 | 335 | ||
| 336 | jbd2_journal_init_jbd_inode(&oi->ip_jinode, &oi->vfs_inode); | ||
| 328 | return &oi->vfs_inode; | 337 | return &oi->vfs_inode; |
| 329 | } | 338 | } |
| 330 | 339 | ||
| @@ -406,6 +415,15 @@ static int ocfs2_remount(struct super_block *sb, int *flags, char *data) | |||
| 406 | goto out; | 415 | goto out; |
| 407 | } | 416 | } |
| 408 | 417 | ||
| 418 | /* Probably don't want this on remount; it might | ||
| 419 | * mess with other nodes */ | ||
| 420 | if (!(osb->s_mount_opt & OCFS2_MOUNT_INODE64) && | ||
| 421 | (parsed_options.mount_opt & OCFS2_MOUNT_INODE64)) { | ||
| 422 | ret = -EINVAL; | ||
| 423 | mlog(ML_ERROR, "Cannot enable inode64 on remount\n"); | ||
| 424 | goto out; | ||
| 425 | } | ||
| 426 | |||
| 409 | /* We're going to/from readonly mode. */ | 427 | /* We're going to/from readonly mode. */ |
| 410 | if ((*flags & MS_RDONLY) != (sb->s_flags & MS_RDONLY)) { | 428 | if ((*flags & MS_RDONLY) != (sb->s_flags & MS_RDONLY)) { |
| 411 | /* Lock here so the check of HARD_RO and the potential | 429 | /* Lock here so the check of HARD_RO and the potential |
| @@ -637,7 +655,8 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) | |||
| 637 | osb->s_atime_quantum = parsed_options.atime_quantum; | 655 | osb->s_atime_quantum = parsed_options.atime_quantum; |
| 638 | osb->preferred_slot = parsed_options.slot; | 656 | osb->preferred_slot = parsed_options.slot; |
| 639 | osb->osb_commit_interval = parsed_options.commit_interval; | 657 | osb->osb_commit_interval = parsed_options.commit_interval; |
| 640 | osb->local_alloc_size = parsed_options.localalloc_opt; | 658 | osb->local_alloc_default_bits = ocfs2_megabytes_to_clusters(sb, parsed_options.localalloc_opt); |
| 659 | osb->local_alloc_bits = osb->local_alloc_default_bits; | ||
| 641 | 660 | ||
| 642 | status = ocfs2_verify_userspace_stack(osb, &parsed_options); | 661 | status = ocfs2_verify_userspace_stack(osb, &parsed_options); |
| 643 | if (status) | 662 | if (status) |
| @@ -743,8 +762,7 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) | |||
| 743 | return status; | 762 | return status; |
| 744 | 763 | ||
| 745 | read_super_error: | 764 | read_super_error: |
| 746 | if (bh != NULL) | 765 | brelse(bh); |
| 747 | brelse(bh); | ||
| 748 | 766 | ||
| 749 | if (inode) | 767 | if (inode) |
| 750 | iput(inode); | 768 | iput(inode); |
| @@ -847,6 +865,12 @@ static int ocfs2_parse_options(struct super_block *sb, | |||
| 847 | case Opt_data_writeback: | 865 | case Opt_data_writeback: |
| 848 | mopt->mount_opt |= OCFS2_MOUNT_DATA_WRITEBACK; | 866 | mopt->mount_opt |= OCFS2_MOUNT_DATA_WRITEBACK; |
| 849 | break; | 867 | break; |
| 868 | case Opt_user_xattr: | ||
| 869 | mopt->mount_opt &= ~OCFS2_MOUNT_NOUSERXATTR; | ||
| 870 | break; | ||
| 871 | case Opt_nouser_xattr: | ||
| 872 | mopt->mount_opt |= OCFS2_MOUNT_NOUSERXATTR; | ||
| 873 | break; | ||
| 850 | case Opt_atime_quantum: | 874 | case Opt_atime_quantum: |
| 851 | if (match_int(&args[0], &option)) { | 875 | if (match_int(&args[0], &option)) { |
| 852 | status = 0; | 876 | status = 0; |
| @@ -873,7 +897,7 @@ static int ocfs2_parse_options(struct super_block *sb, | |||
| 873 | if (option < 0) | 897 | if (option < 0) |
| 874 | return 0; | 898 | return 0; |
| 875 | if (option == 0) | 899 | if (option == 0) |
| 876 | option = JBD_DEFAULT_MAX_COMMIT_AGE; | 900 | option = JBD2_DEFAULT_MAX_COMMIT_AGE; |
| 877 | mopt->commit_interval = HZ * option; | 901 | mopt->commit_interval = HZ * option; |
| 878 | break; | 902 | break; |
| 879 | case Opt_localalloc: | 903 | case Opt_localalloc: |
| @@ -918,6 +942,9 @@ static int ocfs2_parse_options(struct super_block *sb, | |||
| 918 | OCFS2_STACK_LABEL_LEN); | 942 | OCFS2_STACK_LABEL_LEN); |
| 919 | mopt->cluster_stack[OCFS2_STACK_LABEL_LEN] = '\0'; | 943 | mopt->cluster_stack[OCFS2_STACK_LABEL_LEN] = '\0'; |
| 920 | break; | 944 | break; |
| 945 | case Opt_inode64: | ||
| 946 | mopt->mount_opt |= OCFS2_MOUNT_INODE64; | ||
| 947 | break; | ||
| 921 | default: | 948 | default: |
| 922 | mlog(ML_ERROR, | 949 | mlog(ML_ERROR, |
| 923 | "Unrecognized mount option \"%s\" " | 950 | "Unrecognized mount option \"%s\" " |
| @@ -938,6 +965,7 @@ static int ocfs2_show_options(struct seq_file *s, struct vfsmount *mnt) | |||
| 938 | { | 965 | { |
| 939 | struct ocfs2_super *osb = OCFS2_SB(mnt->mnt_sb); | 966 | struct ocfs2_super *osb = OCFS2_SB(mnt->mnt_sb); |
| 940 | unsigned long opts = osb->s_mount_opt; | 967 | unsigned long opts = osb->s_mount_opt; |
| 968 | unsigned int local_alloc_megs; | ||
| 941 | 969 | ||
| 942 | if (opts & OCFS2_MOUNT_HB_LOCAL) | 970 | if (opts & OCFS2_MOUNT_HB_LOCAL) |
| 943 | seq_printf(s, ",_netdev,heartbeat=local"); | 971 | seq_printf(s, ",_netdev,heartbeat=local"); |
| @@ -970,8 +998,9 @@ static int ocfs2_show_options(struct seq_file *s, struct vfsmount *mnt) | |||
| 970 | seq_printf(s, ",commit=%u", | 998 | seq_printf(s, ",commit=%u", |
| 971 | (unsigned) (osb->osb_commit_interval / HZ)); | 999 | (unsigned) (osb->osb_commit_interval / HZ)); |
| 972 | 1000 | ||
| 973 | if (osb->local_alloc_size != OCFS2_DEFAULT_LOCAL_ALLOC_SIZE) | 1001 | local_alloc_megs = osb->local_alloc_bits >> (20 - osb->s_clustersize_bits); |
| 974 | seq_printf(s, ",localalloc=%d", osb->local_alloc_size); | 1002 | if (local_alloc_megs != OCFS2_DEFAULT_LOCAL_ALLOC_SIZE) |
| 1003 | seq_printf(s, ",localalloc=%d", local_alloc_megs); | ||
| 975 | 1004 | ||
| 976 | if (opts & OCFS2_MOUNT_LOCALFLOCKS) | 1005 | if (opts & OCFS2_MOUNT_LOCALFLOCKS) |
| 977 | seq_printf(s, ",localflocks,"); | 1006 | seq_printf(s, ",localflocks,"); |
| @@ -980,6 +1009,14 @@ static int ocfs2_show_options(struct seq_file *s, struct vfsmount *mnt) | |||
| 980 | seq_printf(s, ",cluster_stack=%.*s", OCFS2_STACK_LABEL_LEN, | 1009 | seq_printf(s, ",cluster_stack=%.*s", OCFS2_STACK_LABEL_LEN, |
| 981 | osb->osb_cluster_stack); | 1010 | osb->osb_cluster_stack); |
| 982 | 1011 | ||
| 1012 | if (opts & OCFS2_MOUNT_NOUSERXATTR) | ||
| 1013 | seq_printf(s, ",nouser_xattr"); | ||
| 1014 | else | ||
| 1015 | seq_printf(s, ",user_xattr"); | ||
| 1016 | |||
| 1017 | if (opts & OCFS2_MOUNT_INODE64) | ||
| 1018 | seq_printf(s, ",inode64"); | ||
| 1019 | |||
| 983 | return 0; | 1020 | return 0; |
| 984 | } | 1021 | } |
| 985 | 1022 | ||
| @@ -1132,6 +1169,7 @@ static void ocfs2_inode_init_once(void *data) | |||
| 1132 | oi->ip_dir_start_lookup = 0; | 1169 | oi->ip_dir_start_lookup = 0; |
| 1133 | 1170 | ||
| 1134 | init_rwsem(&oi->ip_alloc_sem); | 1171 | init_rwsem(&oi->ip_alloc_sem); |
| 1172 | init_rwsem(&oi->ip_xattr_sem); | ||
| 1135 | mutex_init(&oi->ip_io_mutex); | 1173 | mutex_init(&oi->ip_io_mutex); |
| 1136 | 1174 | ||
| 1137 | oi->ip_blkno = 0ULL; | 1175 | oi->ip_blkno = 0ULL; |
| @@ -1375,6 +1413,7 @@ static int ocfs2_initialize_super(struct super_block *sb, | |||
| 1375 | sb->s_fs_info = osb; | 1413 | sb->s_fs_info = osb; |
| 1376 | sb->s_op = &ocfs2_sops; | 1414 | sb->s_op = &ocfs2_sops; |
| 1377 | sb->s_export_op = &ocfs2_export_ops; | 1415 | sb->s_export_op = &ocfs2_export_ops; |
| 1416 | sb->s_xattr = ocfs2_xattr_handlers; | ||
| 1378 | sb->s_time_gran = 1; | 1417 | sb->s_time_gran = 1; |
| 1379 | sb->s_flags |= MS_NOATIME; | 1418 | sb->s_flags |= MS_NOATIME; |
| 1380 | /* this is needed to support O_LARGEFILE */ | 1419 | /* this is needed to support O_LARGEFILE */ |
| @@ -1421,8 +1460,12 @@ static int ocfs2_initialize_super(struct super_block *sb, | |||
| 1421 | 1460 | ||
| 1422 | osb->slot_num = OCFS2_INVALID_SLOT; | 1461 | osb->slot_num = OCFS2_INVALID_SLOT; |
| 1423 | 1462 | ||
| 1463 | osb->s_xattr_inline_size = le16_to_cpu( | ||
| 1464 | di->id2.i_super.s_xattr_inline_size); | ||
| 1465 | |||
| 1424 | osb->local_alloc_state = OCFS2_LA_UNUSED; | 1466 | osb->local_alloc_state = OCFS2_LA_UNUSED; |
| 1425 | osb->local_alloc_bh = NULL; | 1467 | osb->local_alloc_bh = NULL; |
| 1468 | INIT_DELAYED_WORK(&osb->la_enable_wq, ocfs2_la_enable_worker); | ||
| 1426 | 1469 | ||
| 1427 | init_waitqueue_head(&osb->osb_mount_event); | 1470 | init_waitqueue_head(&osb->osb_mount_event); |
| 1428 | 1471 | ||
| @@ -1568,6 +1611,7 @@ static int ocfs2_initialize_super(struct super_block *sb, | |||
| 1568 | osb->first_cluster_group_blkno = | 1611 | osb->first_cluster_group_blkno = |
| 1569 | le64_to_cpu(di->id2.i_super.s_first_cluster_group); | 1612 | le64_to_cpu(di->id2.i_super.s_first_cluster_group); |
| 1570 | osb->fs_generation = le32_to_cpu(di->i_fs_generation); | 1613 | osb->fs_generation = le32_to_cpu(di->i_fs_generation); |
| 1614 | osb->uuid_hash = le32_to_cpu(di->id2.i_super.s_uuid_hash); | ||
| 1571 | mlog(0, "vol_label: %s\n", osb->vol_label); | 1615 | mlog(0, "vol_label: %s\n", osb->vol_label); |
| 1572 | mlog(0, "uuid: %s\n", osb->uuid_str); | 1616 | mlog(0, "uuid: %s\n", osb->uuid_str); |
| 1573 | mlog(0, "root_blkno=%llu, system_dir_blkno=%llu\n", | 1617 | mlog(0, "root_blkno=%llu, system_dir_blkno=%llu\n", |
