@@ -208,13 +208,13 @@ static inline void shmem_unacct_blocks(unsigned long flags, long pages)
vm_unacct_memory(pages * VM_ACCT(PAGE_SIZE));
}
-static inline bool shmem_inode_acct_block(struct inode *inode, long pages)
+static inline int shmem_inode_acct_block(struct inode *inode, long pages)
{
struct shmem_inode_info *info = SHMEM_I(inode);
struct shmem_sb_info *sbinfo = SHMEM_SB(inode->i_sb);
if (shmem_acct_block(info->flags, pages))
- return false;
+ return -EPERM;
if (sbinfo->max_blocks) {
if (percpu_counter_compare(&sbinfo->used_blocks,
@@ -223,11 +223,11 @@ static inline bool shmem_inode_acct_block(struct inode *inode, long pages)
percpu_counter_add(&sbinfo->used_blocks, pages);
}
- return true;
+ return 0;
unacct:
shmem_unacct_blocks(info->flags, pages);
- return false;
+ return -ENOSPC;
}
static inline void shmem_inode_unacct_blocks(struct inode *inode, long pages)
@@ -373,7 +373,7 @@ bool shmem_charge(struct inode *inode, long pages)
struct shmem_inode_info *info = SHMEM_I(inode);
unsigned long flags;
- if (!shmem_inode_acct_block(inode, pages))
+ if (shmem_inode_acct_block(inode, pages))
return false;
/* nrpages adjustment first, then shmem_recalc_inode() when balanced */
@@ -1595,7 +1595,8 @@ static struct page *shmem_alloc_and_acct_page(gfp_t gfp,
huge = false;
nr = huge ? HPAGE_PMD_NR : 1;
- if (!shmem_inode_acct_block(inode, nr))
+ err = shmem_inode_acct_block(inode, nr);
+ if (err)
goto failed;
if (huge)
@@ -1907,7 +1908,9 @@ static int shmem_getpage_gfp(struct inode *inode, pgoff_t index,
error = PTR_ERR(page);
page = NULL;
- if (error != -ENOSPC)
+ if (error == -EPERM)
+ error = -ENOSPC;
+ else if (error != -ENOSPC)
goto unlock;
/*
* Try to reclaim some space by splitting a huge page
@@ -2357,7 +2360,7 @@ int shmem_mfill_atomic_pte(struct mm_struct *dst_mm,
int ret;
pgoff_t max_off;
- if (!shmem_inode_acct_block(inode, 1)) {
+ if (shmem_inode_acct_block(inode, 1)) {
/*
* We may have got a page, returned -ENOENT triggering a retry,
* and now we find ourselves with -ENOMEM. Release the page, to
In order to notify userspace when space is running out, split the accounting return codes for the case where we cannot allocate more memory due to memory pressure from the actual case where we are approaching the file system size limit. Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com> --- mm/shmem.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)