Changeset View
Changeset View
Standalone View
Standalone View
sys/fs/fuse/fuse_internal.c
Show First 20 Lines • Show All 1,249 Lines • ▼ Show 20 Lines | if (vnode_vtype(vp) != vtyp) { | ||||
if (vnode_vtype(vp) == VNON && vtyp != VNON) { | if (vnode_vtype(vp) == VNON && vtyp != VNON) { | ||||
SDT_PROBE2(fusefs, , internal, trace, 1, "FUSE: Dang! " | SDT_PROBE2(fusefs, , internal, trace, 1, "FUSE: Dang! " | ||||
"vnode_vtype is VNON and vtype isn't."); | "vnode_vtype is VNON and vtype isn't."); | ||||
} else { | } else { | ||||
/* | /* | ||||
* STALE vnode, ditch | * STALE vnode, ditch | ||||
* | * | ||||
* The vnode has changed its type "behind our back". | * The vnode has changed its type "behind our back". | ||||
* This probably means that the file got deleted and | |||||
* recreated on the server, with the same inode. | |||||
* There's nothing really we can do, so let us just | * There's nothing really we can do, so let us just | ||||
* force an internal revocation and tell the caller to | * return ENOENT. After all, the entry must not have | ||||
* try again, if interested. | * existed in the recent past. If the user tries | ||||
* again, it will work. | |||||
*/ | */ | ||||
fuse_internal_vnode_disappear(vp); | fuse_internal_vnode_disappear(vp); | ||||
err = EAGAIN; | err = ENOENT; | ||||
} | } | ||||
} | } | ||||
if (err == 0) { | if (err == 0) { | ||||
struct fuse_attr_out *fao = (struct fuse_attr_out*)fdi.answ; | struct fuse_attr_out *fao = (struct fuse_attr_out*)fdi.answ; | ||||
fuse_vnode_undirty_cached_timestamps(vp, true); | fuse_vnode_undirty_cached_timestamps(vp, true); | ||||
fuse_internal_cache_attrs(vp, &fao->attr, fao->attr_valid, | fuse_internal_cache_attrs(vp, &fao->attr, fao->attr_valid, | ||||
fao->attr_valid_nsec, NULL, false); | fao->attr_valid_nsec, NULL, false); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 74 Lines • Show Last 20 Lines |