mirror of https://github.com/OpenIPC/firmware.git
169 lines
4.9 KiB
Diff
169 lines
4.9 KiB
Diff
diff -drupN a/fs/open.c b/fs/open.c
|
|
--- a/fs/open.c 2018-08-06 17:23:04.000000000 +0300
|
|
+++ b/fs/open.c 2022-06-12 05:28:14.000000000 +0300
|
|
@@ -34,8 +34,8 @@
|
|
|
|
#include "internal.h"
|
|
|
|
-int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
|
|
- struct file *filp)
|
|
+int do_truncate2(struct vfsmount *mnt, struct dentry *dentry, loff_t length,
|
|
+ unsigned int time_attrs, struct file *filp)
|
|
{
|
|
int ret;
|
|
struct iattr newattrs;
|
|
@@ -60,18 +60,25 @@ int do_truncate(struct dentry *dentry, l
|
|
|
|
inode_lock(dentry->d_inode);
|
|
/* Note any delegations or leases have already been broken: */
|
|
- ret = notify_change(dentry, &newattrs, NULL);
|
|
+ ret = notify_change2(mnt, dentry, &newattrs, NULL);
|
|
inode_unlock(dentry->d_inode);
|
|
return ret;
|
|
}
|
|
+int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
|
|
+ struct file *filp)
|
|
+{
|
|
+ return do_truncate2(NULL, dentry, length, time_attrs, filp);
|
|
+}
|
|
|
|
long vfs_truncate(const struct path *path, loff_t length)
|
|
{
|
|
struct inode *inode;
|
|
+ struct vfsmount *mnt;
|
|
struct dentry *upperdentry;
|
|
long error;
|
|
|
|
inode = path->dentry->d_inode;
|
|
+ mnt = path->mnt;
|
|
|
|
/* For directories it's -EISDIR, for other non-regulars - -EINVAL */
|
|
if (S_ISDIR(inode->i_mode))
|
|
@@ -83,7 +90,7 @@ long vfs_truncate(const struct path *pat
|
|
if (error)
|
|
goto out;
|
|
|
|
- error = inode_permission(inode, MAY_WRITE);
|
|
+ error = inode_permission2(mnt, inode, MAY_WRITE);
|
|
if (error)
|
|
goto mnt_drop_write_and_out;
|
|
|
|
@@ -117,7 +124,7 @@ long vfs_truncate(const struct path *pat
|
|
if (!error)
|
|
error = security_path_truncate(path);
|
|
if (!error)
|
|
- error = do_truncate(path->dentry, length, 0, NULL);
|
|
+ error = do_truncate2(mnt, path->dentry, length, 0, NULL);
|
|
|
|
put_write_and_out:
|
|
put_write_access(upperdentry->d_inode);
|
|
@@ -166,6 +173,7 @@ static long do_sys_ftruncate(unsigned in
|
|
{
|
|
struct inode *inode;
|
|
struct dentry *dentry;
|
|
+ struct vfsmount *mnt;
|
|
struct fd f;
|
|
int error;
|
|
|
|
@@ -182,6 +190,7 @@ static long do_sys_ftruncate(unsigned in
|
|
small = 0;
|
|
|
|
dentry = f.file->f_path.dentry;
|
|
+ mnt = f.file->f_path.mnt;
|
|
inode = dentry->d_inode;
|
|
error = -EINVAL;
|
|
if (!S_ISREG(inode->i_mode) || !(f.file->f_mode & FMODE_WRITE))
|
|
@@ -201,7 +210,7 @@ static long do_sys_ftruncate(unsigned in
|
|
if (!error)
|
|
error = security_path_truncate(&f.file->f_path);
|
|
if (!error)
|
|
- error = do_truncate(dentry, length, ATTR_MTIME|ATTR_CTIME, f.file);
|
|
+ error = do_truncate2(mnt, dentry, length, ATTR_MTIME|ATTR_CTIME, f.file);
|
|
sb_end_write(inode->i_sb);
|
|
out_putf:
|
|
fdput(f);
|
|
@@ -357,6 +366,7 @@ SYSCALL_DEFINE3(faccessat, int, dfd, con
|
|
struct cred *override_cred;
|
|
struct path path;
|
|
struct inode *inode;
|
|
+ struct vfsmount *mnt;
|
|
int res;
|
|
unsigned int lookup_flags = LOOKUP_FOLLOW;
|
|
|
|
@@ -387,6 +397,7 @@ retry:
|
|
goto out;
|
|
|
|
inode = d_backing_inode(path.dentry);
|
|
+ mnt = path.mnt;
|
|
|
|
if ((mode & MAY_EXEC) && S_ISREG(inode->i_mode)) {
|
|
/*
|
|
@@ -398,7 +409,7 @@ retry:
|
|
goto out_path_release;
|
|
}
|
|
|
|
- res = inode_permission(inode, mode | MAY_ACCESS);
|
|
+ res = inode_permission2(mnt, inode, mode | MAY_ACCESS);
|
|
/* SuS v2 requires we report a read only fs too */
|
|
if (res || !(mode & S_IWOTH) || special_file(inode->i_mode))
|
|
goto out_path_release;
|
|
@@ -442,7 +453,7 @@ retry:
|
|
if (error)
|
|
goto out;
|
|
|
|
- error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_CHDIR);
|
|
+ error = inode_permission2(path.mnt, path.dentry->d_inode, MAY_EXEC | MAY_CHDIR);
|
|
if (error)
|
|
goto dput_and_out;
|
|
|
|
@@ -462,6 +473,7 @@ SYSCALL_DEFINE1(fchdir, unsigned int, fd
|
|
{
|
|
struct fd f = fdget_raw(fd);
|
|
struct inode *inode;
|
|
+ struct vfsmount *mnt;
|
|
int error = -EBADF;
|
|
|
|
error = -EBADF;
|
|
@@ -469,12 +481,13 @@ SYSCALL_DEFINE1(fchdir, unsigned int, fd
|
|
goto out;
|
|
|
|
inode = file_inode(f.file);
|
|
+ mnt = f.file->f_path.mnt;
|
|
|
|
error = -ENOTDIR;
|
|
if (!S_ISDIR(inode->i_mode))
|
|
goto out_putf;
|
|
|
|
- error = inode_permission(inode, MAY_EXEC | MAY_CHDIR);
|
|
+ error = inode_permission2(mnt, inode, MAY_EXEC | MAY_CHDIR);
|
|
if (!error)
|
|
set_fs_pwd(current->fs, &f.file->f_path);
|
|
out_putf:
|
|
@@ -493,7 +506,7 @@ retry:
|
|
if (error)
|
|
goto out;
|
|
|
|
- error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_CHDIR);
|
|
+ error = inode_permission2(path.mnt, path.dentry->d_inode, MAY_EXEC | MAY_CHDIR);
|
|
if (error)
|
|
goto dput_and_out;
|
|
|
|
@@ -533,7 +546,7 @@ retry_deleg:
|
|
goto out_unlock;
|
|
newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
|
|
newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
|
|
- error = notify_change(path->dentry, &newattrs, &delegated_inode);
|
|
+ error = notify_change2(path->mnt, path->dentry, &newattrs, &delegated_inode);
|
|
out_unlock:
|
|
inode_unlock(inode);
|
|
if (delegated_inode) {
|
|
@@ -613,7 +626,7 @@ retry_deleg:
|
|
inode_lock(inode);
|
|
error = security_path_chown(path, uid, gid);
|
|
if (!error)
|
|
- error = notify_change(path->dentry, &newattrs, &delegated_inode);
|
|
+ error = notify_change2(path->mnt, path->dentry, &newattrs, &delegated_inode);
|
|
inode_unlock(inode);
|
|
if (delegated_inode) {
|
|
error = break_deleg_wait(&delegated_inode);
|