| 1688 | } |
| 1689 | |
| 1690 | static int __noinline |
| 1691 | cache_lookup_dot(struct vnode *dvp, struct vnode **vpp, struct componentname *cnp, |
| 1692 | struct timespec *tsp, int *ticksp) |
| 1693 | { |
| 1694 | int ltype; |
| 1695 | |
| 1696 | *vpp = dvp; |
| 1697 | counter_u64_add(dothits, 1); |
| 1698 | SDT_PROBE3(vfs, namecache, lookup, hit, dvp, ".", *vpp); |
| 1699 | if (tsp != NULL) |
| 1700 | timespecclear(tsp); |
| 1701 | if (ticksp != NULL) |
| 1702 | *ticksp = ticks; |
| 1703 | vrefact(*vpp); |
| 1704 | /* |
| 1705 | * When we lookup "." we still can be asked to lock it |
| 1706 | * differently... |
| 1707 | */ |
| 1708 | ltype = cnp->cn_lkflags & LK_TYPE_MASK; |
| 1709 | if (ltype != VOP_ISLOCKED(*vpp)) { |
| 1710 | if (ltype == LK_EXCLUSIVE) { |
| 1711 | vn_lock(*vpp, LK_UPGRADE | LK_RETRY); |
| 1712 | if (VN_IS_DOOMED((*vpp))) { |
| 1713 | /* forced unmount */ |
| 1714 | vrele(*vpp); |
| 1715 | *vpp = NULL; |
| 1716 | return (ENOENT); |
| 1717 | } |
| 1718 | } else |
| 1719 | vn_lock(*vpp, LK_DOWNGRADE | LK_RETRY); |
| 1720 | } |
| 1721 | return (-1); |
| 1722 | } |
| 1723 | |
| 1724 | static int __noinline |
| 1725 | cache_lookup_dotdot(struct vnode *dvp, struct vnode **vpp, struct componentname *cnp, |
no test coverage detected