diff options
Diffstat (limited to 'fs/ufs/truncate.c')
-rw-r--r-- | fs/ufs/truncate.c | 30 |
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 | 503 | int 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 | */ | ||
511 | static 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 | ||
543 | const struct inode_operations ufs_file_inode_operations = { | 529 | const struct inode_operations ufs_file_inode_operations = { |