diff --git a/inode.c b/inode.c index 48ed3e4..9d37593 100644 --- a/inode.c +++ b/inode.c @@ -195,7 +195,9 @@ static struct inode *simplefs_new_inode(struct inode *dir, mode_t mode) } if (S_ISLNK(mode)) { -#if USER_NS_REQUIRED() +#if MNT_IDMAP_REQUIRED() + inode_init_owner(&nop_mnt_idmap, inode, dir, inode->mode); +#elif USER_NS_REQUIRED() inode_init_owner(&init_user_ns, inode, dir, mode); #else inode_init_owner(inode, dir, mode); @@ -216,7 +218,9 @@ static struct inode *simplefs_new_inode(struct inode *dir, mode_t mode) } /* Initialize inode */ -#if USER_NS_REQUIRED() +#if MNT_IDMAP_REQUIRED() + inode_init_owner(&nop_mnt_idmap, inode, dir, inode->mode); +#elif USER_NS_REQUIRED() inode_init_owner(&init_user_ns, inode, dir, mode); #else inode_init_owner(inode, dir, mode); @@ -254,7 +258,13 @@ static struct inode *simplefs_new_inode(struct inode *dir, mode_t mode) * - cleanup index block of the new inode * - add new file/directory in parent index */ -#if USER_NS_REQUIRED() +#if MNT_IDMAP_REQUIRED() +static int simplefs_create(struct mnt_idmap *id, + struct inode *dir, + struct dentry *dentry, + umode_t mode, + bool excl) +#elif USER_NS_REQUIRED() static int simplefs_create(struct user_namespace *ns, struct inode *dir, struct dentry *dentry, @@ -555,7 +565,14 @@ static int simplefs_unlink(struct inode *dir, struct dentry *dentry) return ret; } -#if USER_NS_REQUIRED() +#if MNT_IDMAP_REQUIRED() +static int simplefs_rename(struct mnt_idmap *id, + struct inode *old_dir, + struct dentry *old_dentry, + struct inode *new_dir, + struct dentry *new_dentry, + unsigned int flags) +#elif USER_NS_REQUIRED() static int simplefs_rename(struct user_namespace *ns, struct inode *old_dir, struct dentry *old_dentry, @@ -699,7 +716,15 @@ static int simplefs_rename(struct inode *old_dir, return ret; } -#if USER_NS_REQUIRED() +#if MNT_IDMAP_REQUIRED() +static int simplefs_mkdir(struct mnt_idmap *id, + struct inode *dir, + struct dentry *dentry, + umode_t mode) +{ + return simplefs_create(id, dir, dentry, mode | S_IFDIR, 0); +} +#elif USER_NS_REQUIRED() static int simplefs_mkdir(struct user_namespace *ns, struct inode *dir, struct dentry *dentry, @@ -815,7 +840,12 @@ static int simplefs_link(struct dentry *old_dentry, return ret; } -#if USER_NS_REQUIRED() +#if MNT_IDMAP_REQUIRED() +static int simplefs_symlink(struct mnt_idmap *id, + struct inode *dir, + struct dentry *dentry, + const char *symname) +#elif USER_NS_REQUIRED() static int simplefs_symlink(struct user_namespace *ns, struct inode *dir, struct dentry *dentry, diff --git a/simplefs.h b/simplefs.h index 3b08cdb..0e8ada5 100644 --- a/simplefs.h +++ b/simplefs.h @@ -27,6 +27,7 @@ #include #define USER_NS_REQUIRED() LINUX_VERSION_CODE >= KERNEL_VERSION(5,12,0) +#define MNT_IDMAP_REQUIRED() LINUX_VERSION_CODE >= KERNEL_VERSION(6,3,0) /* * simplefs partition layout diff --git a/super.c b/super.c index d22b6f7..d4be171 100644 --- a/super.c +++ b/super.c @@ -282,7 +282,10 @@ int simplefs_fill_super(struct super_block *sb, void *data, int silent) ret = PTR_ERR(root_inode); goto free_bfree; } -#if USER_NS_REQUIRED() + +#if MNT_IDMAP_REQUIRED() + inode_init_owner(&nop_mnt_idmap, root_inode, NULL, root_inode->i_mode); +#elif USER_NS_REQUIRED() inode_init_owner(&init_user_ns, root_inode, NULL, root_inode->i_mode); #else inode_init_owner(root_inode, NULL, root_inode->i_mode);