]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - fs/hugetlbfs/inode.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile
[karo-tx-linux.git] / fs / hugetlbfs / inode.c
index d19b30ababf10b115175f3b9814e10130c7c52ed..2040275209371d53d751a2cbbf92b251933c6dc6 100644 (file)
@@ -366,7 +366,13 @@ static void truncate_hugepages(struct inode *inode, loff_t lstart)
 
 static void hugetlbfs_evict_inode(struct inode *inode)
 {
+       struct resv_map *resv_map;
+
        truncate_hugepages(inode, 0);
+       resv_map = (struct resv_map *)inode->i_mapping->private_data;
+       /* root inode doesn't have the resv_map, so we should check it */
+       if (resv_map)
+               resv_map_release(&resv_map->refs);
        clear_inode(inode);
 }
 
@@ -476,6 +482,11 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb,
                                        umode_t mode, dev_t dev)
 {
        struct inode *inode;
+       struct resv_map *resv_map;
+
+       resv_map = resv_map_alloc();
+       if (!resv_map)
+               return NULL;
 
        inode = new_inode(sb);
        if (inode) {
@@ -487,7 +498,7 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb,
                inode->i_mapping->a_ops = &hugetlbfs_aops;
                inode->i_mapping->backing_dev_info =&hugetlbfs_backing_dev_info;
                inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
-               INIT_LIST_HEAD(&inode->i_mapping->private_list);
+               inode->i_mapping->private_data = resv_map;
                info = HUGETLBFS_I(inode);
                /*
                 * 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,
                        break;
                }
                lockdep_annotate_inode_mutex_key(inode);
-       }
+       } else
+               kref_put(&resv_map->refs, resv_map_release);
+
        return inode;
 }