shmem: factor out sbi->free_inodes manipulations
The shmem_sb_info structure has a number of free_inodes. This value is altered in appropriate places under spinlock and with the sbi->max_inodes != 0 check. Consolidate these manipulations into two helpers. This is minus 42 bytes of shmem.o and minus 4 :) lines of code. [akpm@linux-foundation.org: fix error return values] Signed-off-by: Pavel Emelyanov <xemul@openvz.org> Signed-off-by: Hugh Dickins <hugh@veritas.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
2e441889c3
commit
5b04c6890f
77
mm/shmem.c
77
mm/shmem.c
@ -205,6 +205,31 @@ static void shmem_free_blocks(struct inode *inode, long pages)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int shmem_reserve_inode(struct super_block *sb)
|
||||||
|
{
|
||||||
|
struct shmem_sb_info *sbinfo = SHMEM_SB(sb);
|
||||||
|
if (sbinfo->max_inodes) {
|
||||||
|
spin_lock(&sbinfo->stat_lock);
|
||||||
|
if (!sbinfo->free_inodes) {
|
||||||
|
spin_unlock(&sbinfo->stat_lock);
|
||||||
|
return -ENOSPC;
|
||||||
|
}
|
||||||
|
sbinfo->free_inodes--;
|
||||||
|
spin_unlock(&sbinfo->stat_lock);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void shmem_free_inode(struct super_block *sb)
|
||||||
|
{
|
||||||
|
struct shmem_sb_info *sbinfo = SHMEM_SB(sb);
|
||||||
|
if (sbinfo->max_inodes) {
|
||||||
|
spin_lock(&sbinfo->stat_lock);
|
||||||
|
sbinfo->free_inodes++;
|
||||||
|
spin_unlock(&sbinfo->stat_lock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* shmem_recalc_inode - recalculate the size of an inode
|
* shmem_recalc_inode - recalculate the size of an inode
|
||||||
*
|
*
|
||||||
@ -762,7 +787,6 @@ static int shmem_notify_change(struct dentry *dentry, struct iattr *attr)
|
|||||||
|
|
||||||
static void shmem_delete_inode(struct inode *inode)
|
static void shmem_delete_inode(struct inode *inode)
|
||||||
{
|
{
|
||||||
struct shmem_sb_info *sbinfo = SHMEM_SB(inode->i_sb);
|
|
||||||
struct shmem_inode_info *info = SHMEM_I(inode);
|
struct shmem_inode_info *info = SHMEM_I(inode);
|
||||||
|
|
||||||
if (inode->i_op->truncate == shmem_truncate) {
|
if (inode->i_op->truncate == shmem_truncate) {
|
||||||
@ -777,11 +801,7 @@ static void shmem_delete_inode(struct inode *inode)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
BUG_ON(inode->i_blocks);
|
BUG_ON(inode->i_blocks);
|
||||||
if (sbinfo->max_inodes) {
|
shmem_free_inode(inode->i_sb);
|
||||||
spin_lock(&sbinfo->stat_lock);
|
|
||||||
sbinfo->free_inodes++;
|
|
||||||
spin_unlock(&sbinfo->stat_lock);
|
|
||||||
}
|
|
||||||
clear_inode(inode);
|
clear_inode(inode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1371,15 +1391,8 @@ shmem_get_inode(struct super_block *sb, int mode, dev_t dev)
|
|||||||
struct shmem_inode_info *info;
|
struct shmem_inode_info *info;
|
||||||
struct shmem_sb_info *sbinfo = SHMEM_SB(sb);
|
struct shmem_sb_info *sbinfo = SHMEM_SB(sb);
|
||||||
|
|
||||||
if (sbinfo->max_inodes) {
|
if (shmem_reserve_inode(sb))
|
||||||
spin_lock(&sbinfo->stat_lock);
|
return NULL;
|
||||||
if (!sbinfo->free_inodes) {
|
|
||||||
spin_unlock(&sbinfo->stat_lock);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
sbinfo->free_inodes--;
|
|
||||||
spin_unlock(&sbinfo->stat_lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
inode = new_inode(sb);
|
inode = new_inode(sb);
|
||||||
if (inode) {
|
if (inode) {
|
||||||
@ -1423,11 +1436,8 @@ shmem_get_inode(struct super_block *sb, int mode, dev_t dev)
|
|||||||
NULL);
|
NULL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (sbinfo->max_inodes) {
|
} else
|
||||||
spin_lock(&sbinfo->stat_lock);
|
shmem_free_inode(sb);
|
||||||
sbinfo->free_inodes++;
|
|
||||||
spin_unlock(&sbinfo->stat_lock);
|
|
||||||
}
|
|
||||||
return inode;
|
return inode;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1670,22 +1680,16 @@ static int shmem_create(struct inode *dir, struct dentry *dentry, int mode,
|
|||||||
static int shmem_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
|
static int shmem_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
|
||||||
{
|
{
|
||||||
struct inode *inode = old_dentry->d_inode;
|
struct inode *inode = old_dentry->d_inode;
|
||||||
struct shmem_sb_info *sbinfo = SHMEM_SB(inode->i_sb);
|
int ret;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* No ordinary (disk based) filesystem counts links as inodes;
|
* No ordinary (disk based) filesystem counts links as inodes;
|
||||||
* but each new link needs a new dentry, pinning lowmem, and
|
* but each new link needs a new dentry, pinning lowmem, and
|
||||||
* tmpfs dentries cannot be pruned until they are unlinked.
|
* tmpfs dentries cannot be pruned until they are unlinked.
|
||||||
*/
|
*/
|
||||||
if (sbinfo->max_inodes) {
|
ret = shmem_reserve_inode(inode->i_sb);
|
||||||
spin_lock(&sbinfo->stat_lock);
|
if (ret)
|
||||||
if (!sbinfo->free_inodes) {
|
goto out;
|
||||||
spin_unlock(&sbinfo->stat_lock);
|
|
||||||
return -ENOSPC;
|
|
||||||
}
|
|
||||||
sbinfo->free_inodes--;
|
|
||||||
spin_unlock(&sbinfo->stat_lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
dir->i_size += BOGO_DIRENT_SIZE;
|
dir->i_size += BOGO_DIRENT_SIZE;
|
||||||
inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
|
inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
|
||||||
@ -1693,21 +1697,16 @@ static int shmem_link(struct dentry *old_dentry, struct inode *dir, struct dentr
|
|||||||
atomic_inc(&inode->i_count); /* New dentry reference */
|
atomic_inc(&inode->i_count); /* New dentry reference */
|
||||||
dget(dentry); /* Extra pinning count for the created dentry */
|
dget(dentry); /* Extra pinning count for the created dentry */
|
||||||
d_instantiate(dentry, inode);
|
d_instantiate(dentry, inode);
|
||||||
return 0;
|
out:
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int shmem_unlink(struct inode *dir, struct dentry *dentry)
|
static int shmem_unlink(struct inode *dir, struct dentry *dentry)
|
||||||
{
|
{
|
||||||
struct inode *inode = dentry->d_inode;
|
struct inode *inode = dentry->d_inode;
|
||||||
|
|
||||||
if (inode->i_nlink > 1 && !S_ISDIR(inode->i_mode)) {
|
if (inode->i_nlink > 1 && !S_ISDIR(inode->i_mode))
|
||||||
struct shmem_sb_info *sbinfo = SHMEM_SB(inode->i_sb);
|
shmem_free_inode(inode->i_sb);
|
||||||
if (sbinfo->max_inodes) {
|
|
||||||
spin_lock(&sbinfo->stat_lock);
|
|
||||||
sbinfo->free_inodes++;
|
|
||||||
spin_unlock(&sbinfo->stat_lock);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dir->i_size -= BOGO_DIRENT_SIZE;
|
dir->i_size -= BOGO_DIRENT_SIZE;
|
||||||
inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
|
inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
|
||||||
|
Loading…
Reference in New Issue
Block a user