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 |
