Currently filesystems return -EACCES for missing ->create and -EPERM for missing ->mkdir in vfs_create/vfs_mkdir. Instead of duplicating these dubious and inconsistent error codes to lookup_open(), change all to -EOPNOTSUPP. Signed-off-by: Jori Koolstra --- fs/namei.c | 14 +++++--------- include/uapi/asm-generic/errno.h | 2 +- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 6ff0a3c04f02..f31046f8b3ba 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -4224,7 +4224,7 @@ int vfs_create(struct mnt_idmap *idmap, struct dentry *dentry, umode_t mode, return error; if (!dir->i_op->create) - return -EACCES; /* shouldn't it be ENOSYS? */ + return -EOPNOTSUPP; mode = vfs_prepare_mode(idmap, dir, mode, S_IALLUGO, S_IFREG); error = security_inode_create(dir, dentry, mode); @@ -4646,13 +4646,9 @@ static struct dentry *lookup_open(struct nameidata *nd, struct file *file, goto out_dput; } - /* mimic operation missing errnos of vfs_mkdir/vfs_create */ - if (create_dir && !dir_inode->i_op->mkdir) { - error = -EPERM; - goto out_dput; - } - if (!create_dir && !dir_inode->i_op->create) { - error = -EACCES; + if ((create_dir && !dir_inode->i_op->mkdir) + || (!create_dir && !dir_inode->i_op->create)) { + error = -EOPNOTSUPP; goto out_dput; } @@ -5501,7 +5497,7 @@ struct dentry *vfs_mkdir(struct mnt_idmap *idmap, struct inode *dir, if (error) goto err; - error = -EPERM; + error = -EOPNOTSUPP; if (!dir->i_op->mkdir) goto err; diff --git a/include/uapi/asm-generic/errno.h b/include/uapi/asm-generic/errno.h index bd78e69e0a43..c84ebf89c8b6 100644 --- a/include/uapi/asm-generic/errno.h +++ b/include/uapi/asm-generic/errno.h @@ -76,7 +76,7 @@ #define ENOPROTOOPT 92 /* Protocol not available */ #define EPROTONOSUPPORT 93 /* Protocol not supported */ #define ESOCKTNOSUPPORT 94 /* Socket type not supported */ -#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ +#define EOPNOTSUPP 95 /* Operation not supported */ #define EPFNOSUPPORT 96 /* Protocol family not supported */ #define EAFNOSUPPORT 97 /* Address family not supported by protocol */ #define EADDRINUSE 98 /* Address already in use */ -- 2.55.0