[Ocfs2-devel] report BUG: io_uring triggers umount error
Heming Zhao
heming.zhao at suse.com
Sun Feb 26 08:45:44 UTC 2023
On Fri, Feb 24, 2023 at 06:59:47PM +0800, Joseph Qi wrote:
>
>
> On 2/24/23 4:03 PM, Heming Zhao wrote:
> > On 2/24/23 3:52 PM, Joseph Qi wrote:
> >>
> >>
> >> On 2/24/23 3:48 PM, Heming Zhao via Ocfs2-devel wrote:
> >>> On 2/24/23 2:54 PM, Joseph Qi wrote:
> >>>> I can reproduce this in my local VM.
> >>>> I've traced ocfs2_dismount_volume and found that it hasn't been called.
> >>>> So EBUSY is returned in VFS layer. I guess something wrong when doing
> >>>> a copy with linked SQEs (normal copy seems no problem).
> >>>>
> >>>
> >>> I am inclined to agree with you. I also test liburing examples apps
> >>> on ext4 partition, everything looks fine.
> >>>
> >>> I used below bpftrace method, the retval is '3'.
> >>> bpftrace -e 'kr:mnt_get_count{printf("%d\n", retval);}'
> >>>
> >>> It responds to flow: path_umount() => do_umount => mnt_get_count (gets '3')
> >>>
> >> Yes, that's the place return EBUSY.
> >> So the problem seems to be getmnt/putmnt not match in this case.
> >>
> >
> > I didn't familiar with setting up kernel bi-search env. I used one last year
> > openSUSE tumblweed (with kernel 5.16.2), this umount issue doesn't exist.
> > So there is a possibility one ocfs2 commit introduced this issue.
>You can checkout each mailine version like Linux 6.0, 6.1, ... and try
> to check if it can be reproduced.
I drop this method, my machine cpu is old, compiling kernel will take too much
time.
>
> I've tried trace mntget/mntput using the following bpftrace script,
> link-cp output shows it misses a fput.
>
> #include <linux/mount.h>
> #include <linux/string.h>
>
> kprobe:mntget
> {
> $n = ((struct vfsmount *)arg0)->mnt_sb->s_type->name;
>
> if (!strncmp(str($n), "ocfs2", 5)) {
> @[comm] += 1;
>
> printf("%s", kstack);
> }
> }
>
> kprobe:mntput
> {
> $n = ((struct vfsmount *)arg0)->mnt_sb->s_type->name;
>
> if (!strncmp(str($n), "ocfs2", 5)) {
> @[comm] +=1;
>
> printf("%s", kstack);
> }
> }
>
I used below script to find source file hold f_count.
e.g: ./link-cp /mnt/aa.bin /mnt/1
The script will show f_count of aa.bin only down to 3. We expect f_count value
down to 1 then trigger mntput.
```
#include <linux/mount.h>
#include <linux/string.h>
#include <linux/dcache.h>
#include <linux/path.h>
#include <linux/fs_struct.h>
#include <linux/fs.h>
#include <linux/io_uring_types.h>
k:fput
{
$f = (struct file *)arg0;
$cnt = $f->f_count;
if (!strncmp(comm, "link-cp", 7)) {
printf("\n [link-cp] fput() name:%s f_count:%lld <%p> mnt:%p\n",
str($f->f_path.dentry->d_name.name), $cnt.counter, kptr($f), kptr($f->f_path.mnt));
//printf("%s\n", kstack);
}
}
```
- Heming
More information about the Ocfs2-devel
mailing list