| From: Ian Kent <raven@themaw.net> |
| Subject: autofs: use inode permission method for write access |
| Date: Fri, 08 Jul 2022 09:43:01 +0800 |
| |
| Patch series "autofs: misc patches". |
| |
| This series contains several patches that resulted mostly from comments |
| made by Al Viro (quite a long time ago now). |
| |
| |
| This patch (of 5): |
| |
| Eliminate some code duplication from mkdir/rmdir/symlink/unlink methods by |
| using the inode operation .permission(). |
| |
| Link: https://lkml.kernel.org/r/165724445154.30914.10970894936827635879.stgit@donald.themaw.net |
| Link: https://lkml.kernel.org/r/165724458096.30914.13499431569758625806.stgit@donald.themaw.net |
| Signed-off-by: Ian Kent <raven@themaw.net> |
| Cc: Al Viro <viro@ZenIV.linux.org.uk> |
| Cc: David Howells <dhowells@redhat.com> |
| Cc: Miklos Szeredi <miklos@szeredi.hu> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| fs/autofs/root.c | 63 +++++++++++++++------------------------------ |
| 1 file changed, 22 insertions(+), 41 deletions(-) |
| |
| --- a/fs/autofs/root.c~autofs-use-inode-permission-method-for-write-access |
| +++ a/fs/autofs/root.c |
| @@ -10,6 +10,7 @@ |
| |
| #include "autofs_i.h" |
| |
| +static int autofs_dir_permission(struct user_namespace *, struct inode *, int); |
| static int autofs_dir_symlink(struct user_namespace *, struct inode *, |
| struct dentry *, const char *); |
| static int autofs_dir_unlink(struct inode *, struct dentry *); |
| @@ -50,6 +51,7 @@ const struct file_operations autofs_dir_ |
| |
| const struct inode_operations autofs_dir_inode_operations = { |
| .lookup = autofs_lookup, |
| + .permission = autofs_dir_permission, |
| .unlink = autofs_dir_unlink, |
| .symlink = autofs_dir_symlink, |
| .mkdir = autofs_dir_mkdir, |
| @@ -526,11 +528,30 @@ static struct dentry *autofs_lookup(stru |
| return NULL; |
| } |
| |
| +static int autofs_dir_permission(struct user_namespace *mnt_userns, |
| + struct inode *inode, int mask) |
| +{ |
| + if (mask & MAY_WRITE) { |
| + struct autofs_sb_info *sbi = autofs_sbi(inode->i_sb); |
| + |
| + if (!autofs_oz_mode(sbi)) |
| + return -EACCES; |
| + |
| + /* autofs_oz_mode() needs to allow path walks when the |
| + * autofs mount is catatonic but the state of an autofs |
| + * file system needs to be preserved over restarts. |
| + */ |
| + if (sbi->flags & AUTOFS_SBI_CATATONIC) |
| + return -EACCES; |
| + } |
| + |
| + return generic_permission(mnt_userns, inode, mask); |
| +} |
| + |
| static int autofs_dir_symlink(struct user_namespace *mnt_userns, |
| struct inode *dir, struct dentry *dentry, |
| const char *symname) |
| { |
| - struct autofs_sb_info *sbi = autofs_sbi(dir->i_sb); |
| struct autofs_info *ino = autofs_dentry_ino(dentry); |
| struct autofs_info *p_ino; |
| struct inode *inode; |
| @@ -539,16 +560,6 @@ static int autofs_dir_symlink(struct use |
| |
| pr_debug("%s <- %pd\n", symname, dentry); |
| |
| - if (!autofs_oz_mode(sbi)) |
| - return -EACCES; |
| - |
| - /* autofs_oz_mode() needs to allow path walks when the |
| - * autofs mount is catatonic but the state of an autofs |
| - * file system needs to be preserved over restarts. |
| - */ |
| - if (sbi->flags & AUTOFS_SBI_CATATONIC) |
| - return -EACCES; |
| - |
| BUG_ON(!ino); |
| |
| autofs_clean_ino(ino); |
| @@ -601,16 +612,6 @@ static int autofs_dir_unlink(struct inod |
| struct autofs_info *ino = autofs_dentry_ino(dentry); |
| struct autofs_info *p_ino; |
| |
| - if (!autofs_oz_mode(sbi)) |
| - return -EACCES; |
| - |
| - /* autofs_oz_mode() needs to allow path walks when the |
| - * autofs mount is catatonic but the state of an autofs |
| - * file system needs to be preserved over restarts. |
| - */ |
| - if (sbi->flags & AUTOFS_SBI_CATATONIC) |
| - return -EACCES; |
| - |
| ino->count--; |
| p_ino = autofs_dentry_ino(dentry->d_parent); |
| p_ino->count--; |
| @@ -683,16 +684,6 @@ static int autofs_dir_rmdir(struct inode |
| |
| pr_debug("dentry %p, removing %pd\n", dentry, dentry); |
| |
| - if (!autofs_oz_mode(sbi)) |
| - return -EACCES; |
| - |
| - /* autofs_oz_mode() needs to allow path walks when the |
| - * autofs mount is catatonic but the state of an autofs |
| - * file system needs to be preserved over restarts. |
| - */ |
| - if (sbi->flags & AUTOFS_SBI_CATATONIC) |
| - return -EACCES; |
| - |
| if (ino->count != 1) |
| return -ENOTEMPTY; |
| |
| @@ -726,16 +717,6 @@ static int autofs_dir_mkdir(struct user_ |
| struct autofs_info *p_ino; |
| struct inode *inode; |
| |
| - if (!autofs_oz_mode(sbi)) |
| - return -EACCES; |
| - |
| - /* autofs_oz_mode() needs to allow path walks when the |
| - * autofs mount is catatonic but the state of an autofs |
| - * file system needs to be preserved over restarts. |
| - */ |
| - if (sbi->flags & AUTOFS_SBI_CATATONIC) |
| - return -EACCES; |
| - |
| pr_debug("dentry %p, creating %pd\n", dentry, dentry); |
| |
| BUG_ON(!ino); |
| _ |