hpfs: drop vmtruncate

Removed vmtruncate

Signed-off-by: Marco Stornelli <marco.stornelli@gmail.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Marco Stornelli 2012-12-15 11:53:50 +01:00 committed by Al Viro
parent c8cf464bc5
commit 70b31c4c88
3 changed files with 18 additions and 8 deletions

View File

@ -50,7 +50,7 @@ static secno hpfs_bmap(struct inode *inode, unsigned file_secno)
return disk_secno; return disk_secno;
} }
static void hpfs_truncate(struct inode *i) void hpfs_truncate(struct inode *i)
{ {
if (IS_IMMUTABLE(i)) return /*-EPERM*/; if (IS_IMMUTABLE(i)) return /*-EPERM*/;
hpfs_lock_assert(i->i_sb); hpfs_lock_assert(i->i_sb);
@ -105,6 +105,16 @@ static int hpfs_readpage(struct file *file, struct page *page)
return block_read_full_page(page,hpfs_get_block); return block_read_full_page(page,hpfs_get_block);
} }
static void hpfs_write_failed(struct address_space *mapping, loff_t to)
{
struct inode *inode = mapping->host;
if (to > inode->i_size) {
truncate_pagecache(inode, to, inode->i_size);
hpfs_truncate(inode);
}
}
static int hpfs_write_begin(struct file *file, struct address_space *mapping, static int hpfs_write_begin(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned flags, loff_t pos, unsigned len, unsigned flags,
struct page **pagep, void **fsdata) struct page **pagep, void **fsdata)
@ -115,11 +125,8 @@ static int hpfs_write_begin(struct file *file, struct address_space *mapping,
ret = cont_write_begin(file, mapping, pos, len, flags, pagep, fsdata, ret = cont_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
hpfs_get_block, hpfs_get_block,
&hpfs_i(mapping->host)->mmu_private); &hpfs_i(mapping->host)->mmu_private);
if (unlikely(ret)) { if (unlikely(ret))
loff_t isize = mapping->host->i_size; hpfs_write_failed(mapping, pos + len);
if (pos + len > isize)
vmtruncate(mapping->host, isize);
}
return ret; return ret;
} }
@ -166,6 +173,5 @@ const struct file_operations hpfs_file_ops =
const struct inode_operations hpfs_file_iops = const struct inode_operations hpfs_file_iops =
{ {
.truncate = hpfs_truncate,
.setattr = hpfs_setattr, .setattr = hpfs_setattr,
}; };

View File

@ -252,6 +252,7 @@ void hpfs_set_ea(struct inode *, struct fnode *, const char *,
/* file.c */ /* file.c */
int hpfs_file_fsync(struct file *, loff_t, loff_t, int); int hpfs_file_fsync(struct file *, loff_t, loff_t, int);
void hpfs_truncate(struct inode *);
extern const struct file_operations hpfs_file_ops; extern const struct file_operations hpfs_file_ops;
extern const struct inode_operations hpfs_file_iops; extern const struct inode_operations hpfs_file_iops;
extern const struct address_space_operations hpfs_aops; extern const struct address_space_operations hpfs_aops;

View File

@ -277,9 +277,12 @@ int hpfs_setattr(struct dentry *dentry, struct iattr *attr)
if ((attr->ia_valid & ATTR_SIZE) && if ((attr->ia_valid & ATTR_SIZE) &&
attr->ia_size != i_size_read(inode)) { attr->ia_size != i_size_read(inode)) {
error = vmtruncate(inode, attr->ia_size); error = inode_newsize_ok(inode, attr->ia_size);
if (error) if (error)
goto out_unlock; goto out_unlock;
truncate_setsize(inode, attr->ia_size);
hpfs_truncate(inode);
} }
setattr_copy(inode, attr); setattr_copy(inode, attr);