|
|
@@ -297,12 +297,14 @@ bool shmem_charge(struct inode *inode, long pages)
|
|
|
if (!shmem_inode_acct_block(inode, pages))
|
|
|
return false;
|
|
|
|
|
|
+ /* nrpages adjustment first, then shmem_recalc_inode() when balanced */
|
|
|
+ inode->i_mapping->nrpages += pages;
|
|
|
+
|
|
|
spin_lock_irqsave(&info->lock, flags);
|
|
|
info->alloced += pages;
|
|
|
inode->i_blocks += pages * BLOCKS_PER_PAGE;
|
|
|
shmem_recalc_inode(inode);
|
|
|
spin_unlock_irqrestore(&info->lock, flags);
|
|
|
- inode->i_mapping->nrpages += pages;
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
@@ -312,6 +314,8 @@ void shmem_uncharge(struct inode *inode, long pages)
|
|
|
struct shmem_inode_info *info = SHMEM_I(inode);
|
|
|
unsigned long flags;
|
|
|
|
|
|
+ /* nrpages adjustment done by __delete_from_page_cache() or caller */
|
|
|
+
|
|
|
spin_lock_irqsave(&info->lock, flags);
|
|
|
info->alloced -= pages;
|
|
|
inode->i_blocks -= pages * BLOCKS_PER_PAGE;
|