diff options
author | phk <phk@FreeBSD.org> | 2005-09-15 08:36:37 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2005-09-15 08:36:37 +0000 |
commit | 1a7de63bbb6ec885b914b9b3d077642dd4350220 (patch) | |
tree | 4ba8568596d276b1a3189e49af8cdb1f3f6765d3 /sys/fs | |
parent | 4583eb76103532bc386b6c8047ed52500bd62473 (diff) | |
download | FreeBSD-src-1a7de63bbb6ec885b914b9b3d077642dd4350220.zip FreeBSD-src-1a7de63bbb6ec885b914b9b3d077642dd4350220.tar.gz |
Absolve devfs_rule.c from locking responsibility and call it with
all necessary locking held.
Diffstat (limited to 'sys/fs')
-rw-r--r-- | sys/fs/devfs/devfs.h | 2 | ||||
-rw-r--r-- | sys/fs/devfs/devfs_rule.c | 16 | ||||
-rw-r--r-- | sys/fs/devfs/devfs_vnops.c | 6 |
3 files changed, 5 insertions, 19 deletions
diff --git a/sys/fs/devfs/devfs.h b/sys/fs/devfs/devfs.h index 5d25fd7..5013a0b 100644 --- a/sys/fs/devfs/devfs.h +++ b/sys/fs/devfs/devfs.h @@ -187,7 +187,7 @@ extern unsigned devfs_rule_depth; #define VFSTODEVFS(mp) ((struct devfs_mount *)((mp)->mnt_data)) void devfs_rules_apply(struct devfs_mount *dm, struct devfs_dirent *de); -int devfs_rules_ioctl(struct mount *mp, u_long cmd, caddr_t data, struct thread *td); +int devfs_rules_ioctl(struct devfs_mount *dm, u_long cmd, caddr_t data, struct thread *td); void devfs_rules_newmount(struct devfs_mount *dm, struct thread *td); int devfs_allocv (struct devfs_dirent *de, struct mount *mp, struct vnode **vpp, struct thread *td); struct cdev **devfs_itod (int inode); diff --git a/sys/fs/devfs/devfs_rule.c b/sys/fs/devfs/devfs_rule.c index 0c573a9..684ce53 100644 --- a/sys/fs/devfs/devfs_rule.c +++ b/sys/fs/devfs/devfs_rule.c @@ -71,7 +71,6 @@ #include <sys/malloc.h> #include <sys/dirent.h> #include <sys/vnode.h> -#include <sys/mount.h> #include <sys/ioccom.h> #include <fs/devfs/devfs.h> @@ -162,9 +161,8 @@ SYSINIT(devfs_rules, SI_SUB_DEVFS, SI_ORDER_FIRST, devfs_rules_init, NULL); * Rule subsystem ioctl hook. */ int -devfs_rules_ioctl(struct mount *mp, u_long cmd, caddr_t data, struct thread *td) +devfs_rules_ioctl(struct devfs_mount *dm, u_long cmd, caddr_t data, struct thread *td) { - struct devfs_mount *dm = VFSTODEVFS(mp); struct devfs_ruleset *ds; struct devfs_krule *dk; struct devfs_rule *dr; @@ -181,8 +179,6 @@ devfs_rules_ioctl(struct mount *mp, u_long cmd, caddr_t data, struct thread *td) if (error != 0) return (error); - lockmgr(&dm->dm_lock, LK_SHARED, 0, td); - switch (cmd) { case DEVFSIO_RADD: dr = (struct devfs_rule *)data; @@ -194,7 +190,6 @@ devfs_rules_ioctl(struct mount *mp, u_long cmd, caddr_t data, struct thread *td) error = EEXIST; goto out; } - lockmgr(&dm->dm_lock, LK_UPGRADE, 0, td); error = devfs_rule_insert(dr); break; case DEVFSIO_RAPPLY: @@ -224,9 +219,7 @@ devfs_rules_ioctl(struct mount *mp, u_long cmd, caddr_t data, struct thread *td) } dk = malloc(sizeof(*dk), M_TEMP, M_WAITOK | M_ZERO); memcpy(&dk->dk_rule, dr, sizeof(*dr)); - lockmgr(&dm->dm_lock, LK_UPGRADE, 0, td); devfs_rule_applydm(dk, dm); - lockmgr(&dm->dm_lock, LK_DOWNGRADE, 0, td); free(dk, M_TEMP); error = 0; break; @@ -238,7 +231,6 @@ devfs_rules_ioctl(struct mount *mp, u_long cmd, caddr_t data, struct thread *td) error = ENOENT; goto out; } - lockmgr(&dm->dm_lock, LK_UPGRADE, 0, td); devfs_rule_applydm(dk, dm); error = 0; break; @@ -251,7 +243,6 @@ devfs_rules_ioctl(struct mount *mp, u_long cmd, caddr_t data, struct thread *td) goto out; } ds = dk->dk_ruleset; - lockmgr(&dm->dm_lock, LK_UPGRADE, 0, td); error = devfs_rule_delete(&dk); devfs_ruleset_reap(&ds); break; @@ -287,7 +278,6 @@ devfs_rules_ioctl(struct mount *mp, u_long cmd, caddr_t data, struct thread *td) break; case DEVFSIO_SUSE: rsnum = *(devfs_rsnum *)data; - lockmgr(&dm->dm_lock, LK_UPGRADE, 0, td); error = devfs_ruleset_use(rsnum, dm); break; case DEVFSIO_SAPPLY: @@ -298,7 +288,6 @@ devfs_rules_ioctl(struct mount *mp, u_long cmd, caddr_t data, struct thread *td) error = ESRCH; goto out; } - lockmgr(&dm->dm_lock, LK_UPGRADE, 0, td); devfs_ruleset_applydm(ds, dm); error = 0; break; @@ -321,7 +310,6 @@ devfs_rules_ioctl(struct mount *mp, u_long cmd, caddr_t data, struct thread *td) } out: - lockmgr(&dm->dm_lock, LK_RELEASE, 0, td); return (error); } @@ -333,7 +321,6 @@ devfs_rules_newmount(struct devfs_mount *dm, struct thread *td) { struct devfs_ruleset *ds; - lockmgr(&dm->dm_lock, LK_EXCLUSIVE, 0, td); /* * We can't use devfs_ruleset_use() since it will try to * decrement the refcount for the old ruleset, and there is no @@ -344,7 +331,6 @@ devfs_rules_newmount(struct devfs_mount *dm, struct thread *td) KASSERT(ds != NULL, ("no ruleset 0")); ++ds->ds_refcount; dm->dm_ruleset = 0; - lockmgr(&dm->dm_lock, LK_RELEASE, 0, td); } /* diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c index 196e577..30c2c21 100644 --- a/sys/fs/devfs/devfs_vnops.c +++ b/sys/fs/devfs/devfs_vnops.c @@ -979,11 +979,11 @@ devfs_rioctl(struct vop_ioctl_args *ap) struct devfs_mount *dmp; dmp = VFSTODEVFS(ap->a_vp->v_mount); - lockmgr(&dmp->dm_lock, LK_SHARED, 0, curthread); + lockmgr(&dmp->dm_lock, LK_EXCLUSIVE, 0, curthread); devfs_populate(dmp); - lockmgr(&dmp->dm_lock, LK_RELEASE, 0, curthread); - error = devfs_rules_ioctl(ap->a_vp->v_mount, ap->a_command, ap->a_data, + error = devfs_rules_ioctl(dmp, ap->a_command, ap->a_data, ap->a_td); + lockmgr(&dmp->dm_lock, LK_RELEASE, 0, curthread); return (error); } |