| 397 | } |
| 398 | |
| 399 | static __inline void |
| 400 | mqnode_release(struct mqfs_node *node) |
| 401 | { |
| 402 | struct mqfs_info *mqfs; |
| 403 | int old, exp; |
| 404 | |
| 405 | mqfs = node->mn_info; |
| 406 | old = atomic_fetchadd_int(&node->mn_refcount, -1); |
| 407 | if (node->mn_type == mqfstype_dir || |
| 408 | node->mn_type == mqfstype_root) |
| 409 | exp = 3; /* include . and .. */ |
| 410 | else |
| 411 | exp = 1; |
| 412 | if (old == exp) { |
| 413 | int locked = sx_xlocked(&mqfs->mi_lock); |
| 414 | if (!locked) |
| 415 | sx_xlock(&mqfs->mi_lock); |
| 416 | mqfs_destroy(node); |
| 417 | if (!locked) |
| 418 | sx_xunlock(&mqfs->mi_lock); |
| 419 | } |
| 420 | } |
| 421 | |
| 422 | /* |
| 423 | * Add a node to a directory |
no test coverage detected