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", |