diff options
Diffstat (limited to 'fs/attr.c')
| -rw-r--r-- | fs/attr.c | 26 |
1 files changed, 9 insertions, 17 deletions
| @@ -10,11 +10,11 @@ | |||
| 10 | #include <linux/mm.h> | 10 | #include <linux/mm.h> |
| 11 | #include <linux/string.h> | 11 | #include <linux/string.h> |
| 12 | #include <linux/smp_lock.h> | 12 | #include <linux/smp_lock.h> |
| 13 | #include <linux/capability.h> | ||
| 13 | #include <linux/fsnotify.h> | 14 | #include <linux/fsnotify.h> |
| 14 | #include <linux/fcntl.h> | 15 | #include <linux/fcntl.h> |
| 15 | #include <linux/quotaops.h> | 16 | #include <linux/quotaops.h> |
| 16 | #include <linux/security.h> | 17 | #include <linux/security.h> |
| 17 | #include <linux/time.h> | ||
| 18 | 18 | ||
| 19 | /* Taken over from the old code... */ | 19 | /* Taken over from the old code... */ |
| 20 | 20 | ||
| @@ -67,20 +67,12 @@ EXPORT_SYMBOL(inode_change_ok); | |||
| 67 | int inode_setattr(struct inode * inode, struct iattr * attr) | 67 | int inode_setattr(struct inode * inode, struct iattr * attr) |
| 68 | { | 68 | { |
| 69 | unsigned int ia_valid = attr->ia_valid; | 69 | unsigned int ia_valid = attr->ia_valid; |
| 70 | int error = 0; | 70 | |
| 71 | 71 | if (ia_valid & ATTR_SIZE && | |
| 72 | if (ia_valid & ATTR_SIZE) { | 72 | attr->ia_size != i_size_read(inode)) { |
| 73 | if (attr->ia_size != i_size_read(inode)) { | 73 | int error = vmtruncate(inode, attr->ia_size); |
| 74 | error = vmtruncate(inode, attr->ia_size); | 74 | if (error) |
| 75 | if (error || (ia_valid == ATTR_SIZE)) | 75 | return error; |
| 76 | goto out; | ||
| 77 | } else { | ||
| 78 | /* | ||
| 79 | * We skipped the truncate but must still update | ||
| 80 | * timestamps | ||
| 81 | */ | ||
| 82 | ia_valid |= ATTR_MTIME|ATTR_CTIME; | ||
| 83 | } | ||
| 84 | } | 76 | } |
| 85 | 77 | ||
| 86 | if (ia_valid & ATTR_UID) | 78 | if (ia_valid & ATTR_UID) |
| @@ -104,8 +96,8 @@ int inode_setattr(struct inode * inode, struct iattr * attr) | |||
| 104 | inode->i_mode = mode; | 96 | inode->i_mode = mode; |
| 105 | } | 97 | } |
| 106 | mark_inode_dirty(inode); | 98 | mark_inode_dirty(inode); |
| 107 | out: | 99 | |
| 108 | return error; | 100 | return 0; |
| 109 | } | 101 | } |
| 110 | EXPORT_SYMBOL(inode_setattr); | 102 | EXPORT_SYMBOL(inode_setattr); |
| 111 | 103 | ||
