Skip to content

Commit

Permalink
tmpfs: convert to use the new truncate convention
Browse files Browse the repository at this point in the history
Cc: Christoph Hellwig <[email protected]>
Acked-by: Hugh Dickins <[email protected]>
Signed-off-by: Nick Piggin <[email protected]>
Signed-off-by: Al Viro <[email protected]>
  • Loading branch information
[email protected] authored and Al Viro committed May 28, 2010
1 parent 3322e79 commit 3889e6e
Showing 1 changed file with 22 additions and 21 deletions.
43 changes: 22 additions & 21 deletions mm/shmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -727,10 +727,11 @@ static void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end)
if (inode->i_mapping->nrpages && (info->flags & SHMEM_PAGEIN)) {
/*
* Call truncate_inode_pages again: racing shmem_unuse_inode
* may have swizzled a page in from swap since vmtruncate or
* generic_delete_inode did it, before we lowered next_index.
* Also, though shmem_getpage checks i_size before adding to
* cache, no recheck after: so fix the narrow window there too.
* may have swizzled a page in from swap since
* truncate_pagecache or generic_delete_inode did it, before we
* lowered next_index. Also, though shmem_getpage checks
* i_size before adding to cache, no recheck after: so fix the
* narrow window there too.
*
* Recalling truncate_inode_pages_range and unmap_mapping_range
* every time for punch_hole (which never got a chance to clear
Expand Down Expand Up @@ -760,29 +761,26 @@ static void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end)
}
}

static void shmem_truncate(struct inode *inode)
{
shmem_truncate_range(inode, inode->i_size, (loff_t)-1);
}

static int shmem_notify_change(struct dentry *dentry, struct iattr *attr)
{
struct inode *inode = dentry->d_inode;
struct page *page = NULL;
int error;

if (S_ISREG(inode->i_mode) && (attr->ia_valid & ATTR_SIZE)) {
if (attr->ia_size < inode->i_size) {
loff_t newsize = attr->ia_size;
struct page *page = NULL;

if (newsize < inode->i_size) {
/*
* If truncating down to a partial page, then
* if that page is already allocated, hold it
* in memory until the truncation is over, so
* truncate_partial_page cannnot miss it were
* it assigned to swap.
*/
if (attr->ia_size & (PAGE_CACHE_SIZE-1)) {
if (newsize & (PAGE_CACHE_SIZE-1)) {
(void) shmem_getpage(inode,
attr->ia_size>>PAGE_CACHE_SHIFT,
newsize >> PAGE_CACHE_SHIFT,
&page, SGP_READ, NULL);
if (page)
unlock_page(page);
Expand All @@ -794,36 +792,41 @@ static int shmem_notify_change(struct dentry *dentry, struct iattr *attr)
* if it's being fully truncated to zero-length: the
* nrpages check is efficient enough in that case.
*/
if (attr->ia_size) {
if (newsize) {
struct shmem_inode_info *info = SHMEM_I(inode);
spin_lock(&info->lock);
info->flags &= ~SHMEM_PAGEIN;
spin_unlock(&info->lock);
}
}

error = simple_setsize(inode, newsize);
if (page)
page_cache_release(page);
if (error)
return error;
shmem_truncate_range(inode, newsize, (loff_t)-1);
}

error = inode_change_ok(inode, attr);
if (!error)
error = inode_setattr(inode, attr);
generic_setattr(inode, attr);
#ifdef CONFIG_TMPFS_POSIX_ACL
if (!error && (attr->ia_valid & ATTR_MODE))
error = generic_acl_chmod(inode);
#endif
if (page)
page_cache_release(page);
return error;
}

static void shmem_delete_inode(struct inode *inode)
{
struct shmem_inode_info *info = SHMEM_I(inode);

if (inode->i_op->truncate == shmem_truncate) {
if (inode->i_mapping->a_ops == &shmem_aops) {
truncate_inode_pages(inode->i_mapping, 0);
shmem_unacct_size(info->flags, inode->i_size);
inode->i_size = 0;
shmem_truncate(inode);
shmem_truncate_range(inode, 0, (loff_t)-1);
if (!list_empty(&info->swaplist)) {
mutex_lock(&shmem_swaplist_mutex);
list_del_init(&info->swaplist);
Expand Down Expand Up @@ -2022,7 +2025,6 @@ static const struct inode_operations shmem_symlink_inline_operations = {
};

static const struct inode_operations shmem_symlink_inode_operations = {
.truncate = shmem_truncate,
.readlink = generic_readlink,
.follow_link = shmem_follow_link,
.put_link = shmem_put_link,
Expand Down Expand Up @@ -2440,7 +2442,6 @@ static const struct file_operations shmem_file_operations = {
};

static const struct inode_operations shmem_inode_operations = {
.truncate = shmem_truncate,
.setattr = shmem_notify_change,
.truncate_range = shmem_truncate_range,
#ifdef CONFIG_TMPFS_POSIX_ACL
Expand Down

0 comments on commit 3889e6e

Please sign in to comment.