diff options
Diffstat (limited to 'fs/gfs2')
-rw-r--r-- | fs/gfs2/rgrp.c | 53 |
1 files changed, 11 insertions, 42 deletions
diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c index 33c8407b876f..6375b3860a9a 100644 --- a/fs/gfs2/rgrp.c +++ b/fs/gfs2/rgrp.c | |||
@@ -614,46 +614,6 @@ static int gfs2_ri_update(struct gfs2_inode *ip) | |||
614 | } | 614 | } |
615 | 615 | ||
616 | /** | 616 | /** |
617 | * gfs2_ri_update_special - Pull in a new resource index from the disk | ||
618 | * | ||
619 | * This is a special version that's safe to call from gfs2_inplace_reserve_i. | ||
620 | * In this case we know that we don't have any resource groups in memory yet. | ||
621 | * | ||
622 | * @ip: pointer to the rindex inode | ||
623 | * | ||
624 | * Returns: 0 on successful update, error code otherwise | ||
625 | */ | ||
626 | static int gfs2_ri_update_special(struct gfs2_inode *ip) | ||
627 | { | ||
628 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); | ||
629 | struct inode *inode = &ip->i_inode; | ||
630 | struct file_ra_state ra_state; | ||
631 | struct gfs2_rgrpd *rgd; | ||
632 | unsigned int max_data = 0; | ||
633 | int error; | ||
634 | |||
635 | file_ra_state_init(&ra_state, inode->i_mapping); | ||
636 | for (sdp->sd_rgrps = 0;; sdp->sd_rgrps++) { | ||
637 | /* Ignore partials */ | ||
638 | if ((sdp->sd_rgrps + 1) * sizeof(struct gfs2_rindex) > | ||
639 | i_size_read(inode)) | ||
640 | break; | ||
641 | error = read_rindex_entry(ip, &ra_state); | ||
642 | if (error) { | ||
643 | clear_rgrpdi(sdp); | ||
644 | return error; | ||
645 | } | ||
646 | } | ||
647 | list_for_each_entry(rgd, &sdp->sd_rindex_list, rd_list) | ||
648 | if (rgd->rd_data > max_data) | ||
649 | max_data = rgd->rd_data; | ||
650 | sdp->sd_max_rg_data = max_data; | ||
651 | |||
652 | sdp->sd_rindex_uptodate = 1; | ||
653 | return 0; | ||
654 | } | ||
655 | |||
656 | /** | ||
657 | * gfs2_rindex_hold - Grab a lock on the rindex | 617 | * gfs2_rindex_hold - Grab a lock on the rindex |
658 | * @sdp: The GFS2 superblock | 618 | * @sdp: The GFS2 superblock |
659 | * @ri_gh: the glock holder | 619 | * @ri_gh: the glock holder |
@@ -1226,16 +1186,25 @@ int gfs2_inplace_reserve_i(struct gfs2_inode *ip, int hold_rindex, | |||
1226 | error = gfs2_rindex_hold(sdp, &al->al_ri_gh); | 1186 | error = gfs2_rindex_hold(sdp, &al->al_ri_gh); |
1227 | else if (!sdp->sd_rgrps) /* We may not have the rindex read | 1187 | else if (!sdp->sd_rgrps) /* We may not have the rindex read |
1228 | in, so: */ | 1188 | in, so: */ |
1229 | error = gfs2_ri_update_special(ip); | 1189 | error = gfs2_ri_update(ip); |
1230 | if (error) | 1190 | if (error) |
1231 | return error; | 1191 | return error; |
1232 | } | 1192 | } |
1233 | 1193 | ||
1194 | try_again: | ||
1234 | do { | 1195 | do { |
1235 | error = get_local_rgrp(ip, &last_unlinked); | 1196 | error = get_local_rgrp(ip, &last_unlinked); |
1236 | /* If there is no space, flushing the log may release some */ | 1197 | /* If there is no space, flushing the log may release some */ |
1237 | if (error) | 1198 | if (error) { |
1199 | if (ip == GFS2_I(sdp->sd_rindex) && | ||
1200 | !sdp->sd_rindex_uptodate) { | ||
1201 | error = gfs2_ri_update(ip); | ||
1202 | if (error) | ||
1203 | return error; | ||
1204 | goto try_again; | ||
1205 | } | ||
1238 | gfs2_log_flush(sdp, NULL); | 1206 | gfs2_log_flush(sdp, NULL); |
1207 | } | ||
1239 | } while (error && tries++ < 3); | 1208 | } while (error && tries++ < 3); |
1240 | 1209 | ||
1241 | if (error) { | 1210 | if (error) { |