]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
convert functionfs
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 9 Mar 2025 03:22:29 +0000 (22:22 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 18 Nov 2025 04:59:05 +0000 (23:59 -0500)
All files are regular; ep0 is there all along, other ep* may appear
and go away during the filesystem lifetime; all of those are guaranteed
to be gone by the time we umount it.

Object creation is in ffs_sb_create_file(), removals - at ->kill_sb()
time (for ep0) or by simple_remove_by_name() from ffs_epfiles_destroy()
(for the rest of them).

Switch ffs_sb_create_file() to simple_start_creating()/d_make_persistent()/
simple_done_creating() and that's it.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
drivers/usb/gadget/function/f_fs.c

index 40868ceb765c71747bfaa66b5bf2c0ac10c7ad28..4bf61017b42d77c645c18564610dd5173cbe29d8 100644 (file)
@@ -1899,17 +1899,18 @@ static int ffs_sb_create_file(struct super_block *sb, const char *name,
        struct dentry   *dentry;
        struct inode    *inode;
 
-       dentry = d_alloc_name(sb->s_root, name);
-       if (!dentry)
-               return -ENOMEM;
-
        inode = ffs_sb_make_inode(sb, data, fops, NULL, &ffs->file_perms);
-       if (!inode) {
-               dput(dentry);
+       if (!inode)
                return -ENOMEM;
+       dentry = simple_start_creating(sb->s_root, name);
+       if (IS_ERR(dentry)) {
+               iput(inode);
+               return PTR_ERR(dentry);
        }
 
-       d_add(dentry, inode);
+       d_make_persistent(dentry, inode);
+
+       simple_done_creating(dentry);
        return 0;
 }
 
@@ -2098,7 +2099,7 @@ static void ffs_data_reset(struct ffs_data *ffs);
 static void
 ffs_fs_kill_sb(struct super_block *sb)
 {
-       kill_litter_super(sb);
+       kill_anon_super(sb);
        if (sb->s_fs_info) {
                struct ffs_data *ffs = sb->s_fs_info;
                ffs->state = FFS_CLOSING;