|
@@ -68,7 +68,6 @@ int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
|
|
long vfs_truncate(const struct path *path, loff_t length)
|
|
long vfs_truncate(const struct path *path, loff_t length)
|
|
{
|
|
{
|
|
struct inode *inode;
|
|
struct inode *inode;
|
|
- struct dentry *upperdentry;
|
|
|
|
long error;
|
|
long error;
|
|
|
|
|
|
inode = path->dentry->d_inode;
|
|
inode = path->dentry->d_inode;
|
|
@@ -91,17 +90,7 @@ long vfs_truncate(const struct path *path, loff_t length)
|
|
if (IS_APPEND(inode))
|
|
if (IS_APPEND(inode))
|
|
goto mnt_drop_write_and_out;
|
|
goto mnt_drop_write_and_out;
|
|
|
|
|
|
- /*
|
|
|
|
- * If this is an overlayfs then do as if opening the file so we get
|
|
|
|
- * write access on the upper inode, not on the overlay inode. For
|
|
|
|
- * non-overlay filesystems d_real() is an identity function.
|
|
|
|
- */
|
|
|
|
- upperdentry = d_real(path->dentry, NULL, O_WRONLY);
|
|
|
|
- error = PTR_ERR(upperdentry);
|
|
|
|
- if (IS_ERR(upperdentry))
|
|
|
|
- goto mnt_drop_write_and_out;
|
|
|
|
-
|
|
|
|
- error = get_write_access(upperdentry->d_inode);
|
|
|
|
|
|
+ error = get_write_access(inode);
|
|
if (error)
|
|
if (error)
|
|
goto mnt_drop_write_and_out;
|
|
goto mnt_drop_write_and_out;
|
|
|
|
|
|
@@ -120,7 +109,7 @@ long vfs_truncate(const struct path *path, loff_t length)
|
|
error = do_truncate(path->dentry, length, 0, NULL);
|
|
error = do_truncate(path->dentry, length, 0, NULL);
|
|
|
|
|
|
put_write_and_out:
|
|
put_write_and_out:
|
|
- put_write_access(upperdentry->d_inode);
|
|
|
|
|
|
+ put_write_access(inode);
|
|
mnt_drop_write_and_out:
|
|
mnt_drop_write_and_out:
|
|
mnt_drop_write(path->mnt);
|
|
mnt_drop_write(path->mnt);
|
|
out:
|
|
out:
|