Skip to content

Commit d6fc882

Browse files
kinglongmeeJ. Bruce Fields
authored andcommitted
SUNRPC/Cache: Always treat the invalid cache as unexpired
When the first time pynfs runs after rpc/nfsd startup, always get the warning, "Got error: Connection closed" I found the problem is caused by, 1. A new startup of nfsd, rpc.mountd, etc, 2. A rpc request from client (pynfs test, or normal mounting), 3. An ip_map cache is created but invalid, so upcall to rpc.mountd, 4. rpc.mountd process the ip_map upcall, before write the valid data to nfsd, do auth_reload(), and check_useipaddr(), 5. For the first time, old_use_ipaddr = -1, it causes rpc.mountd do write_flush that doing cache_clean, 6. The ip_map cache will be treat as expired and clean, 7. When rpc.mountd write the valid data to nfsd, a new ip_map is created and updated, the cache_check of old ip_map(doing the upcall) will return -ETIMEDOUT. 8. RPC layer return SVC_CLOSE and close the xprt after commit 4d712ef "svcauth_gss: Close connection when dropping an incoming message" NeilBrown suggest in another email, "If CACHE_VALID is not set, then there is no data in the cache item, so there is nothing to expire. So it would be nice if cache items that don't have CACHE_VALID are never treated as expired." v3, change the order of the two patches v2, change the checking of CACHE_PENDING to CACHE_VALID Reviewed-by: NeilBrown <neilb@suse.com> Signed-off-by: Kinglong Mee <kinglongmee@gmail.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
1 parent 471a930 commit d6fc882

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

include/linux/sunrpc/cache.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,11 @@ static inline void cache_put(struct cache_head *h, struct cache_detail *cd)
204204
kref_put(&h->ref, cd->cache_put);
205205
}
206206

207-
static inline int cache_is_expired(struct cache_detail *detail, struct cache_head *h)
207+
static inline bool cache_is_expired(struct cache_detail *detail, struct cache_head *h)
208208
{
209+
if (!test_bit(CACHE_VALID, &h->flags))
210+
return false;
211+
209212
return (h->expiry_time < seconds_since_boot()) ||
210213
(detail->flush_time >= h->last_refresh);
211214
}

0 commit comments

Comments
 (0)