Skip to contentSkip to conversation

NFS: Remove bad delegations during open recovery

PATCH In review [email protected] 2 participants 5 messages Sep 26, 2012 – Sep 28, 2012

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH v2 1/2 NFS: Remove bad delegations during open recovery

From: Bryan Schumaker <[email protected]>

I put the client into an open recovery loop by:
Client: Open file
read half
Server: Expire client (echo 0 > /sys/kernel/debug/nfsd/forget_clients)
Client: Drop vm cache (echo 3 > /proc/sys/vm/drop_caches)
finish reading file

This causes a loop because the client never updates the nfs4_state after discovering that the delegation is invalid. This means it will keep trying to read using the bad delegation rather than attempting to re-open the file.

---
 fs/nfs/nfs4proc.c | 4 ++++
 1 file changed, 4 insertions(+)
fs/nfs/nfs4proc.c +4 -0
index 1e50326..1d49168 100644
@@ -1774,7 +1774,11 @@ static void nfs41_clear_delegation_stateid(struct nfs4_state *state)
 		 * informs us the stateid is unrecognized. */
 		if (status != -NFS4ERR_BAD_STATEID)
 			nfs41_free_stateid(server, stateid);
+		nfs_remove_bad_delegation(state->inode);
 
+		write_seqlock(&state->seqlock);
+		nfs4_stateid_copy(&state->stateid, &state->open_stateid);
+		write_sequnlock(&state->seqlock);
 		clear_bit(NFS_DELEGATED_STATE, &state->flags);
 	}
 }
Signature · 1 line
1.7.12.1
#1 lore raw

PATCH v2 2/2 NFS: Always use the open stateid when checking for expired opens

From: Bryan Schumaker <[email protected]>

If we are reading through a delegation, and the delegation is OK then state->stateid will still point to a delegation stateid and not an open stateid.

---
 fs/nfs/nfs4proc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
fs/nfs/nfs4proc.c +1 -1
index 1d49168..f35c243 100644
@@ -1794,7 +1794,7 @@ static void nfs41_clear_delegation_stateid(struct nfs4_state *state)
 static int nfs41_check_open_stateid(struct nfs4_state *state)
 {
 	struct nfs_server *server = NFS_SERVER(state->inode);
-	nfs4_stateid *stateid = &state->stateid;
+	nfs4_stateid *stateid = &state->open_stateid;
 	int status;
 
 	/* If a state reset has been done, test_stateid is unneeded */
Signature · 1 line
1.7.12.1
#2 lore raw
In reply to [email protected]
Quoted 4 lines · On Wed, Sep 26, 2012 at 9:25 PM, <[email protected]> wrote:

This causes a loop because the client never updates the nfs4_state after discovering that the delegation is invalid. This means it will keep trying to read using the bad delegation rather than attempting to re-open the file.

Oh, I already encountered this bug but never found the time to debug it / report it.

Thanks a lot! I'll try to test it soon.

Signature · 1 line
William
#3 lore raw
Quoted 11 lines · William Dauchy
Quoted 4 lines · On Wed, Sep 26, 2012 at 9:25 PM, <[email protected]> wrote:

This causes a loop because the client never updates the nfs4_state after discovering that the delegation is invalid. This means it will keep trying to read using the bad delegation rather than attempting to re-open the file.

Oh, I already encountered this bug but never found the time to debug it / report it.

Thanks a lot! I'll try to test it soon.

Awesome! Let me know how your tests go, thanks.

- Bryan

#4 lore raw
Quoted 1 line · Bryan Schumaker

Awesome! Let me know how your tests go, thanks.

Oh I didn't saw it was nfs4.1 specific since the header shows "NFS:
Remove bad delegations during open recovery"
Sorry, I thought about a general nfs bug.

Regards,

Signature · 1 line
William