diff options
Diffstat (limited to 'fs/nilfs2')
-rw-r--r-- | fs/nilfs2/super.c | 39 | ||||
-rw-r--r-- | fs/nilfs2/the_nilfs.c | 70 |
2 files changed, 53 insertions, 56 deletions
diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c index f52616977ea0..990ead43a833 100644 --- a/fs/nilfs2/super.c +++ b/fs/nilfs2/super.c | |||
@@ -414,22 +414,6 @@ void nilfs_detach_checkpoint(struct nilfs_sb_info *sbi) | |||
414 | up_write(&nilfs->ns_super_sem); | 414 | up_write(&nilfs->ns_super_sem); |
415 | } | 415 | } |
416 | 416 | ||
417 | static int nilfs_mark_recovery_complete(struct nilfs_sb_info *sbi) | ||
418 | { | ||
419 | struct the_nilfs *nilfs = sbi->s_nilfs; | ||
420 | int err = 0; | ||
421 | |||
422 | down_write(&nilfs->ns_sem); | ||
423 | if (!(nilfs->ns_mount_state & NILFS_VALID_FS)) { | ||
424 | nilfs->ns_mount_state |= NILFS_VALID_FS; | ||
425 | err = nilfs_commit_super(sbi, 1); | ||
426 | if (likely(!err)) | ||
427 | printk(KERN_INFO "NILFS: recovery complete.\n"); | ||
428 | } | ||
429 | up_write(&nilfs->ns_sem); | ||
430 | return err; | ||
431 | } | ||
432 | |||
433 | static int nilfs_statfs(struct dentry *dentry, struct kstatfs *buf) | 417 | static int nilfs_statfs(struct dentry *dentry, struct kstatfs *buf) |
434 | { | 418 | { |
435 | struct super_block *sb = dentry->d_sb; | 419 | struct super_block *sb = dentry->d_sb; |
@@ -649,9 +633,7 @@ static int nilfs_setup_super(struct nilfs_sb_info *sbi) | |||
649 | int mnt_count = le16_to_cpu(sbp->s_mnt_count); | 633 | int mnt_count = le16_to_cpu(sbp->s_mnt_count); |
650 | 634 | ||
651 | /* nilfs->sem must be locked by the caller. */ | 635 | /* nilfs->sem must be locked by the caller. */ |
652 | if (!(nilfs->ns_mount_state & NILFS_VALID_FS)) { | 636 | if (nilfs->ns_mount_state & NILFS_ERROR_FS) { |
653 | printk(KERN_WARNING "NILFS warning: mounting unchecked fs\n"); | ||
654 | } else if (nilfs->ns_mount_state & NILFS_ERROR_FS) { | ||
655 | printk(KERN_WARNING | 637 | printk(KERN_WARNING |
656 | "NILFS warning: mounting fs with errors\n"); | 638 | "NILFS warning: mounting fs with errors\n"); |
657 | #if 0 | 639 | #if 0 |
@@ -759,11 +741,10 @@ nilfs_fill_super(struct super_block *sb, void *data, int silent, | |||
759 | sb->s_root = NULL; | 741 | sb->s_root = NULL; |
760 | sb->s_time_gran = 1; | 742 | sb->s_time_gran = 1; |
761 | 743 | ||
762 | if (!nilfs_loaded(nilfs)) { | 744 | err = load_nilfs(nilfs, sbi); |
763 | err = load_nilfs(nilfs, sbi); | 745 | if (err) |
764 | if (err) | 746 | goto failed_sbi; |
765 | goto failed_sbi; | 747 | |
766 | } | ||
767 | cno = nilfs_last_cno(nilfs); | 748 | cno = nilfs_last_cno(nilfs); |
768 | 749 | ||
769 | if (sb->s_flags & MS_RDONLY) { | 750 | if (sb->s_flags & MS_RDONLY) { |
@@ -831,12 +812,6 @@ nilfs_fill_super(struct super_block *sb, void *data, int silent, | |||
831 | up_write(&nilfs->ns_sem); | 812 | up_write(&nilfs->ns_sem); |
832 | } | 813 | } |
833 | 814 | ||
834 | err = nilfs_mark_recovery_complete(sbi); | ||
835 | if (unlikely(err)) { | ||
836 | printk(KERN_ERR "NILFS: recovery failed.\n"); | ||
837 | goto failed_root; | ||
838 | } | ||
839 | |||
840 | down_write(&nilfs->ns_super_sem); | 815 | down_write(&nilfs->ns_super_sem); |
841 | if (!nilfs_test_opt(sbi, SNAPSHOT)) | 816 | if (!nilfs_test_opt(sbi, SNAPSHOT)) |
842 | nilfs->ns_current = sbi; | 817 | nilfs->ns_current = sbi; |
@@ -844,10 +819,6 @@ nilfs_fill_super(struct super_block *sb, void *data, int silent, | |||
844 | 819 | ||
845 | return 0; | 820 | return 0; |
846 | 821 | ||
847 | failed_root: | ||
848 | dput(sb->s_root); | ||
849 | sb->s_root = NULL; | ||
850 | |||
851 | failed_segctor: | 822 | failed_segctor: |
852 | nilfs_detach_segment_constructor(sbi); | 823 | nilfs_detach_segment_constructor(sbi); |
853 | 824 | ||
diff --git a/fs/nilfs2/the_nilfs.c b/fs/nilfs2/the_nilfs.c index 4d4d35c6fbef..aea2b58ba03b 100644 --- a/fs/nilfs2/the_nilfs.c +++ b/fs/nilfs2/the_nilfs.c | |||
@@ -262,28 +262,27 @@ int load_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi) | |||
262 | unsigned int s_flags = sbi->s_super->s_flags; | 262 | unsigned int s_flags = sbi->s_super->s_flags; |
263 | int really_read_only = bdev_read_only(nilfs->ns_bdev); | 263 | int really_read_only = bdev_read_only(nilfs->ns_bdev); |
264 | unsigned valid_fs; | 264 | unsigned valid_fs; |
265 | int err = 0; | 265 | int err; |
266 | 266 | ||
267 | nilfs_init_recovery_info(&ri); | 267 | if (nilfs_loaded(nilfs)) |
268 | return 0; | ||
268 | 269 | ||
269 | down_write(&nilfs->ns_sem); | 270 | down_write(&nilfs->ns_sem); |
270 | valid_fs = (nilfs->ns_mount_state & NILFS_VALID_FS); | 271 | valid_fs = (nilfs->ns_mount_state & NILFS_VALID_FS); |
271 | up_write(&nilfs->ns_sem); | 272 | up_write(&nilfs->ns_sem); |
272 | 273 | ||
273 | if (!valid_fs && (s_flags & MS_RDONLY)) { | 274 | if (!valid_fs) { |
274 | printk(KERN_INFO "NILFS: INFO: recovery " | 275 | printk(KERN_WARNING "NILFS warning: mounting unchecked fs\n"); |
275 | "required for readonly filesystem.\n"); | 276 | if (s_flags & MS_RDONLY) { |
276 | if (really_read_only) { | 277 | printk(KERN_INFO "NILFS: INFO: recovery " |
277 | printk(KERN_ERR "NILFS: write access " | 278 | "required for readonly filesystem.\n"); |
278 | "unavailable, cannot proceed.\n"); | 279 | printk(KERN_INFO "NILFS: write access will " |
279 | err = -EROFS; | 280 | "be enabled during recovery.\n"); |
280 | goto failed; | ||
281 | } | 281 | } |
282 | printk(KERN_INFO "NILFS: write access will " | ||
283 | "be enabled during recovery.\n"); | ||
284 | sbi->s_super->s_flags &= ~MS_RDONLY; | ||
285 | } | 282 | } |
286 | 283 | ||
284 | nilfs_init_recovery_info(&ri); | ||
285 | |||
287 | err = nilfs_search_super_root(nilfs, sbi, &ri); | 286 | err = nilfs_search_super_root(nilfs, sbi, &ri); |
288 | if (unlikely(err)) { | 287 | if (unlikely(err)) { |
289 | printk(KERN_ERR "NILFS: error searching super root.\n"); | 288 | printk(KERN_ERR "NILFS: error searching super root.\n"); |
@@ -296,19 +295,46 @@ int load_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi) | |||
296 | goto failed; | 295 | goto failed; |
297 | } | 296 | } |
298 | 297 | ||
299 | if (!valid_fs) { | 298 | if (valid_fs) |
300 | err = nilfs_recover_logical_segments(nilfs, sbi, &ri); | 299 | goto skip_recovery; |
301 | if (unlikely(err)) { | 300 | |
302 | nilfs_mdt_destroy(nilfs->ns_cpfile); | 301 | if (s_flags & MS_RDONLY) { |
303 | nilfs_mdt_destroy(nilfs->ns_sufile); | 302 | if (really_read_only) { |
304 | nilfs_mdt_destroy(nilfs->ns_dat); | 303 | printk(KERN_ERR "NILFS: write access " |
305 | goto failed; | 304 | "unavailable, cannot proceed.\n"); |
305 | err = -EROFS; | ||
306 | goto failed_unload; | ||
306 | } | 307 | } |
307 | if (ri.ri_need_recovery == NILFS_RECOVERY_SR_UPDATED) | 308 | sbi->s_super->s_flags &= ~MS_RDONLY; |
308 | sbi->s_super->s_dirt = 1; | 309 | } |
310 | |||
311 | err = nilfs_recover_logical_segments(nilfs, sbi, &ri); | ||
312 | if (err) | ||
313 | goto failed_unload; | ||
314 | |||
315 | down_write(&nilfs->ns_sem); | ||
316 | nilfs->ns_mount_state |= NILFS_VALID_FS; | ||
317 | nilfs->ns_sbp[0]->s_state = cpu_to_le16(nilfs->ns_mount_state); | ||
318 | err = nilfs_commit_super(sbi, 1); | ||
319 | up_write(&nilfs->ns_sem); | ||
320 | |||
321 | if (err) { | ||
322 | printk(KERN_ERR "NILFS: failed to update super block. " | ||
323 | "recovery unfinished.\n"); | ||
324 | goto failed_unload; | ||
309 | } | 325 | } |
326 | printk(KERN_INFO "NILFS: recovery complete.\n"); | ||
310 | 327 | ||
328 | skip_recovery: | ||
311 | set_nilfs_loaded(nilfs); | 329 | set_nilfs_loaded(nilfs); |
330 | nilfs_clear_recovery_info(&ri); | ||
331 | sbi->s_super->s_flags = s_flags; | ||
332 | return 0; | ||
333 | |||
334 | failed_unload: | ||
335 | nilfs_mdt_destroy(nilfs->ns_cpfile); | ||
336 | nilfs_mdt_destroy(nilfs->ns_sufile); | ||
337 | nilfs_mdt_destroy(nilfs->ns_dat); | ||
312 | 338 | ||
313 | failed: | 339 | failed: |
314 | nilfs_clear_recovery_info(&ri); | 340 | nilfs_clear_recovery_info(&ri); |