|
@@ -199,7 +199,7 @@ out:
|
|
|
int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
|
|
|
struct file *filp)
|
|
|
{
|
|
|
- int err;
|
|
|
+ int ret;
|
|
|
struct iattr newattrs;
|
|
|
|
|
|
/* Not pretty: "inode->i_size" shouldn't really be signed. But it is. */
|
|
@@ -214,12 +214,14 @@ int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
|
|
|
}
|
|
|
|
|
|
/* Remove suid/sgid on truncate too */
|
|
|
- newattrs.ia_valid |= should_remove_suid(dentry);
|
|
|
+ ret = should_remove_suid(dentry);
|
|
|
+ if (ret)
|
|
|
+ newattrs.ia_valid |= ret | ATTR_FORCE;
|
|
|
|
|
|
mutex_lock(&dentry->d_inode->i_mutex);
|
|
|
- err = notify_change(dentry, &newattrs);
|
|
|
+ ret = notify_change(dentry, &newattrs);
|
|
|
mutex_unlock(&dentry->d_inode->i_mutex);
|
|
|
- return err;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static long do_sys_truncate(const char __user *pathname, loff_t length)
|