aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ufs/truncate.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ufs/truncate.c')
-rw-r--r--fs/ufs/truncate.c30
1 files changed, 8 insertions, 22 deletions
diff --git a/fs/ufs/truncate.c b/fs/ufs/truncate.c
index d3b6270cb377..34d5cb135320 100644
--- a/fs/ufs/truncate.c
+++ b/fs/ufs/truncate.c
@@ -44,7 +44,6 @@
44#include <linux/buffer_head.h> 44#include <linux/buffer_head.h>
45#include <linux/blkdev.h> 45#include <linux/blkdev.h>
46#include <linux/sched.h> 46#include <linux/sched.h>
47#include <linux/quotaops.h>
48 47
49#include "ufs_fs.h" 48#include "ufs_fs.h"
50#include "ufs.h" 49#include "ufs.h"
@@ -501,14 +500,7 @@ out:
501 return err; 500 return err;
502} 501}
503 502
504 503int ufs_setattr(struct dentry *dentry, struct iattr *attr)
505/*
506 * We don't define our `inode->i_op->truncate', and call it here,
507 * because of:
508 * - there is no way to know old size
509 * - there is no way inform user about error, if it happens in `truncate'
510 */
511static int ufs_setattr(struct dentry *dentry, struct iattr *attr)
512{ 504{
513 struct inode *inode = dentry->d_inode; 505 struct inode *inode = dentry->d_inode;
514 unsigned int ia_valid = attr->ia_valid; 506 unsigned int ia_valid = attr->ia_valid;
@@ -518,26 +510,20 @@ static int ufs_setattr(struct dentry *dentry, struct iattr *attr)
518 if (error) 510 if (error)
519 return error; 511 return error;
520 512
521 if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) || 513 if (ia_valid & ATTR_SIZE && attr->ia_size != inode->i_size) {
522 (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) {
523 error = dquot_transfer(inode, attr);
524 if (error)
525 return error;
526 }
527 if (ia_valid & ATTR_SIZE &&
528 attr->ia_size != i_size_read(inode)) {
529 loff_t old_i_size = inode->i_size; 514 loff_t old_i_size = inode->i_size;
530 515
531 dquot_initialize(inode); 516 /* XXX(truncate): truncate_setsize should be called last */
517 truncate_setsize(inode, attr->ia_size);
532 518
533 error = vmtruncate(inode, attr->ia_size);
534 if (error)
535 return error;
536 error = ufs_truncate(inode, old_i_size); 519 error = ufs_truncate(inode, old_i_size);
537 if (error) 520 if (error)
538 return error; 521 return error;
539 } 522 }
540 return inode_setattr(inode, attr); 523
524 setattr_copy(inode, attr);
525 mark_inode_dirty(inode);
526 return 0;
541} 527}
542 528
543const struct inode_operations ufs_file_inode_operations = { 529const struct inode_operations ufs_file_inode_operations = {