diff options
Diffstat (limited to 'fs/hugetlbfs/inode.c')
| -rw-r--r-- | fs/hugetlbfs/inode.c | 14 | 
1 files changed, 13 insertions, 1 deletions
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 32920a10100e..b0eef008de67 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -530,7 +530,7 @@ static long hugetlbfs_punch_hole(struct inode *inode, loff_t offset, loff_t len)  		inode_lock(inode);  		/* protected by i_mutex */ -		if (info->seals & F_SEAL_WRITE) { +		if (info->seals & (F_SEAL_WRITE | F_SEAL_FUTURE_WRITE)) {  			inode_unlock(inode);  			return -EPERM;  		} @@ -859,6 +859,18 @@ static int hugetlbfs_migrate_page(struct address_space *mapping,  	rc = migrate_huge_page_move_mapping(mapping, newpage, page);  	if (rc != MIGRATEPAGE_SUCCESS)  		return rc; + +	/* +	 * page_private is subpool pointer in hugetlb pages.  Transfer to +	 * new page.  PagePrivate is not associated with page_private for +	 * hugetlb pages and can not be set here as only page_huge_active +	 * pages can be migrated. +	 */ +	if (page_private(page)) { +		set_page_private(newpage, page_private(page)); +		set_page_private(page, 0); +	} +  	if (mode != MIGRATE_SYNC_NO_COPY)  		migrate_page_copy(newpage, page);  	else  |