aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/ext4/namei.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index e917830eae84..ac7457fef9e6 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -872,12 +872,15 @@ static void dx_release(struct dx_frame *frames)
872{ 872{
873 struct dx_root_info *info; 873 struct dx_root_info *info;
874 int i; 874 int i;
875 unsigned int indirect_levels;
875 876
876 if (frames[0].bh == NULL) 877 if (frames[0].bh == NULL)
877 return; 878 return;
878 879
879 info = &((struct dx_root *)frames[0].bh->b_data)->info; 880 info = &((struct dx_root *)frames[0].bh->b_data)->info;
880 for (i = 0; i <= info->indirect_levels; i++) { 881 /* save local copy, "info" may be freed after brelse() */
882 indirect_levels = info->indirect_levels;
883 for (i = 0; i <= indirect_levels; i++) {
881 if (frames[i].bh == NULL) 884 if (frames[i].bh == NULL)
882 break; 885 break;
883 brelse(frames[i].bh); 886 brelse(frames[i].bh);