xref: /haiku/src/add-ons/kernel/file_systems/nfs4/InodeIdMap.cpp (revision 25a7b01d15612846f332751841da3579db313082)
1*469f13fdSPawel Dziepak /*
2*469f13fdSPawel Dziepak  * Copyright 2013 Haiku, Inc. All rights reserved.
3*469f13fdSPawel Dziepak  * Distributed under the terms of the MIT License.
4*469f13fdSPawel Dziepak  *
5*469f13fdSPawel Dziepak  * Authors:
6*469f13fdSPawel Dziepak  *		Paweł Dziepak, pdziepak@quarnos.org
7*469f13fdSPawel Dziepak  */
8*469f13fdSPawel Dziepak 
9*469f13fdSPawel Dziepak 
10*469f13fdSPawel Dziepak #include "InodeIdMap.h"
11*469f13fdSPawel Dziepak 
12*469f13fdSPawel Dziepak 
13*469f13fdSPawel Dziepak status_t
AddName(FileInfo & fileInfo,InodeNames * parent,const char * name,ino_t id)14*469f13fdSPawel Dziepak InodeIdMap::AddName(FileInfo& fileInfo, InodeNames* parent,
15*469f13fdSPawel Dziepak 	const char* name, ino_t id)
16*469f13fdSPawel Dziepak {
17*469f13fdSPawel Dziepak 	MutexLocker _(fLock);
18*469f13fdSPawel Dziepak 	AVLTreeMap<ino_t, FileInfo>::Iterator iterator = fMap.Find(id);
19*469f13fdSPawel Dziepak 	if (iterator.HasCurrent()) {
20*469f13fdSPawel Dziepak 		if (fileInfo.fHandle == iterator.Current().fHandle) {
21*469f13fdSPawel Dziepak 			return iterator.CurrentValuePointer()->fNames->AddName(parent,
22*469f13fdSPawel Dziepak 				name);
23*469f13fdSPawel Dziepak 		}
24*469f13fdSPawel Dziepak 	}
25*469f13fdSPawel Dziepak 
26*469f13fdSPawel Dziepak 	fMap.Remove(id);
27*469f13fdSPawel Dziepak 	fileInfo.fNames = new InodeNames;
28*469f13fdSPawel Dziepak 	if (fileInfo.fNames == NULL)
29*469f13fdSPawel Dziepak 		return B_NO_MEMORY;
30*469f13fdSPawel Dziepak 
31*469f13fdSPawel Dziepak 	fileInfo.fNames->fHandle = fileInfo.fHandle;
32*469f13fdSPawel Dziepak 	status_t result = fileInfo.fNames->AddName(parent, name);
33*469f13fdSPawel Dziepak 	if (result != B_OK) {
34*469f13fdSPawel Dziepak 		delete fileInfo.fNames;
35*469f13fdSPawel Dziepak 		return result;
36*469f13fdSPawel Dziepak 	}
37*469f13fdSPawel Dziepak 
38*469f13fdSPawel Dziepak 	return fMap.Insert(id, fileInfo);
39*469f13fdSPawel Dziepak }
40*469f13fdSPawel Dziepak 
41*469f13fdSPawel Dziepak 
42*469f13fdSPawel Dziepak bool
RemoveName(ino_t id,InodeNames * parent,const char * name)43*469f13fdSPawel Dziepak InodeIdMap::RemoveName(ino_t id, InodeNames* parent, const char* name)
44*469f13fdSPawel Dziepak {
45*469f13fdSPawel Dziepak 	ASSERT(name != NULL);
46*469f13fdSPawel Dziepak 
47*469f13fdSPawel Dziepak 	MutexLocker _(fLock);
48*469f13fdSPawel Dziepak 	AVLTreeMap<ino_t, FileInfo>::Iterator iterator = fMap.Find(id);
49*469f13fdSPawel Dziepak 	if (!iterator.HasCurrent())
50*469f13fdSPawel Dziepak 		return true;
51*469f13fdSPawel Dziepak 
52*469f13fdSPawel Dziepak 	FileInfo* fileInfo = iterator.CurrentValuePointer();
53*469f13fdSPawel Dziepak 
54*469f13fdSPawel Dziepak 	return fileInfo->fNames->RemoveName(parent, name);
55*469f13fdSPawel Dziepak }
56*469f13fdSPawel Dziepak 
57*469f13fdSPawel Dziepak 
58*469f13fdSPawel Dziepak status_t
RemoveEntry(ino_t id)59*469f13fdSPawel Dziepak InodeIdMap::RemoveEntry(ino_t id)
60*469f13fdSPawel Dziepak {
61*469f13fdSPawel Dziepak 	MutexLocker _(fLock);
62*469f13fdSPawel Dziepak 	return fMap.Remove(id);
63*469f13fdSPawel Dziepak }
64*469f13fdSPawel Dziepak 
65*469f13fdSPawel Dziepak 
66*469f13fdSPawel Dziepak status_t
GetFileInfo(FileInfo * fileInfo,ino_t id)67*469f13fdSPawel Dziepak InodeIdMap::GetFileInfo(FileInfo* fileInfo, ino_t id)
68*469f13fdSPawel Dziepak {
69*469f13fdSPawel Dziepak 	ASSERT(fileInfo != NULL);
70*469f13fdSPawel Dziepak 
71*469f13fdSPawel Dziepak 	MutexLocker _(fLock);
72*469f13fdSPawel Dziepak 	AVLTreeMap<ino_t, FileInfo>::Iterator iterator = fMap.Find(id);
73*469f13fdSPawel Dziepak 	if (!iterator.HasCurrent())
74*469f13fdSPawel Dziepak 		return B_ENTRY_NOT_FOUND;
75*469f13fdSPawel Dziepak 
76*469f13fdSPawel Dziepak 	*fileInfo = iterator.Current();
77*469f13fdSPawel Dziepak 	if (fileInfo->fNames->fNames.IsEmpty())
78*469f13fdSPawel Dziepak 		return B_ENTRY_NOT_FOUND;
79*469f13fdSPawel Dziepak 	return B_OK;
80*469f13fdSPawel Dziepak }
81*469f13fdSPawel Dziepak 
82