public inbox for linux-btrfs@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/4] btrfs: stop duplicating VFS code for subvolume/snapshot dentry
@ 2026-01-13 12:39 fdmanana
  2026-01-13 12:39 ` [PATCH v2 1/4] fs: export may_delete() as may_delete_dentry() fdmanana
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: fdmanana @ 2026-01-13 12:39 UTC (permalink / raw)
  To: linux-btrfs; +Cc: linux-fsdevel, brauner, viro, dsterba, Filipe Manana

From: Filipe Manana <fdmanana@suse.com>

Currently btrfs has copies of two unexported functions from fs/namei.c
used in the snapshot/subvolume creation and deletion. This patchset
exports those functions and makes btrfs use them, to avoid duplication
and the burden of keeping the copies up to date.

V2: Updated changelog of patch 4/4 to mention the btrfs copy misses a
    call to audit_inode_child().

Link to V1: https://lore.kernel.org/linux-btrfs/cover.1767801889.git.fdmanana@suse.com/

Filipe Manana (4):
  fs: export may_delete() as may_delete_dentry()
  fs: export may_create() as may_create_dentry()
  btrfs: use may_delete_dentry() in btrfs_ioctl_snap_destroy()
  btrfs: use may_create_dentry() in btrfs_mksubvol()

 fs/btrfs/ioctl.c   | 73 ++--------------------------------------------
 fs/namei.c         | 36 ++++++++++++-----------
 include/linux/fs.h |  5 ++++
 3 files changed, 26 insertions(+), 88 deletions(-)

-- 
2.47.2


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v2 1/4] fs: export may_delete() as may_delete_dentry()
  2026-01-13 12:39 [PATCH v2 0/4] btrfs: stop duplicating VFS code for subvolume/snapshot dentry fdmanana
@ 2026-01-13 12:39 ` fdmanana
  2026-01-13 12:39 ` [PATCH v2 2/4] fs: export may_create() as may_create_dentry() fdmanana
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: fdmanana @ 2026-01-13 12:39 UTC (permalink / raw)
  To: linux-btrfs; +Cc: linux-fsdevel, brauner, viro, dsterba, Filipe Manana

From: Filipe Manana <fdmanana@suse.com>

For many years btrfs as been using a copy of may_delete() in
fs/btrfs/ioctl.c:btrfs_may_delete(). Everytime may_delete() is updated we
need to update the btrfs copy, and this is a maintenance burden. Currently
there are minor differences between both because the btrfs side lacks
updates done in may_delete().

Export may_delete() so that btrfs can use it and with the less generic
name may_delete_dentry(). While at it change the calls in vfs_rmdir() to
pass a boolean literal instead of 1 and 0 as the last argument since the
argument has a bool type.

Signed-off-by: Filipe Manana <fdmanana@suse.com>
---
 fs/namei.c         | 17 +++++++++--------
 include/linux/fs.h |  3 +++
 2 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/fs/namei.c b/fs/namei.c
index bf0f66f0e9b9..28aebc786e8f 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -3604,7 +3604,7 @@ EXPORT_SYMBOL(__check_sticky);
  * 11. We don't allow removal of NFS sillyrenamed files; it's handled by
  *     nfs_async_unlink().
  */
-static int may_delete(struct mnt_idmap *idmap, struct inode *dir,
+int may_delete_dentry(struct mnt_idmap *idmap, struct inode *dir,
 		      struct dentry *victim, bool isdir)
 {
 	struct inode *inode = d_backing_inode(victim);
@@ -3646,6 +3646,7 @@ static int may_delete(struct mnt_idmap *idmap, struct inode *dir,
 		return -EBUSY;
 	return 0;
 }
+EXPORT_SYMBOL(may_delete_dentry);
 
 /*	Check whether we can create an object with dentry child in directory
  *  dir.
@@ -5209,7 +5210,7 @@ SYSCALL_DEFINE2(mkdir, const char __user *, pathname, umode_t, mode)
 int vfs_rmdir(struct mnt_idmap *idmap, struct inode *dir,
 	      struct dentry *dentry, struct delegated_inode *delegated_inode)
 {
-	int error = may_delete(idmap, dir, dentry, 1);
+	int error = may_delete_dentry(idmap, dir, dentry, true);
 
 	if (error)
 		return error;
@@ -5344,7 +5345,7 @@ int vfs_unlink(struct mnt_idmap *idmap, struct inode *dir,
 	       struct dentry *dentry, struct delegated_inode *delegated_inode)
 {
 	struct inode *target = dentry->d_inode;
-	int error = may_delete(idmap, dir, dentry, 0);
+	int error = may_delete_dentry(idmap, dir, dentry, false);
 
 	if (error)
 		return error;
@@ -5816,7 +5817,7 @@ int vfs_rename(struct renamedata *rd)
 	if (source == target)
 		return 0;
 
-	error = may_delete(rd->mnt_idmap, old_dir, old_dentry, is_dir);
+	error = may_delete_dentry(rd->mnt_idmap, old_dir, old_dentry, is_dir);
 	if (error)
 		return error;
 
@@ -5826,11 +5827,11 @@ int vfs_rename(struct renamedata *rd)
 		new_is_dir = d_is_dir(new_dentry);
 
 		if (!(flags & RENAME_EXCHANGE))
-			error = may_delete(rd->mnt_idmap, new_dir,
-					   new_dentry, is_dir);
+			error = may_delete_dentry(rd->mnt_idmap, new_dir,
+						  new_dentry, is_dir);
 		else
-			error = may_delete(rd->mnt_idmap, new_dir,
-					   new_dentry, new_is_dir);
+			error = may_delete_dentry(rd->mnt_idmap, new_dir,
+						  new_dentry, new_is_dir);
 	}
 	if (error)
 		return error;
diff --git a/include/linux/fs.h b/include/linux/fs.h
index f5c9cf28c4dc..319aaeb876fd 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2657,6 +2657,9 @@ static inline int path_permission(const struct path *path, int mask)
 int __check_sticky(struct mnt_idmap *idmap, struct inode *dir,
 		   struct inode *inode);
 
+int may_delete_dentry(struct mnt_idmap *idmap, struct inode *dir,
+		      struct dentry *victim, bool isdir);
+
 static inline bool execute_ok(struct inode *inode)
 {
 	return (inode->i_mode & S_IXUGO) || S_ISDIR(inode->i_mode);
-- 
2.47.2


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 2/4] fs: export may_create() as may_create_dentry()
  2026-01-13 12:39 [PATCH v2 0/4] btrfs: stop duplicating VFS code for subvolume/snapshot dentry fdmanana
  2026-01-13 12:39 ` [PATCH v2 1/4] fs: export may_delete() as may_delete_dentry() fdmanana
@ 2026-01-13 12:39 ` fdmanana
  2026-01-13 12:39 ` [PATCH v2 3/4] btrfs: use may_delete_dentry() in btrfs_ioctl_snap_destroy() fdmanana
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: fdmanana @ 2026-01-13 12:39 UTC (permalink / raw)
  To: linux-btrfs; +Cc: linux-fsdevel, brauner, viro, dsterba, Filipe Manana

From: Filipe Manana <fdmanana@suse.com>

For many years btrfs as been using a copy of may_create() in
fs/btrfs/ioctl.c:btrfs_may_create(). Everytime may_create() is updated we
need to update the btrfs copy, and this is a maintenance burden. Currently
there are minor differences between both because the btrfs side lacks
updates done in may_create().

Export may_create() so that btrfs can use it and with the less generic
name may_create_dentry().

Signed-off-by: Filipe Manana <fdmanana@suse.com>
---
 fs/namei.c         | 19 ++++++++++---------
 include/linux/fs.h |  2 ++
 2 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/fs/namei.c b/fs/namei.c
index 28aebc786e8f..676b8c016839 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -3657,8 +3657,8 @@ EXPORT_SYMBOL(may_delete_dentry);
  *  4. We should have write and exec permissions on dir
  *  5. We can't do it if dir is immutable (done in permission())
  */
-static inline int may_create(struct mnt_idmap *idmap,
-			     struct inode *dir, struct dentry *child)
+int may_create_dentry(struct mnt_idmap *idmap,
+		      struct inode *dir, struct dentry *child)
 {
 	audit_inode_child(dir, child, AUDIT_TYPE_CHILD_CREATE);
 	if (child->d_inode)
@@ -3670,6 +3670,7 @@ static inline int may_create(struct mnt_idmap *idmap,
 
 	return inode_permission(idmap, dir, MAY_WRITE | MAY_EXEC);
 }
+EXPORT_SYMBOL(may_create_dentry);
 
 // p1 != p2, both are on the same filesystem, ->s_vfs_rename_mutex is held
 static struct dentry *lock_two_directories(struct dentry *p1, struct dentry *p2)
@@ -4116,7 +4117,7 @@ int vfs_create(struct mnt_idmap *idmap, struct dentry *dentry, umode_t mode,
 	struct inode *dir = d_inode(dentry->d_parent);
 	int error;
 
-	error = may_create(idmap, dir, dentry);
+	error = may_create_dentry(idmap, dir, dentry);
 	if (error)
 		return error;
 
@@ -4142,7 +4143,7 @@ int vfs_mkobj(struct dentry *dentry, umode_t mode,
 		void *arg)
 {
 	struct inode *dir = dentry->d_parent->d_inode;
-	int error = may_create(&nop_mnt_idmap, dir, dentry);
+	int error = may_create_dentry(&nop_mnt_idmap, dir, dentry);
 	if (error)
 		return error;
 
@@ -4961,7 +4962,7 @@ int vfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
 	      struct delegated_inode *delegated_inode)
 {
 	bool is_whiteout = S_ISCHR(mode) && dev == WHITEOUT_DEV;
-	int error = may_create(idmap, dir, dentry);
+	int error = may_create_dentry(idmap, dir, dentry);
 
 	if (error)
 		return error;
@@ -5107,7 +5108,7 @@ struct dentry *vfs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
 	unsigned max_links = dir->i_sb->s_max_links;
 	struct dentry *de;
 
-	error = may_create(idmap, dir, dentry);
+	error = may_create_dentry(idmap, dir, dentry);
 	if (error)
 		goto err;
 
@@ -5497,7 +5498,7 @@ int vfs_symlink(struct mnt_idmap *idmap, struct inode *dir,
 {
 	int error;
 
-	error = may_create(idmap, dir, dentry);
+	error = may_create_dentry(idmap, dir, dentry);
 	if (error)
 		return error;
 
@@ -5605,7 +5606,7 @@ int vfs_link(struct dentry *old_dentry, struct mnt_idmap *idmap,
 	if (!inode)
 		return -ENOENT;
 
-	error = may_create(idmap, dir, new_dentry);
+	error = may_create_dentry(idmap, dir, new_dentry);
 	if (error)
 		return error;
 
@@ -5822,7 +5823,7 @@ int vfs_rename(struct renamedata *rd)
 		return error;
 
 	if (!target) {
-		error = may_create(rd->mnt_idmap, new_dir, new_dentry);
+		error = may_create_dentry(rd->mnt_idmap, new_dir, new_dentry);
 	} else {
 		new_is_dir = d_is_dir(new_dentry);
 
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 319aaeb876fd..558056e1e843 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2659,6 +2659,8 @@ int __check_sticky(struct mnt_idmap *idmap, struct inode *dir,
 
 int may_delete_dentry(struct mnt_idmap *idmap, struct inode *dir,
 		      struct dentry *victim, bool isdir);
+int may_create_dentry(struct mnt_idmap *idmap,
+		      struct inode *dir, struct dentry *child);
 
 static inline bool execute_ok(struct inode *inode)
 {
-- 
2.47.2


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 3/4] btrfs: use may_delete_dentry() in btrfs_ioctl_snap_destroy()
  2026-01-13 12:39 [PATCH v2 0/4] btrfs: stop duplicating VFS code for subvolume/snapshot dentry fdmanana
  2026-01-13 12:39 ` [PATCH v2 1/4] fs: export may_delete() as may_delete_dentry() fdmanana
  2026-01-13 12:39 ` [PATCH v2 2/4] fs: export may_create() as may_create_dentry() fdmanana
@ 2026-01-13 12:39 ` fdmanana
  2026-01-13 12:39 ` [PATCH v2 4/4] btrfs: use may_create_dentry() in btrfs_mksubvol() fdmanana
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: fdmanana @ 2026-01-13 12:39 UTC (permalink / raw)
  To: linux-btrfs; +Cc: linux-fsdevel, brauner, viro, dsterba, Filipe Manana

From: Filipe Manana <fdmanana@suse.com>

There is no longer the need to use btrfs_may_delete(), which was a copy
of the VFS private function may_delete(), since now that functionality
is exported by the VFS as a function named may_delete_dentry(). In fact
our local copy of may_delete() lacks an update that happened to that
function which is point number 7 in that function's comment:

  "7. If the victim has an unknown uid or gid we can't change the inode."

which corresponds to this code:

	/* Inode writeback is not safe when the uid or gid are invalid. */
	if (!vfsuid_valid(i_uid_into_vfsuid(idmap, inode)) ||
	    !vfsgid_valid(i_gid_into_vfsgid(idmap, inode)))
		return -EOVERFLOW;

As long as we keep a separate copy, duplicating code, we are also prone
to updates to the VFS being missed in our local copy.

So change btrfs_ioctl_snap_destroy() to use the VFS function and remove
btrfs_may_delete().

Signed-off-by: Filipe Manana <fdmanana@suse.com>
---
 fs/btrfs/ioctl.c | 58 +-----------------------------------------------
 1 file changed, 1 insertion(+), 57 deletions(-)

diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index d9e7dd317670..0cb3cd3d05a5 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -815,62 +815,6 @@ static int create_snapshot(struct btrfs_root *root, struct inode *dir,
 	return ret;
 }
 
-/*  copy of may_delete in fs/namei.c()
- *	Check whether we can remove a link victim from directory dir, check
- *  whether the type of victim is right.
- *  1. We can't do it if dir is read-only (done in permission())
- *  2. We should have write and exec permissions on dir
- *  3. We can't remove anything from append-only dir
- *  4. We can't do anything with immutable dir (done in permission())
- *  5. If the sticky bit on dir is set we should either
- *	a. be owner of dir, or
- *	b. be owner of victim, or
- *	c. have CAP_FOWNER capability
- *  6. If the victim is append-only or immutable we can't do anything with
- *     links pointing to it.
- *  7. If we were asked to remove a directory and victim isn't one - ENOTDIR.
- *  8. If we were asked to remove a non-directory and victim isn't one - EISDIR.
- *  9. We can't remove a root or mountpoint.
- * 10. We don't allow removal of NFS sillyrenamed files; it's handled by
- *     nfs_async_unlink().
- */
-
-static int btrfs_may_delete(struct mnt_idmap *idmap,
-			    struct inode *dir, struct dentry *victim, int isdir)
-{
-	int ret;
-
-	if (d_really_is_negative(victim))
-		return -ENOENT;
-
-	/* The @victim is not inside @dir. */
-	if (d_inode(victim->d_parent) != dir)
-		return -EINVAL;
-	audit_inode_child(dir, victim, AUDIT_TYPE_CHILD_DELETE);
-
-	ret = inode_permission(idmap, dir, MAY_WRITE | MAY_EXEC);
-	if (ret)
-		return ret;
-	if (IS_APPEND(dir))
-		return -EPERM;
-	if (check_sticky(idmap, dir, d_inode(victim)) ||
-	    IS_APPEND(d_inode(victim)) || IS_IMMUTABLE(d_inode(victim)) ||
-	    IS_SWAPFILE(d_inode(victim)))
-		return -EPERM;
-	if (isdir) {
-		if (!d_is_dir(victim))
-			return -ENOTDIR;
-		if (IS_ROOT(victim))
-			return -EBUSY;
-	} else if (d_is_dir(victim))
-		return -EISDIR;
-	if (IS_DEADDIR(dir))
-		return -ENOENT;
-	if (victim->d_flags & DCACHE_NFSFS_RENAMED)
-		return -EBUSY;
-	return 0;
-}
-
 /* copy of may_create in fs/namei.c() */
 static inline int btrfs_may_create(struct mnt_idmap *idmap,
 				   struct inode *dir, const struct dentry *child)
@@ -2420,7 +2364,7 @@ static noinline int btrfs_ioctl_snap_destroy(struct file *file,
 	}
 
 	/* check if subvolume may be deleted by a user */
-	ret = btrfs_may_delete(idmap, dir, dentry, 1);
+	ret = may_delete_dentry(idmap, dir, dentry, true);
 	if (ret)
 		goto out_end_removing;
 
-- 
2.47.2


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 4/4] btrfs: use may_create_dentry() in btrfs_mksubvol()
  2026-01-13 12:39 [PATCH v2 0/4] btrfs: stop duplicating VFS code for subvolume/snapshot dentry fdmanana
                   ` (2 preceding siblings ...)
  2026-01-13 12:39 ` [PATCH v2 3/4] btrfs: use may_delete_dentry() in btrfs_ioctl_snap_destroy() fdmanana
@ 2026-01-13 12:39 ` fdmanana
  2026-01-13 21:24 ` [PATCH v2 0/4] btrfs: stop duplicating VFS code for subvolume/snapshot dentry David Sterba
  2026-01-14 16:18 ` Christian Brauner
  5 siblings, 0 replies; 7+ messages in thread
From: fdmanana @ 2026-01-13 12:39 UTC (permalink / raw)
  To: linux-btrfs; +Cc: linux-fsdevel, brauner, viro, dsterba, Filipe Manana

From: Filipe Manana <fdmanana@suse.com>

There is no longer the need to use btrfs_may_create(), which was a copy
of the VFS private function may_create(), since now that functionality
is exported by the VFS as a function named may_create_dentry(). So change
btrfs_mksubvol() to use the VFS function and remove btrfs_may_create().

Note that the btrfs copy was missing an audit_inode_child() call that we
have in the VFS function. This only reinforces the need to use a common
function, as it's very easy for the btrfs copy to get out of sync and
therefore a maintenance burden.

Signed-off-by: Filipe Manana <fdmanana@suse.com>
---
 fs/btrfs/ioctl.c | 15 +--------------
 1 file changed, 1 insertion(+), 14 deletions(-)

diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 0cb3cd3d05a5..9cf37459ef6d 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -815,19 +815,6 @@ static int create_snapshot(struct btrfs_root *root, struct inode *dir,
 	return ret;
 }
 
-/* copy of may_create in fs/namei.c() */
-static inline int btrfs_may_create(struct mnt_idmap *idmap,
-				   struct inode *dir, const struct dentry *child)
-{
-	if (d_really_is_positive(child))
-		return -EEXIST;
-	if (IS_DEADDIR(dir))
-		return -ENOENT;
-	if (!fsuidgid_has_mapping(dir->i_sb, idmap))
-		return -EOVERFLOW;
-	return inode_permission(idmap, dir, MAY_WRITE | MAY_EXEC);
-}
-
 /*
  * Create a new subvolume below @parent.  This is largely modeled after
  * sys_mkdirat and vfs_mkdir, but we only do a single component lookup
@@ -849,7 +836,7 @@ static noinline int btrfs_mksubvol(struct dentry *parent,
 	if (IS_ERR(dentry))
 		return PTR_ERR(dentry);
 
-	ret = btrfs_may_create(idmap, dir, dentry);
+	ret = may_create_dentry(idmap, dir, dentry);
 	if (ret)
 		goto out_dput;
 
-- 
2.47.2


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 0/4] btrfs: stop duplicating VFS code for subvolume/snapshot dentry
  2026-01-13 12:39 [PATCH v2 0/4] btrfs: stop duplicating VFS code for subvolume/snapshot dentry fdmanana
                   ` (3 preceding siblings ...)
  2026-01-13 12:39 ` [PATCH v2 4/4] btrfs: use may_create_dentry() in btrfs_mksubvol() fdmanana
@ 2026-01-13 21:24 ` David Sterba
  2026-01-14 16:18 ` Christian Brauner
  5 siblings, 0 replies; 7+ messages in thread
From: David Sterba @ 2026-01-13 21:24 UTC (permalink / raw)
  To: fdmanana
  Cc: linux-btrfs, linux-fsdevel, brauner, viro, dsterba, Filipe Manana

On Tue, Jan 13, 2026 at 12:39:49PM +0000, fdmanana@kernel.org wrote:
> From: Filipe Manana <fdmanana@suse.com>
> 
> Currently btrfs has copies of two unexported functions from fs/namei.c
> used in the snapshot/subvolume creation and deletion. This patchset
> exports those functions and makes btrfs use them, to avoid duplication
> and the burden of keeping the copies up to date.
> 
> V2: Updated changelog of patch 4/4 to mention the btrfs copy misses a
>     call to audit_inode_child().
> 
> Link to V1: https://lore.kernel.org/linux-btrfs/cover.1767801889.git.fdmanana@suse.com/
> 
> Filipe Manana (4):
>   fs: export may_delete() as may_delete_dentry()
>   fs: export may_create() as may_create_dentry()
>   btrfs: use may_delete_dentry() in btrfs_ioctl_snap_destroy()
>   btrfs: use may_create_dentry() in btrfs_mksubvol()

Reviewed-by: David Sterba <dsterba@suse.com>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 0/4] btrfs: stop duplicating VFS code for subvolume/snapshot dentry
  2026-01-13 12:39 [PATCH v2 0/4] btrfs: stop duplicating VFS code for subvolume/snapshot dentry fdmanana
                   ` (4 preceding siblings ...)
  2026-01-13 21:24 ` [PATCH v2 0/4] btrfs: stop duplicating VFS code for subvolume/snapshot dentry David Sterba
@ 2026-01-14 16:18 ` Christian Brauner
  5 siblings, 0 replies; 7+ messages in thread
From: Christian Brauner @ 2026-01-14 16:18 UTC (permalink / raw)
  To: linux-btrfs, fdmanana
  Cc: Christian Brauner, linux-fsdevel, viro, dsterba, Filipe Manana

On Tue, 13 Jan 2026 12:39:49 +0000, fdmanana@kernel.org wrote:
> From: Filipe Manana <fdmanana@suse.com>
> 
> Currently btrfs has copies of two unexported functions from fs/namei.c
> used in the snapshot/subvolume creation and deletion. This patchset
> exports those functions and makes btrfs use them, to avoid duplication
> and the burden of keeping the copies up to date.
> 
> [...]

This is on a separate branch. I'm not going to touch it again.
So if you end up having to rely on it this can easily be arranged.

---

Applied to the vfs-7.0.btrfs branch of the vfs/vfs.git tree.
Patches in the vfs-7.0.btrfs branch should appear in linux-next soon.

Please report any outstanding bugs that were missed during review in a
new review to the original patch series allowing us to drop it.

It's encouraged to provide Acked-bys and Reviewed-bys even though the
patch has now been applied. If possible patch trailers will be updated.

Note that commit hashes shown below are subject to change due to rebase,
trailer updates or similar. If in doubt, please check the listed branch.

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git
branch: vfs-7.0.btrfs

[1/4] fs: export may_delete() as may_delete_dentry()
      https://git.kernel.org/vfs/vfs/c/173e93755243
[2/4] fs: export may_create() as may_create_dentry()
      https://git.kernel.org/vfs/vfs/c/26aab3a485d5
[3/4] btrfs: use may_delete_dentry() in btrfs_ioctl_snap_destroy()
      https://git.kernel.org/vfs/vfs/c/5f84a1092dee
[4/4] btrfs: use may_create_dentry() in btrfs_mksubvol()
      https://git.kernel.org/vfs/vfs/c/6c91c776a923

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2026-01-14 16:19 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-13 12:39 [PATCH v2 0/4] btrfs: stop duplicating VFS code for subvolume/snapshot dentry fdmanana
2026-01-13 12:39 ` [PATCH v2 1/4] fs: export may_delete() as may_delete_dentry() fdmanana
2026-01-13 12:39 ` [PATCH v2 2/4] fs: export may_create() as may_create_dentry() fdmanana
2026-01-13 12:39 ` [PATCH v2 3/4] btrfs: use may_delete_dentry() in btrfs_ioctl_snap_destroy() fdmanana
2026-01-13 12:39 ` [PATCH v2 4/4] btrfs: use may_create_dentry() in btrfs_mksubvol() fdmanana
2026-01-13 21:24 ` [PATCH v2 0/4] btrfs: stop duplicating VFS code for subvolume/snapshot dentry David Sterba
2026-01-14 16:18 ` Christian Brauner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox