summaryrefslogtreecommitdiff
path: root/drivers/usb/gadget/function/f_fs.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2025-11-17 16:49:59 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2025-11-17 23:53:51 -0500
commit1544775687f093e799439fca5519340b88c84e2c (patch)
treead4f3b00060e2580c8e40539e3fcc21787dd32a0 /drivers/usb/gadget/function/f_fs.c
parentfe47466282a69499ae17a22f064e827badb77078 (diff)
functionfs: need to cancel ->reset_work in ->kill_sb()
... otherwise we just might free ffs with ffs->reset_work still on queue. That needs to be done after ffs_data_reset() - that's the cutoff point for configfs accesses (serialized on gadget_info->lock), which is where the schedule_work() would come from. Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'drivers/usb/gadget/function/f_fs.c')
-rw-r--r--drivers/usb/gadget/function/f_fs.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c
index 0bcff49e1f11..27860fc0fd7d 100644
--- a/drivers/usb/gadget/function/f_fs.c
+++ b/drivers/usb/gadget/function/f_fs.c
@@ -2081,6 +2081,9 @@ ffs_fs_kill_sb(struct super_block *sb)
struct ffs_data *ffs = sb->s_fs_info;
ffs->state = FFS_CLOSING;
ffs_data_reset(ffs);
+ // no configfs accesses from that point on,
+ // so no further schedule_work() is possible
+ cancel_work_sync(&ffs->reset_work);
ffs_data_put(ffs);
}
}