diff options
Diffstat (limited to 'fs/ocfs2/super.c')
-rw-r--r-- | fs/ocfs2/super.c | 140 |
1 files changed, 70 insertions, 70 deletions
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index 5ee775420665..01fe40ee5ea9 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c | |||
@@ -65,7 +65,6 @@ | |||
65 | #include "sysfile.h" | 65 | #include "sysfile.h" |
66 | #include "uptodate.h" | 66 | #include "uptodate.h" |
67 | #include "ver.h" | 67 | #include "ver.h" |
68 | #include "vote.h" | ||
69 | 68 | ||
70 | #include "buffer_head_io.h" | 69 | #include "buffer_head_io.h" |
71 | 70 | ||
@@ -84,9 +83,11 @@ MODULE_LICENSE("GPL"); | |||
84 | 83 | ||
85 | struct mount_options | 84 | struct mount_options |
86 | { | 85 | { |
86 | unsigned long commit_interval; | ||
87 | unsigned long mount_opt; | 87 | unsigned long mount_opt; |
88 | unsigned int atime_quantum; | 88 | unsigned int atime_quantum; |
89 | signed short slot; | 89 | signed short slot; |
90 | unsigned int localalloc_opt; | ||
90 | }; | 91 | }; |
91 | 92 | ||
92 | static int ocfs2_parse_options(struct super_block *sb, char *options, | 93 | static int ocfs2_parse_options(struct super_block *sb, char *options, |
@@ -150,6 +151,9 @@ enum { | |||
150 | Opt_data_writeback, | 151 | Opt_data_writeback, |
151 | Opt_atime_quantum, | 152 | Opt_atime_quantum, |
152 | Opt_slot, | 153 | Opt_slot, |
154 | Opt_commit, | ||
155 | Opt_localalloc, | ||
156 | Opt_localflocks, | ||
153 | Opt_err, | 157 | Opt_err, |
154 | }; | 158 | }; |
155 | 159 | ||
@@ -165,6 +169,9 @@ static match_table_t tokens = { | |||
165 | {Opt_data_writeback, "data=writeback"}, | 169 | {Opt_data_writeback, "data=writeback"}, |
166 | {Opt_atime_quantum, "atime_quantum=%u"}, | 170 | {Opt_atime_quantum, "atime_quantum=%u"}, |
167 | {Opt_slot, "preferred_slot=%u"}, | 171 | {Opt_slot, "preferred_slot=%u"}, |
172 | {Opt_commit, "commit=%u"}, | ||
173 | {Opt_localalloc, "localalloc=%d"}, | ||
174 | {Opt_localflocks, "localflocks"}, | ||
168 | {Opt_err, NULL} | 175 | {Opt_err, NULL} |
169 | }; | 176 | }; |
170 | 177 | ||
@@ -213,7 +220,7 @@ static int ocfs2_init_global_system_inodes(struct ocfs2_super *osb) | |||
213 | 220 | ||
214 | mlog_entry_void(); | 221 | mlog_entry_void(); |
215 | 222 | ||
216 | new = ocfs2_iget(osb, osb->root_blkno, OCFS2_FI_FLAG_SYSFILE); | 223 | new = ocfs2_iget(osb, osb->root_blkno, OCFS2_FI_FLAG_SYSFILE, 0); |
217 | if (IS_ERR(new)) { | 224 | if (IS_ERR(new)) { |
218 | status = PTR_ERR(new); | 225 | status = PTR_ERR(new); |
219 | mlog_errno(status); | 226 | mlog_errno(status); |
@@ -221,7 +228,7 @@ static int ocfs2_init_global_system_inodes(struct ocfs2_super *osb) | |||
221 | } | 228 | } |
222 | osb->root_inode = new; | 229 | osb->root_inode = new; |
223 | 230 | ||
224 | new = ocfs2_iget(osb, osb->system_dir_blkno, OCFS2_FI_FLAG_SYSFILE); | 231 | new = ocfs2_iget(osb, osb->system_dir_blkno, OCFS2_FI_FLAG_SYSFILE, 0); |
225 | if (IS_ERR(new)) { | 232 | if (IS_ERR(new)) { |
226 | status = PTR_ERR(new); | 233 | status = PTR_ERR(new); |
227 | mlog_errno(status); | 234 | mlog_errno(status); |
@@ -443,6 +450,8 @@ unlock_osb: | |||
443 | osb->s_mount_opt = parsed_options.mount_opt; | 450 | osb->s_mount_opt = parsed_options.mount_opt; |
444 | osb->s_atime_quantum = parsed_options.atime_quantum; | 451 | osb->s_atime_quantum = parsed_options.atime_quantum; |
445 | osb->preferred_slot = parsed_options.slot; | 452 | osb->preferred_slot = parsed_options.slot; |
453 | if (parsed_options.commit_interval) | ||
454 | osb->osb_commit_interval = parsed_options.commit_interval; | ||
446 | 455 | ||
447 | if (!ocfs2_is_hard_readonly(osb)) | 456 | if (!ocfs2_is_hard_readonly(osb)) |
448 | ocfs2_set_journal_params(osb); | 457 | ocfs2_set_journal_params(osb); |
@@ -597,6 +606,8 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) | |||
597 | osb->s_mount_opt = parsed_options.mount_opt; | 606 | osb->s_mount_opt = parsed_options.mount_opt; |
598 | osb->s_atime_quantum = parsed_options.atime_quantum; | 607 | osb->s_atime_quantum = parsed_options.atime_quantum; |
599 | osb->preferred_slot = parsed_options.slot; | 608 | osb->preferred_slot = parsed_options.slot; |
609 | osb->osb_commit_interval = parsed_options.commit_interval; | ||
610 | osb->local_alloc_size = parsed_options.localalloc_opt; | ||
600 | 611 | ||
601 | sb->s_magic = OCFS2_SUPER_MAGIC; | 612 | sb->s_magic = OCFS2_SUPER_MAGIC; |
602 | 613 | ||
@@ -747,9 +758,11 @@ static int ocfs2_parse_options(struct super_block *sb, | |||
747 | mlog_entry("remount: %d, options: \"%s\"\n", is_remount, | 758 | mlog_entry("remount: %d, options: \"%s\"\n", is_remount, |
748 | options ? options : "(none)"); | 759 | options ? options : "(none)"); |
749 | 760 | ||
761 | mopt->commit_interval = 0; | ||
750 | mopt->mount_opt = 0; | 762 | mopt->mount_opt = 0; |
751 | mopt->atime_quantum = OCFS2_DEFAULT_ATIME_QUANTUM; | 763 | mopt->atime_quantum = OCFS2_DEFAULT_ATIME_QUANTUM; |
752 | mopt->slot = OCFS2_INVALID_SLOT; | 764 | mopt->slot = OCFS2_INVALID_SLOT; |
765 | mopt->localalloc_opt = OCFS2_DEFAULT_LOCAL_ALLOC_SIZE; | ||
753 | 766 | ||
754 | if (!options) { | 767 | if (!options) { |
755 | status = 1; | 768 | status = 1; |
@@ -816,6 +829,41 @@ static int ocfs2_parse_options(struct super_block *sb, | |||
816 | if (option) | 829 | if (option) |
817 | mopt->slot = (s16)option; | 830 | mopt->slot = (s16)option; |
818 | break; | 831 | break; |
832 | case Opt_commit: | ||
833 | option = 0; | ||
834 | if (match_int(&args[0], &option)) { | ||
835 | status = 0; | ||
836 | goto bail; | ||
837 | } | ||
838 | if (option < 0) | ||
839 | return 0; | ||
840 | if (option == 0) | ||
841 | option = JBD_DEFAULT_MAX_COMMIT_AGE; | ||
842 | mopt->commit_interval = HZ * option; | ||
843 | break; | ||
844 | case Opt_localalloc: | ||
845 | option = 0; | ||
846 | if (match_int(&args[0], &option)) { | ||
847 | status = 0; | ||
848 | goto bail; | ||
849 | } | ||
850 | if (option >= 0 && (option <= ocfs2_local_alloc_size(sb) * 8)) | ||
851 | mopt->localalloc_opt = option; | ||
852 | break; | ||
853 | case Opt_localflocks: | ||
854 | /* | ||
855 | * Changing this during remount could race | ||
856 | * flock() requests, or "unbalance" existing | ||
857 | * ones (e.g., a lock is taken in one mode but | ||
858 | * dropped in the other). If users care enough | ||
859 | * to flip locking modes during remount, we | ||
860 | * could add a "local" flag to individual | ||
861 | * flock structures for proper tracking of | ||
862 | * state. | ||
863 | */ | ||
864 | if (!is_remount) | ||
865 | mopt->mount_opt |= OCFS2_MOUNT_LOCALFLOCKS; | ||
866 | break; | ||
819 | default: | 867 | default: |
820 | mlog(ML_ERROR, | 868 | mlog(ML_ERROR, |
821 | "Unrecognized mount option \"%s\" " | 869 | "Unrecognized mount option \"%s\" " |
@@ -864,6 +912,16 @@ static int ocfs2_show_options(struct seq_file *s, struct vfsmount *mnt) | |||
864 | if (osb->s_atime_quantum != OCFS2_DEFAULT_ATIME_QUANTUM) | 912 | if (osb->s_atime_quantum != OCFS2_DEFAULT_ATIME_QUANTUM) |
865 | seq_printf(s, ",atime_quantum=%u", osb->s_atime_quantum); | 913 | seq_printf(s, ",atime_quantum=%u", osb->s_atime_quantum); |
866 | 914 | ||
915 | if (osb->osb_commit_interval) | ||
916 | seq_printf(s, ",commit=%u", | ||
917 | (unsigned) (osb->osb_commit_interval / HZ)); | ||
918 | |||
919 | if (osb->local_alloc_size != OCFS2_DEFAULT_LOCAL_ALLOC_SIZE) | ||
920 | seq_printf(s, ",localalloc=%d", osb->local_alloc_size); | ||
921 | |||
922 | if (opts & OCFS2_MOUNT_LOCALFLOCKS) | ||
923 | seq_printf(s, ",localflocks,"); | ||
924 | |||
867 | return 0; | 925 | return 0; |
868 | } | 926 | } |
869 | 927 | ||
@@ -965,7 +1023,7 @@ static int ocfs2_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
965 | goto bail; | 1023 | goto bail; |
966 | } | 1024 | } |
967 | 1025 | ||
968 | status = ocfs2_meta_lock(inode, &bh, 0); | 1026 | status = ocfs2_inode_lock(inode, &bh, 0); |
969 | if (status < 0) { | 1027 | if (status < 0) { |
970 | mlog_errno(status); | 1028 | mlog_errno(status); |
971 | goto bail; | 1029 | goto bail; |
@@ -989,7 +1047,7 @@ static int ocfs2_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
989 | 1047 | ||
990 | brelse(bh); | 1048 | brelse(bh); |
991 | 1049 | ||
992 | ocfs2_meta_unlock(inode, 0); | 1050 | ocfs2_inode_unlock(inode, 0); |
993 | status = 0; | 1051 | status = 0; |
994 | bail: | 1052 | bail: |
995 | if (inode) | 1053 | if (inode) |
@@ -1020,8 +1078,7 @@ static void ocfs2_inode_init_once(struct kmem_cache *cachep, void *data) | |||
1020 | oi->ip_clusters = 0; | 1078 | oi->ip_clusters = 0; |
1021 | 1079 | ||
1022 | ocfs2_lock_res_init_once(&oi->ip_rw_lockres); | 1080 | ocfs2_lock_res_init_once(&oi->ip_rw_lockres); |
1023 | ocfs2_lock_res_init_once(&oi->ip_meta_lockres); | 1081 | ocfs2_lock_res_init_once(&oi->ip_inode_lockres); |
1024 | ocfs2_lock_res_init_once(&oi->ip_data_lockres); | ||
1025 | ocfs2_lock_res_init_once(&oi->ip_open_lockres); | 1082 | ocfs2_lock_res_init_once(&oi->ip_open_lockres); |
1026 | 1083 | ||
1027 | ocfs2_metadata_cache_init(&oi->vfs_inode); | 1084 | ocfs2_metadata_cache_init(&oi->vfs_inode); |
@@ -1117,25 +1174,12 @@ static int ocfs2_mount_volume(struct super_block *sb) | |||
1117 | goto leave; | 1174 | goto leave; |
1118 | } | 1175 | } |
1119 | 1176 | ||
1120 | status = ocfs2_register_hb_callbacks(osb); | ||
1121 | if (status < 0) { | ||
1122 | mlog_errno(status); | ||
1123 | goto leave; | ||
1124 | } | ||
1125 | |||
1126 | status = ocfs2_dlm_init(osb); | 1177 | status = ocfs2_dlm_init(osb); |
1127 | if (status < 0) { | 1178 | if (status < 0) { |
1128 | mlog_errno(status); | 1179 | mlog_errno(status); |
1129 | goto leave; | 1180 | goto leave; |
1130 | } | 1181 | } |
1131 | 1182 | ||
1132 | /* requires vote_thread to be running. */ | ||
1133 | status = ocfs2_register_net_handlers(osb); | ||
1134 | if (status < 0) { | ||
1135 | mlog_errno(status); | ||
1136 | goto leave; | ||
1137 | } | ||
1138 | |||
1139 | status = ocfs2_super_lock(osb, 1); | 1183 | status = ocfs2_super_lock(osb, 1); |
1140 | if (status < 0) { | 1184 | if (status < 0) { |
1141 | mlog_errno(status); | 1185 | mlog_errno(status); |
@@ -1150,8 +1194,6 @@ static int ocfs2_mount_volume(struct super_block *sb) | |||
1150 | goto leave; | 1194 | goto leave; |
1151 | } | 1195 | } |
1152 | 1196 | ||
1153 | ocfs2_populate_mounted_map(osb); | ||
1154 | |||
1155 | /* load all node-local system inodes */ | 1197 | /* load all node-local system inodes */ |
1156 | status = ocfs2_init_local_system_inodes(osb); | 1198 | status = ocfs2_init_local_system_inodes(osb); |
1157 | if (status < 0) { | 1199 | if (status < 0) { |
@@ -1174,15 +1216,6 @@ static int ocfs2_mount_volume(struct super_block *sb) | |||
1174 | if (ocfs2_mount_local(osb)) | 1216 | if (ocfs2_mount_local(osb)) |
1175 | goto leave; | 1217 | goto leave; |
1176 | 1218 | ||
1177 | /* This should be sent *after* we recovered our journal as it | ||
1178 | * will cause other nodes to unmark us as needing | ||
1179 | * recovery. However, we need to send it *before* dropping the | ||
1180 | * super block lock as otherwise their recovery threads might | ||
1181 | * try to clean us up while we're live! */ | ||
1182 | status = ocfs2_request_mount_vote(osb); | ||
1183 | if (status < 0) | ||
1184 | mlog_errno(status); | ||
1185 | |||
1186 | leave: | 1219 | leave: |
1187 | if (unlock_super) | 1220 | if (unlock_super) |
1188 | ocfs2_super_unlock(osb, 1); | 1221 | ocfs2_super_unlock(osb, 1); |
@@ -1240,10 +1273,6 @@ static void ocfs2_dismount_volume(struct super_block *sb, int mnt_err) | |||
1240 | mlog_errno(tmp); | 1273 | mlog_errno(tmp); |
1241 | return; | 1274 | return; |
1242 | } | 1275 | } |
1243 | |||
1244 | tmp = ocfs2_request_umount_vote(osb); | ||
1245 | if (tmp < 0) | ||
1246 | mlog_errno(tmp); | ||
1247 | } | 1276 | } |
1248 | 1277 | ||
1249 | if (osb->slot_num != OCFS2_INVALID_SLOT) | 1278 | if (osb->slot_num != OCFS2_INVALID_SLOT) |
@@ -1254,13 +1283,8 @@ static void ocfs2_dismount_volume(struct super_block *sb, int mnt_err) | |||
1254 | 1283 | ||
1255 | ocfs2_release_system_inodes(osb); | 1284 | ocfs2_release_system_inodes(osb); |
1256 | 1285 | ||
1257 | if (osb->dlm) { | 1286 | if (osb->dlm) |
1258 | ocfs2_unregister_net_handlers(osb); | ||
1259 | |||
1260 | ocfs2_dlm_shutdown(osb); | 1287 | ocfs2_dlm_shutdown(osb); |
1261 | } | ||
1262 | |||
1263 | ocfs2_clear_hb_callbacks(osb); | ||
1264 | 1288 | ||
1265 | debugfs_remove(osb->osb_debug_root); | 1289 | debugfs_remove(osb->osb_debug_root); |
1266 | 1290 | ||
@@ -1315,7 +1339,6 @@ static int ocfs2_initialize_super(struct super_block *sb, | |||
1315 | int i, cbits, bbits; | 1339 | int i, cbits, bbits; |
1316 | struct ocfs2_dinode *di = (struct ocfs2_dinode *)bh->b_data; | 1340 | struct ocfs2_dinode *di = (struct ocfs2_dinode *)bh->b_data; |
1317 | struct inode *inode = NULL; | 1341 | struct inode *inode = NULL; |
1318 | struct buffer_head *bitmap_bh = NULL; | ||
1319 | struct ocfs2_journal *journal; | 1342 | struct ocfs2_journal *journal; |
1320 | __le32 uuid_net_key; | 1343 | __le32 uuid_net_key; |
1321 | struct ocfs2_super *osb; | 1344 | struct ocfs2_super *osb; |
@@ -1344,19 +1367,13 @@ static int ocfs2_initialize_super(struct super_block *sb, | |||
1344 | osb->s_sectsize_bits = blksize_bits(sector_size); | 1367 | osb->s_sectsize_bits = blksize_bits(sector_size); |
1345 | BUG_ON(!osb->s_sectsize_bits); | 1368 | BUG_ON(!osb->s_sectsize_bits); |
1346 | 1369 | ||
1347 | osb->net_response_ids = 0; | ||
1348 | spin_lock_init(&osb->net_response_lock); | ||
1349 | INIT_LIST_HEAD(&osb->net_response_list); | ||
1350 | |||
1351 | INIT_LIST_HEAD(&osb->osb_net_handlers); | ||
1352 | init_waitqueue_head(&osb->recovery_event); | 1370 | init_waitqueue_head(&osb->recovery_event); |
1353 | spin_lock_init(&osb->vote_task_lock); | 1371 | spin_lock_init(&osb->dc_task_lock); |
1354 | init_waitqueue_head(&osb->vote_event); | 1372 | init_waitqueue_head(&osb->dc_event); |
1355 | osb->vote_work_sequence = 0; | 1373 | osb->dc_work_sequence = 0; |
1356 | osb->vote_wake_sequence = 0; | 1374 | osb->dc_wake_sequence = 0; |
1357 | INIT_LIST_HEAD(&osb->blocked_lock_list); | 1375 | INIT_LIST_HEAD(&osb->blocked_lock_list); |
1358 | osb->blocked_lock_count = 0; | 1376 | osb->blocked_lock_count = 0; |
1359 | INIT_LIST_HEAD(&osb->vote_list); | ||
1360 | spin_lock_init(&osb->osb_lock); | 1377 | spin_lock_init(&osb->osb_lock); |
1361 | 1378 | ||
1362 | atomic_set(&osb->alloc_stats.moves, 0); | 1379 | atomic_set(&osb->alloc_stats.moves, 0); |
@@ -1496,7 +1513,6 @@ static int ocfs2_initialize_super(struct super_block *sb, | |||
1496 | } | 1513 | } |
1497 | 1514 | ||
1498 | memcpy(&uuid_net_key, di->id2.i_super.s_uuid, sizeof(uuid_net_key)); | 1515 | memcpy(&uuid_net_key, di->id2.i_super.s_uuid, sizeof(uuid_net_key)); |
1499 | osb->net_key = le32_to_cpu(uuid_net_key); | ||
1500 | 1516 | ||
1501 | strncpy(osb->vol_label, di->id2.i_super.s_label, 63); | 1517 | strncpy(osb->vol_label, di->id2.i_super.s_label, 63); |
1502 | osb->vol_label[63] = '\0'; | 1518 | osb->vol_label[63] = '\0'; |
@@ -1539,25 +1555,9 @@ static int ocfs2_initialize_super(struct super_block *sb, | |||
1539 | } | 1555 | } |
1540 | 1556 | ||
1541 | osb->bitmap_blkno = OCFS2_I(inode)->ip_blkno; | 1557 | osb->bitmap_blkno = OCFS2_I(inode)->ip_blkno; |
1542 | |||
1543 | /* We don't have a cluster lock on the bitmap here because | ||
1544 | * we're only interested in static information and the extra | ||
1545 | * complexity at mount time isn't worht it. Don't pass the | ||
1546 | * inode in to the read function though as we don't want it to | ||
1547 | * be put in the cache. */ | ||
1548 | status = ocfs2_read_block(osb, osb->bitmap_blkno, &bitmap_bh, 0, | ||
1549 | NULL); | ||
1550 | iput(inode); | 1558 | iput(inode); |
1551 | if (status < 0) { | ||
1552 | mlog_errno(status); | ||
1553 | goto bail; | ||
1554 | } | ||
1555 | 1559 | ||
1556 | di = (struct ocfs2_dinode *) bitmap_bh->b_data; | 1560 | osb->bitmap_cpg = ocfs2_group_bitmap_size(sb) * 8; |
1557 | osb->bitmap_cpg = le16_to_cpu(di->id2.i_chain.cl_cpg); | ||
1558 | brelse(bitmap_bh); | ||
1559 | mlog(0, "cluster bitmap inode: %llu, clusters per group: %u\n", | ||
1560 | (unsigned long long)osb->bitmap_blkno, osb->bitmap_cpg); | ||
1561 | 1561 | ||
1562 | status = ocfs2_init_slot_info(osb); | 1562 | status = ocfs2_init_slot_info(osb); |
1563 | if (status < 0) { | 1563 | if (status < 0) { |