diff options
Diffstat (limited to 'fs/hugetlbfs/inode.c')
| -rw-r--r-- | fs/hugetlbfs/inode.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index d19b30ababf1..204027520937 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
| @@ -366,7 +366,13 @@ static void truncate_hugepages(struct inode *inode, loff_t lstart) | |||
| 366 | 366 | ||
| 367 | static void hugetlbfs_evict_inode(struct inode *inode) | 367 | static void hugetlbfs_evict_inode(struct inode *inode) |
| 368 | { | 368 | { |
| 369 | struct resv_map *resv_map; | ||
| 370 | |||
| 369 | truncate_hugepages(inode, 0); | 371 | truncate_hugepages(inode, 0); |
| 372 | resv_map = (struct resv_map *)inode->i_mapping->private_data; | ||
| 373 | /* root inode doesn't have the resv_map, so we should check it */ | ||
| 374 | if (resv_map) | ||
| 375 | resv_map_release(&resv_map->refs); | ||
| 370 | clear_inode(inode); | 376 | clear_inode(inode); |
| 371 | } | 377 | } |
| 372 | 378 | ||
| @@ -476,6 +482,11 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb, | |||
| 476 | umode_t mode, dev_t dev) | 482 | umode_t mode, dev_t dev) |
| 477 | { | 483 | { |
| 478 | struct inode *inode; | 484 | struct inode *inode; |
| 485 | struct resv_map *resv_map; | ||
| 486 | |||
| 487 | resv_map = resv_map_alloc(); | ||
| 488 | if (!resv_map) | ||
| 489 | return NULL; | ||
| 479 | 490 | ||
| 480 | inode = new_inode(sb); | 491 | inode = new_inode(sb); |
| 481 | if (inode) { | 492 | if (inode) { |
| @@ -487,7 +498,7 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb, | |||
| 487 | inode->i_mapping->a_ops = &hugetlbfs_aops; | 498 | inode->i_mapping->a_ops = &hugetlbfs_aops; |
| 488 | inode->i_mapping->backing_dev_info =&hugetlbfs_backing_dev_info; | 499 | inode->i_mapping->backing_dev_info =&hugetlbfs_backing_dev_info; |
| 489 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 500 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
| 490 | INIT_LIST_HEAD(&inode->i_mapping->private_list); | 501 | inode->i_mapping->private_data = resv_map; |
| 491 | info = HUGETLBFS_I(inode); | 502 | info = HUGETLBFS_I(inode); |
| 492 | /* | 503 | /* |
| 493 | * The policy is initialized here even if we are creating a | 504 | * The policy is initialized here even if we are creating a |
| @@ -517,7 +528,9 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb, | |||
| 517 | break; | 528 | break; |
| 518 | } | 529 | } |
| 519 | lockdep_annotate_inode_mutex_key(inode); | 530 | lockdep_annotate_inode_mutex_key(inode); |
| 520 | } | 531 | } else |
| 532 | kref_put(&resv_map->refs, resv_map_release); | ||
| 533 | |||
| 521 | return inode; | 534 | return inode; |
| 522 | } | 535 | } |
| 523 | 536 | ||
