diff options
| -rw-r--r-- | fs/ext4/namei.c | 5 |
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); |
