|
@@ -241,9 +241,7 @@ static void shmem_free_blocks(struct inode *inode, long pages)
|
|
|
struct shmem_sb_info *sbinfo = SHMEM_SB(inode->i_sb);
|
|
|
if (sbinfo->max_blocks) {
|
|
|
percpu_counter_add(&sbinfo->used_blocks, -pages);
|
|
|
- spin_lock(&inode->i_lock);
|
|
|
inode->i_blocks -= pages*BLOCKS_PER_PAGE;
|
|
|
- spin_unlock(&inode->i_lock);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -432,9 +430,7 @@ static swp_entry_t *shmem_swp_alloc(struct shmem_inode_info *info, unsigned long
|
|
|
sbinfo->max_blocks - 1) >= 0)
|
|
|
return ERR_PTR(-ENOSPC);
|
|
|
percpu_counter_inc(&sbinfo->used_blocks);
|
|
|
- spin_lock(&inode->i_lock);
|
|
|
inode->i_blocks += BLOCKS_PER_PAGE;
|
|
|
- spin_unlock(&inode->i_lock);
|
|
|
}
|
|
|
|
|
|
spin_unlock(&info->lock);
|
|
@@ -1421,9 +1417,7 @@ repeat:
|
|
|
shmem_acct_block(info->flags))
|
|
|
goto nospace;
|
|
|
percpu_counter_inc(&sbinfo->used_blocks);
|
|
|
- spin_lock(&inode->i_lock);
|
|
|
inode->i_blocks += BLOCKS_PER_PAGE;
|
|
|
- spin_unlock(&inode->i_lock);
|
|
|
} else if (shmem_acct_block(info->flags))
|
|
|
goto nospace;
|
|
|
|
|
@@ -1434,8 +1428,10 @@ repeat:
|
|
|
spin_unlock(&info->lock);
|
|
|
filepage = shmem_alloc_page(gfp, info, idx);
|
|
|
if (!filepage) {
|
|
|
+ spin_lock(&info->lock);
|
|
|
shmem_unacct_blocks(info->flags, 1);
|
|
|
shmem_free_blocks(inode, 1);
|
|
|
+ spin_unlock(&info->lock);
|
|
|
error = -ENOMEM;
|
|
|
goto failed;
|
|
|
}
|
|
@@ -1449,8 +1445,10 @@ repeat:
|
|
|
current->mm, GFP_KERNEL);
|
|
|
if (error) {
|
|
|
page_cache_release(filepage);
|
|
|
+ spin_lock(&info->lock);
|
|
|
shmem_unacct_blocks(info->flags, 1);
|
|
|
shmem_free_blocks(inode, 1);
|
|
|
+ spin_unlock(&info->lock);
|
|
|
filepage = NULL;
|
|
|
goto failed;
|
|
|
}
|
|
@@ -1480,10 +1478,10 @@ repeat:
|
|
|
* be done automatically.
|
|
|
*/
|
|
|
if (ret) {
|
|
|
- spin_unlock(&info->lock);
|
|
|
- page_cache_release(filepage);
|
|
|
shmem_unacct_blocks(info->flags, 1);
|
|
|
shmem_free_blocks(inode, 1);
|
|
|
+ spin_unlock(&info->lock);
|
|
|
+ page_cache_release(filepage);
|
|
|
filepage = NULL;
|
|
|
if (error)
|
|
|
goto failed;
|