ANDROID: vfs: Add permission2 for filesystems with per mount permissions
This allows filesystems to use their mount private data to influence the permssions they return in permission2. It has been separated into a new call to avoid disrupting current permission users. Change-Id: I9d416e3b8b6eca84ef3e336bd2af89ddd51df6ca Signed-off-by: Daniel Rosenberg <drosen@google.com>
This commit is contained in:
committed by
Dmitry Shmidt
parent
2757e9bdf4
commit
bbcd0ffae5
@@ -73,10 +73,12 @@ int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
|
||||
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))
|
||||
@@ -88,7 +90,7 @@ long vfs_truncate(const struct path *path, loff_t length)
|
||||
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;
|
||||
|
||||
@@ -364,6 +366,7 @@ SYSCALL_DEFINE3(faccessat, int, dfd, const char __user *, filename, int, mode)
|
||||
struct cred *override_cred;
|
||||
struct path path;
|
||||
struct inode *inode;
|
||||
struct vfsmount *mnt;
|
||||
int res;
|
||||
unsigned int lookup_flags = LOOKUP_FOLLOW;
|
||||
|
||||
@@ -394,6 +397,7 @@ retry:
|
||||
goto out;
|
||||
|
||||
inode = d_backing_inode(path.dentry);
|
||||
mnt = path.mnt;
|
||||
|
||||
if ((mode & MAY_EXEC) && S_ISREG(inode->i_mode)) {
|
||||
/*
|
||||
@@ -405,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;
|
||||
@@ -449,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;
|
||||
|
||||
@@ -469,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;
|
||||
@@ -476,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:
|
||||
@@ -500,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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user