diff options
Diffstat (limited to 'mm/shmem.c')
| -rw-r--r-- | mm/shmem.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/mm/shmem.c b/mm/shmem.c index db2c9e8d9909..1f7aeb210c7b 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
| @@ -666,6 +666,7 @@ static void shmem_delete_inode(struct inode *inode) | |||
| 666 | struct shmem_inode_info *info = SHMEM_I(inode); | 666 | struct shmem_inode_info *info = SHMEM_I(inode); |
| 667 | 667 | ||
| 668 | if (inode->i_op->truncate == shmem_truncate) { | 668 | if (inode->i_op->truncate == shmem_truncate) { |
| 669 | truncate_inode_pages(inode->i_mapping, 0); | ||
| 669 | shmem_unacct_size(info->flags, inode->i_size); | 670 | shmem_unacct_size(info->flags, inode->i_size); |
| 670 | inode->i_size = 0; | 671 | inode->i_size = 0; |
| 671 | shmem_truncate(inode); | 672 | shmem_truncate(inode); |
| @@ -1607,6 +1608,15 @@ shmem_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev) | |||
| 1607 | int error = -ENOSPC; | 1608 | int error = -ENOSPC; |
| 1608 | 1609 | ||
| 1609 | if (inode) { | 1610 | if (inode) { |
| 1611 | error = security_inode_init_security(inode, dir, NULL, NULL, | ||
| 1612 | NULL); | ||
| 1613 | if (error) { | ||
| 1614 | if (error != -EOPNOTSUPP) { | ||
| 1615 | iput(inode); | ||
| 1616 | return error; | ||
| 1617 | } | ||
| 1618 | error = 0; | ||
| 1619 | } | ||
| 1610 | if (dir->i_mode & S_ISGID) { | 1620 | if (dir->i_mode & S_ISGID) { |
| 1611 | inode->i_gid = dir->i_gid; | 1621 | inode->i_gid = dir->i_gid; |
| 1612 | if (S_ISDIR(mode)) | 1622 | if (S_ISDIR(mode)) |
| @@ -1616,7 +1626,6 @@ shmem_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev) | |||
| 1616 | dir->i_ctime = dir->i_mtime = CURRENT_TIME; | 1626 | dir->i_ctime = dir->i_mtime = CURRENT_TIME; |
| 1617 | d_instantiate(dentry, inode); | 1627 | d_instantiate(dentry, inode); |
| 1618 | dget(dentry); /* Extra count - pin the dentry in core */ | 1628 | dget(dentry); /* Extra count - pin the dentry in core */ |
| 1619 | error = 0; | ||
| 1620 | } | 1629 | } |
| 1621 | return error; | 1630 | return error; |
| 1622 | } | 1631 | } |
| @@ -1746,6 +1755,16 @@ static int shmem_symlink(struct inode *dir, struct dentry *dentry, const char *s | |||
| 1746 | if (!inode) | 1755 | if (!inode) |
| 1747 | return -ENOSPC; | 1756 | return -ENOSPC; |
| 1748 | 1757 | ||
| 1758 | error = security_inode_init_security(inode, dir, NULL, NULL, | ||
| 1759 | NULL); | ||
| 1760 | if (error) { | ||
| 1761 | if (error != -EOPNOTSUPP) { | ||
| 1762 | iput(inode); | ||
| 1763 | return error; | ||
| 1764 | } | ||
| 1765 | error = 0; | ||
| 1766 | } | ||
| 1767 | |||
| 1749 | info = SHMEM_I(inode); | 1768 | info = SHMEM_I(inode); |
| 1750 | inode->i_size = len-1; | 1769 | inode->i_size = len-1; |
| 1751 | if (len <= (char *)inode - (char *)info) { | 1770 | if (len <= (char *)inode - (char *)info) { |
