1/*
2 * Copyright 2012 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Pawe�� Dziepak, pdziepak@quarnos.org
7 */
8
9
10#include "Delegation.h"
11
12#include "Inode.h"
13#include "Request.h"
14
15
16Delegation::Delegation(const OpenDelegationData& data, Inode* inode,
17	uint64 clientID, bool attribute)
18	:
19	fClientID(clientID),
20	fData(data),
21	fInode(inode),
22	fAttribute(attribute)
23{
24	ASSERT(inode != NULL);
25}
26
27
28status_t
29Delegation::GiveUp(bool truncate)
30{
31	if (!fAttribute && !truncate)
32		fInode->SyncAndCommit(true);
33
34	ReturnDelegation();
35
36	return B_OK;
37}
38
39
40status_t
41Delegation::ReturnDelegation()
42{
43	uint32 attempt = 0;
44	do {
45		RPC::Server* serv = fFileSystem->Server();
46		Request request(serv, fFileSystem);
47		RequestBuilder& req = request.Builder();
48
49		req.PutFH(fInfo.fHandle);
50		req.DelegReturn(fData.fStateID, fData.fStateSeq);
51
52		status_t result = request.Send();
53		if (result != B_OK)
54			return result;
55
56		ReplyInterpreter& reply = request.Reply();
57
58		if (HandleErrors(attempt, reply.NFS4Error(), serv, NULL,
59				fInode->GetOpenState())) {
60			continue;
61		}
62
63		reply.PutFH();
64
65		return reply.DelegReturn();
66	} while (true);
67}
68
69