|
@@ -798,6 +798,7 @@ int nilfs_search_super_root(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi,
|
|
|
struct nilfs_segsum_info ssi;
|
|
|
sector_t pseg_start, pseg_end, sr_pseg_start = 0;
|
|
|
sector_t seg_start, seg_end; /* range of full segment (block number) */
|
|
|
+ sector_t b, end;
|
|
|
u64 seg_seq;
|
|
|
__u64 segnum, nextnum = 0;
|
|
|
__u64 cno;
|
|
@@ -813,6 +814,11 @@ int nilfs_search_super_root(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi,
|
|
|
/* Calculate range of segment */
|
|
|
nilfs_get_segment_range(nilfs, segnum, &seg_start, &seg_end);
|
|
|
|
|
|
+ /* Read ahead segment */
|
|
|
+ b = seg_start;
|
|
|
+ while (b <= seg_end)
|
|
|
+ sb_breadahead(sbi->s_super, b++);
|
|
|
+
|
|
|
for (;;) {
|
|
|
/* Load segment summary */
|
|
|
ret = load_segment_summary(sbi, pseg_start, seg_seq, &ssi, 1);
|
|
@@ -835,14 +841,20 @@ int nilfs_search_super_root(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi,
|
|
|
ri->ri_nextnum = nextnum;
|
|
|
empty_seg = 0;
|
|
|
|
|
|
+ if (!NILFS_SEG_HAS_SR(&ssi) && !scan_newer) {
|
|
|
+ /* This will never happen because a superblock
|
|
|
+ (last_segment) always points to a pseg
|
|
|
+ having a super root. */
|
|
|
+ ret = NILFS_SEG_FAIL_CONSISTENCY;
|
|
|
+ goto failed;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (pseg_start == seg_start) {
|
|
|
+ nilfs_get_segment_range(nilfs, nextnum, &b, &end);
|
|
|
+ while (b <= end)
|
|
|
+ sb_breadahead(sbi->s_super, b++);
|
|
|
+ }
|
|
|
if (!NILFS_SEG_HAS_SR(&ssi)) {
|
|
|
- if (!scan_newer) {
|
|
|
- /* This will never happen because a superblock
|
|
|
- (last_segment) always points to a pseg
|
|
|
- having a super root. */
|
|
|
- ret = NILFS_SEG_FAIL_CONSISTENCY;
|
|
|
- goto failed;
|
|
|
- }
|
|
|
if (!ri->ri_lsegs_start && NILFS_SEG_LOGBGN(&ssi)) {
|
|
|
ri->ri_lsegs_start = pseg_start;
|
|
|
ri->ri_lsegs_start_seq = seg_seq;
|