diff options
| author | Dima Dorfman <dd@FreeBSD.org> | 2002-07-28 03:52:44 +0000 |
|---|---|---|
| committer | Dima Dorfman <dd@FreeBSD.org> | 2002-07-28 03:52:44 +0000 |
| commit | af13e3abb9a2121d84a507390fccea1c27310ca9 (patch) | |
| tree | b5d70b8734293c58d7a5d02779d2414f8b9db511 /sys/fs/devfs | |
| parent | 716297c2d32f94712c9c80ca960538f5a5717a93 (diff) | |
Notes
Diffstat (limited to 'sys/fs/devfs')
| -rw-r--r-- | sys/fs/devfs/devfs_rule.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/sys/fs/devfs/devfs_rule.c b/sys/fs/devfs/devfs_rule.c index 3f19da2c30545..74da699d0d9bc 100644 --- a/sys/fs/devfs/devfs_rule.c +++ b/sys/fs/devfs/devfs_rule.c @@ -97,6 +97,7 @@ struct devfs_ruleset { int ds_refcount; int ds_flags; #define DS_IMMUTABLE 0x001 + int ds_running; }; static devfs_rid devfs_rid_input(devfs_rid rid, struct devfs_mount *dm); @@ -679,11 +680,10 @@ devfs_rule_run(struct devfs_krule *dk, struct devfs_dirent *de) if (dr->dr_iacts & DRA_INCSET) { ds = devfs_ruleset_bynum(dk->dk_rule.dr_incset); KASSERT(ds != NULL, ("DRA_INCSET but bad dr_incset")); - if (dk->dk_ruleset == ds) { - /* XXX: Do a better job of detecting loops. */ - printf("Warning: Ruleset %d including itself!\n", - dk->dk_ruleset->ds_number); - } else + if (ds->ds_running) + printf("Warning: avoiding loop through ruleset %d\n", + ds->ds_number); + else devfs_ruleset_applyde(ds, de); } } @@ -696,9 +696,12 @@ devfs_ruleset_applyde(struct devfs_ruleset *ds, struct devfs_dirent *de) { struct devfs_krule *dk; + KASSERT(!ds->ds_running,("ruleset %d already running", ds->ds_number)); + ds->ds_running = 1; SLIST_FOREACH(dk, &ds->ds_rules, dk_list) { devfs_rule_applyde(dk, de); } + ds->ds_running = 0; } /* @@ -709,6 +712,8 @@ devfs_ruleset_applydm(struct devfs_ruleset *ds, struct devfs_mount *dm) { struct devfs_krule *dk; + KASSERT(!ds->ds_running,("ruleset %d already running", ds->ds_number)); + ds->ds_running = 1; /* * XXX: Does it matter whether we do * @@ -728,6 +733,7 @@ devfs_ruleset_applydm(struct devfs_ruleset *ds, struct devfs_mount *dm) SLIST_FOREACH(dk, &ds->ds_rules, dk_list) { devfs_rule_applydm(dk, dm); } + ds->ds_running = 0; } /* |
