diff options
Diffstat (limited to 'fs/ocfs2/super.c')
-rw-r--r-- | fs/ocfs2/super.c | 62 |
1 files changed, 50 insertions, 12 deletions
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index c034b5129c1e..0e2a1b45bf92 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c | |||
@@ -39,6 +39,7 @@ | |||
39 | #include <linux/parser.h> | 39 | #include <linux/parser.h> |
40 | #include <linux/crc32.h> | 40 | #include <linux/crc32.h> |
41 | #include <linux/debugfs.h> | 41 | #include <linux/debugfs.h> |
42 | #include <linux/mount.h> | ||
42 | 43 | ||
43 | #include <cluster/nodemanager.h> | 44 | #include <cluster/nodemanager.h> |
44 | 45 | ||
@@ -91,6 +92,7 @@ struct mount_options | |||
91 | static int ocfs2_parse_options(struct super_block *sb, char *options, | 92 | static int ocfs2_parse_options(struct super_block *sb, char *options, |
92 | struct mount_options *mopt, | 93 | struct mount_options *mopt, |
93 | int is_remount); | 94 | int is_remount); |
95 | static int ocfs2_show_options(struct seq_file *s, struct vfsmount *mnt); | ||
94 | static void ocfs2_put_super(struct super_block *sb); | 96 | static void ocfs2_put_super(struct super_block *sb); |
95 | static int ocfs2_mount_volume(struct super_block *sb); | 97 | static int ocfs2_mount_volume(struct super_block *sb); |
96 | static int ocfs2_remount(struct super_block *sb, int *flags, char *data); | 98 | static int ocfs2_remount(struct super_block *sb, int *flags, char *data); |
@@ -105,7 +107,7 @@ static int ocfs2_sync_fs(struct super_block *sb, int wait); | |||
105 | 107 | ||
106 | static int ocfs2_init_global_system_inodes(struct ocfs2_super *osb); | 108 | static int ocfs2_init_global_system_inodes(struct ocfs2_super *osb); |
107 | static int ocfs2_init_local_system_inodes(struct ocfs2_super *osb); | 109 | static int ocfs2_init_local_system_inodes(struct ocfs2_super *osb); |
108 | static int ocfs2_release_system_inodes(struct ocfs2_super *osb); | 110 | static void ocfs2_release_system_inodes(struct ocfs2_super *osb); |
109 | static int ocfs2_fill_local_node_info(struct ocfs2_super *osb); | 111 | static int ocfs2_fill_local_node_info(struct ocfs2_super *osb); |
110 | static int ocfs2_check_volume(struct ocfs2_super *osb); | 112 | static int ocfs2_check_volume(struct ocfs2_super *osb); |
111 | static int ocfs2_verify_volume(struct ocfs2_dinode *di, | 113 | static int ocfs2_verify_volume(struct ocfs2_dinode *di, |
@@ -133,6 +135,7 @@ static const struct super_operations ocfs2_sops = { | |||
133 | .write_super = ocfs2_write_super, | 135 | .write_super = ocfs2_write_super, |
134 | .put_super = ocfs2_put_super, | 136 | .put_super = ocfs2_put_super, |
135 | .remount_fs = ocfs2_remount, | 137 | .remount_fs = ocfs2_remount, |
138 | .show_options = ocfs2_show_options, | ||
136 | }; | 139 | }; |
137 | 140 | ||
138 | enum { | 141 | enum { |
@@ -177,7 +180,7 @@ static void ocfs2_write_super(struct super_block *sb) | |||
177 | 180 | ||
178 | static int ocfs2_sync_fs(struct super_block *sb, int wait) | 181 | static int ocfs2_sync_fs(struct super_block *sb, int wait) |
179 | { | 182 | { |
180 | int status = 0; | 183 | int status; |
181 | tid_t target; | 184 | tid_t target; |
182 | struct ocfs2_super *osb = OCFS2_SB(sb); | 185 | struct ocfs2_super *osb = OCFS2_SB(sb); |
183 | 186 | ||
@@ -275,9 +278,9 @@ bail: | |||
275 | return status; | 278 | return status; |
276 | } | 279 | } |
277 | 280 | ||
278 | static int ocfs2_release_system_inodes(struct ocfs2_super *osb) | 281 | static void ocfs2_release_system_inodes(struct ocfs2_super *osb) |
279 | { | 282 | { |
280 | int status = 0, i; | 283 | int i; |
281 | struct inode *inode; | 284 | struct inode *inode; |
282 | 285 | ||
283 | mlog_entry_void(); | 286 | mlog_entry_void(); |
@@ -302,8 +305,7 @@ static int ocfs2_release_system_inodes(struct ocfs2_super *osb) | |||
302 | osb->root_inode = NULL; | 305 | osb->root_inode = NULL; |
303 | } | 306 | } |
304 | 307 | ||
305 | mlog_exit(status); | 308 | mlog_exit(0); |
306 | return status; | ||
307 | } | 309 | } |
308 | 310 | ||
309 | /* We're allocating fs objects, use GFP_NOFS */ | 311 | /* We're allocating fs objects, use GFP_NOFS */ |
@@ -453,7 +455,7 @@ static int ocfs2_sb_probe(struct super_block *sb, | |||
453 | struct buffer_head **bh, | 455 | struct buffer_head **bh, |
454 | int *sector_size) | 456 | int *sector_size) |
455 | { | 457 | { |
456 | int status = 0, tmpstat; | 458 | int status, tmpstat; |
457 | struct ocfs1_vol_disk_hdr *hdr; | 459 | struct ocfs1_vol_disk_hdr *hdr; |
458 | struct ocfs2_dinode *di; | 460 | struct ocfs2_dinode *di; |
459 | int blksize; | 461 | int blksize; |
@@ -830,6 +832,41 @@ bail: | |||
830 | return status; | 832 | return status; |
831 | } | 833 | } |
832 | 834 | ||
835 | static int ocfs2_show_options(struct seq_file *s, struct vfsmount *mnt) | ||
836 | { | ||
837 | struct ocfs2_super *osb = OCFS2_SB(mnt->mnt_sb); | ||
838 | unsigned long opts = osb->s_mount_opt; | ||
839 | |||
840 | if (opts & OCFS2_MOUNT_HB_LOCAL) | ||
841 | seq_printf(s, ",_netdev,heartbeat=local"); | ||
842 | else | ||
843 | seq_printf(s, ",heartbeat=none"); | ||
844 | |||
845 | if (opts & OCFS2_MOUNT_NOINTR) | ||
846 | seq_printf(s, ",nointr"); | ||
847 | |||
848 | if (opts & OCFS2_MOUNT_DATA_WRITEBACK) | ||
849 | seq_printf(s, ",data=writeback"); | ||
850 | else | ||
851 | seq_printf(s, ",data=ordered"); | ||
852 | |||
853 | if (opts & OCFS2_MOUNT_BARRIER) | ||
854 | seq_printf(s, ",barrier=1"); | ||
855 | |||
856 | if (opts & OCFS2_MOUNT_ERRORS_PANIC) | ||
857 | seq_printf(s, ",errors=panic"); | ||
858 | else | ||
859 | seq_printf(s, ",errors=remount-ro"); | ||
860 | |||
861 | if (osb->preferred_slot != OCFS2_INVALID_SLOT) | ||
862 | seq_printf(s, ",preferred_slot=%d", osb->preferred_slot); | ||
863 | |||
864 | if (osb->s_atime_quantum != OCFS2_DEFAULT_ATIME_QUANTUM) | ||
865 | seq_printf(s, ",atime_quantum=%u", osb->s_atime_quantum); | ||
866 | |||
867 | return 0; | ||
868 | } | ||
869 | |||
833 | static int __init ocfs2_init(void) | 870 | static int __init ocfs2_init(void) |
834 | { | 871 | { |
835 | int status; | 872 | int status; |
@@ -1209,12 +1246,13 @@ static void ocfs2_dismount_volume(struct super_block *sb, int mnt_err) | |||
1209 | tmp = ocfs2_request_umount_vote(osb); | 1246 | tmp = ocfs2_request_umount_vote(osb); |
1210 | if (tmp < 0) | 1247 | if (tmp < 0) |
1211 | mlog_errno(tmp); | 1248 | mlog_errno(tmp); |
1249 | } | ||
1212 | 1250 | ||
1213 | if (osb->slot_num != OCFS2_INVALID_SLOT) | 1251 | if (osb->slot_num != OCFS2_INVALID_SLOT) |
1214 | ocfs2_put_slot(osb); | 1252 | ocfs2_put_slot(osb); |
1215 | 1253 | ||
1254 | if (osb->dlm) | ||
1216 | ocfs2_super_unlock(osb, 1); | 1255 | ocfs2_super_unlock(osb, 1); |
1217 | } | ||
1218 | 1256 | ||
1219 | ocfs2_release_system_inodes(osb); | 1257 | ocfs2_release_system_inodes(osb); |
1220 | 1258 | ||
@@ -1275,7 +1313,7 @@ static int ocfs2_initialize_super(struct super_block *sb, | |||
1275 | struct buffer_head *bh, | 1313 | struct buffer_head *bh, |
1276 | int sector_size) | 1314 | int sector_size) |
1277 | { | 1315 | { |
1278 | int status = 0; | 1316 | int status; |
1279 | int i, cbits, bbits; | 1317 | int i, cbits, bbits; |
1280 | struct ocfs2_dinode *di = (struct ocfs2_dinode *)bh->b_data; | 1318 | struct ocfs2_dinode *di = (struct ocfs2_dinode *)bh->b_data; |
1281 | struct inode *inode = NULL; | 1319 | struct inode *inode = NULL; |
@@ -1596,7 +1634,7 @@ static int ocfs2_verify_volume(struct ocfs2_dinode *di, | |||
1596 | 1634 | ||
1597 | static int ocfs2_check_volume(struct ocfs2_super *osb) | 1635 | static int ocfs2_check_volume(struct ocfs2_super *osb) |
1598 | { | 1636 | { |
1599 | int status = 0; | 1637 | int status; |
1600 | int dirty; | 1638 | int dirty; |
1601 | int local; | 1639 | int local; |
1602 | struct ocfs2_dinode *local_alloc = NULL; /* only used if we | 1640 | struct ocfs2_dinode *local_alloc = NULL; /* only used if we |