[PATCH] Finish the task 'Convert mountlist_mtx to rwlock'
Tiwei Bie
btw at mail.ustc.edu.cn
Thu Mar 12 02:25:17 UTC 2015
On Thu, Mar 12, 2015 at 02:08:53AM +0100, Mateusz Guzik wrote:
> On Wed, Mar 11, 2015 at 09:10:34PM +0800, Tiwei Bie wrote:
> > Hi, Mateusz!
> >
> > I have finished the task: Convert mountlist_mtx to rwlock [1].
> >
> > sys/rwlock.h and cddl/compat/opensolaris/sys/rwlock.h have defined
> > the same symbols, such as rw_init(), rw_destroy(). So they could not
> > be included in the same file. And the latter has been indirectly
> > included in cddl/compat/opensolaris/kern/opensolaris_vfs.c and
> > cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
> > which needs to use mountlist_lock. So I implemented the following
> > functions to access mountlist_lock in these files:
> >
> > void zfs_mountlist_wlock(void);
> > void zfs_mountlist_wunlock(void);
> > void zfs_mountlist_rlock(void);
> > void zfs_mountlist_runlock(void);
> >
>
> (cc-ed one of our zfs guys)
>
> Oops, completely forgot about header conflict.
>
> First off, if providing such functions, they should be prefixed with
> freebsd_ or something similar.
>
When naming these functions, I read cddl/compat/opensolaris/kern/opensolaris_vm.c
for reference. It also needs to use rwlock:
void
zfs_vmobject_wlock(vm_object_t object)
{
VM_OBJECT_WLOCK(object);
}
void
zfs_vmobject_wunlock(vm_object_t object)
{
VM_OBJECT_WUNLOCK(object);
}
> Ideally we would somewhow fix namespace problems, but this may not be
> that easy.
>
> I think this is a nice opportunity to hide mountlist_lock behind some
> helpers.
>
> I left all usage samples below.
>
> We can fix mount_snapshot no problem by providing a dedicated function
> to insert into mountlist.
>
> I'm somewhat torn with zfs_get_vfs and zfsvfs_update_fromname. We could
> provide a helper function which takes a function pointer and calls it
> for each entry in the list. Somewhat crappy but should work fine.
>
> Comments?
>
If we hide mountlist_lock behind some helpers, we will have to define
new callback function and argument type (when the callback function
needs more than one argument, I think these arguments have to be included
in a structure to keep the prototype of the callback function simple,
e.g. int (*func)(struct mount *mp, void *arg)), such as what we have to
do with zfsvfs_update_fromname. It isn't very simple and elegant. So I
prefer to provide some helpers to access mountlist_lock directly.
> > diff --git a/sys/cddl/compat/opensolaris/kern/opensolaris_vfs.c b/sys/cddl/compat/opensolaris/kern/opensolaris_vfs.c
> > index a2532f8..045aa80 100644
> > --- a/sys/cddl/compat/opensolaris/kern/opensolaris_vfs.c
> > +++ b/sys/cddl/compat/opensolaris/kern/opensolaris_vfs.c
> > @@ -222,9 +222,9 @@ mount_snapshot(kthread_t *td, vnode_t **vpp, const char *fstype, char *fspath,
> >
> > vp->v_mountedhere = mp;
> > /* Put the new filesystem on the mount list. */
> > - mtx_lock(&mountlist_mtx);
> > + zfs_mountlist_wlock();
> > TAILQ_INSERT_TAIL(&mountlist, mp, mnt_list);
> > - mtx_unlock(&mountlist_mtx);
> > + zfs_mountlist_wunlock();
> > vfs_event_signal(NULL, VQ_MOUNT, 0);
> > if (VFS_ROOT(mp, LK_EXCLUSIVE, &mvp))
> > panic("mount: lost mount");
> > diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
> > index a829b06..4d86892 100644
> > --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
> > +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
> > @@ -3015,14 +3015,14 @@ zfs_get_vfs(const char *resource)
> > {
> > vfs_t *vfsp;
> >
> > - mtx_lock(&mountlist_mtx);
> > + zfs_mountlist_rlock();
> > TAILQ_FOREACH(vfsp, &mountlist, mnt_list) {
> > if (strcmp(refstr_value(vfsp->vfs_resource), resource) == 0) {
> > VFS_HOLD(vfsp);
> > break;
> > }
> > }
> > - mtx_unlock(&mountlist_mtx);
> > + zfs_mountlist_runlock();
> > return (vfsp);
> > }
> >
> > diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
> > index 415db9e..9b29323 100644
> > --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
> > +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
> > @@ -2537,7 +2537,7 @@ zfsvfs_update_fromname(const char *oldname, const char *newname)
> >
> > oldlen = strlen(oldname);
> >
> > - mtx_lock(&mountlist_mtx);
> > + zfs_mountlist_rlock();
> > TAILQ_FOREACH(mp, &mountlist, mnt_list) {
> > fromname = mp->mnt_stat.f_mntfromname;
> > if (strcmp(fromname, oldname) == 0) {
> > @@ -2554,6 +2554,6 @@ zfsvfs_update_fromname(const char *oldname, const char *newname)
> > continue;
> > }
> > }
> > - mtx_unlock(&mountlist_mtx);
> > + zfs_mountlist_runlock();
> > }
> > #endif
>
> --
> Mateusz Guzik <mjguzik gmail.com>
Tiwei Bie
More information about the freebsd-hackers
mailing list