1 // Volume.cpp
2
3 #include "Volume.h"
4
5 #include <new>
6
7 #include <AutoLocker.h>
8
9 #include "Compatibility.h"
10 #include "DebugSupport.h"
11 #include "Node.h"
12 #include "QueryManager.h"
13 #include "VolumeManager.h"
14
15 // constructor
Volume(VolumeManager * volumeManager)16 Volume::Volume(VolumeManager* volumeManager)
17 : FSObject(),
18 fLock("volume"),
19 fVolumeManager(volumeManager),
20 fParentVolume(NULL),
21 fName(),
22 fUnmounting(false)
23 {
24 }
25
26 // destructor
~Volume()27 Volume::~Volume()
28 {
29 }
30
31 // GetVolumeManager
32 VolumeManager*
GetVolumeManager() const33 Volume::GetVolumeManager() const
34 {
35 return fVolumeManager;
36 }
37
38 // SetParentVolume
39 void
SetParentVolume(Volume * parent)40 Volume::SetParentVolume(Volume* parent)
41 {
42 AutoLocker<Locker> _(fLock);
43 fParentVolume = parent;
44 }
45
46 // GetParentVolume
47 Volume*
GetParentVolume() const48 Volume::GetParentVolume() const
49 {
50 return fParentVolume;
51 }
52
53 // PutVolume
54 void
PutVolume()55 Volume::PutVolume()
56 {
57 fVolumeManager->PutVolume(this);
58 }
59
60 // Init
61 status_t
Init(const char * name)62 Volume::Init(const char* name)
63 {
64 if (!name || strlen(name) == 0)
65 return B_BAD_VALUE;
66
67 if (!fName.SetTo(name))
68 return B_NO_MEMORY;
69
70 return B_OK;
71 }
72
73 // Uninit
74 void
Uninit()75 Volume::Uninit()
76 {
77 }
78
79 // GetName
80 const char*
GetName() const81 Volume::GetName() const
82 {
83 return fName.GetString();
84 }
85
86 // GetRootID
87 vnode_id
GetRootID() const88 Volume::GetRootID() const
89 {
90 return GetRootNode()->GetID();
91 }
92
93 // SetUnmounting
94 void
SetUnmounting(bool unmounting)95 Volume::SetUnmounting(bool unmounting)
96 {
97 fUnmounting = unmounting;
98 }
99
100 // IsUnmounting
101 bool
IsUnmounting() const102 Volume::IsUnmounting() const
103 {
104 return fUnmounting;
105 }
106
107 // HandleEvent
108 void
HandleEvent(VolumeEvent * event)109 Volume::HandleEvent(VolumeEvent* event)
110 {
111 }
112
113 // PrepareToUnmount
114 void
PrepareToUnmount()115 Volume::PrepareToUnmount()
116 {
117 fVolumeManager->GetQueryManager()->VolumeUnmounting(this);
118 }
119
120
121 // #pragma mark -
122 // #pragma mark ----- client methods -----
123
124 // GetVNode
125 status_t
GetVNode(vnode_id vnid,Node ** node)126 Volume::GetVNode(vnode_id vnid, Node** node)
127 {
128 return get_vnode(fVolumeManager->GetID(), vnid, (void**)node);
129 }
130
131 // PutVNode
132 status_t
PutVNode(vnode_id vnid)133 Volume::PutVNode(vnode_id vnid)
134 {
135 return put_vnode(fVolumeManager->GetID(), vnid);
136 }
137
138 // NewVNode
139 status_t
NewVNode(vnode_id vnid,Node * node)140 Volume::NewVNode(vnode_id vnid, Node* node)
141 {
142 status_t error = new_vnode(fVolumeManager->GetID(), vnid, node);
143 if (error == B_OK)
144 node->SetKnownToVFS(true);
145 return error;
146 }
147
148 // RemoveVNode
149 status_t
RemoveVNode(vnode_id vnid)150 Volume::RemoveVNode(vnode_id vnid)
151 {
152 return remove_vnode(fVolumeManager->GetID(), vnid);
153 }
154
155 // UnremoveVNode
156 status_t
UnremoveVNode(vnode_id vnid)157 Volume::UnremoveVNode(vnode_id vnid)
158 {
159 return unremove_vnode(fVolumeManager->GetID(), vnid);
160 }
161
162 // IsVNodeRemoved
163 int
IsVNodeRemoved(vnode_id vnid)164 Volume::IsVNodeRemoved(vnode_id vnid)
165 {
166 return is_vnode_removed(fVolumeManager->GetID(), vnid);
167 }
168
169 // SendNotification
170 int
SendNotification(port_id port,int32 token,uint32 what,int32 op,nspace_id nsida,nspace_id nsidb,vnode_id vnida,vnode_id vnidb,vnode_id vnidc,const char * name)171 Volume::SendNotification(port_id port, int32 token, uint32 what, int32 op,
172 nspace_id nsida, nspace_id nsidb, vnode_id vnida, vnode_id vnidb,
173 vnode_id vnidc, const char *name)
174 {
175 PRINT("Volume::SendNotification(%" B_PRId32 ", %" B_PRId32 ", 0x%" B_PRIx32
176 ", 0x%" B_PRIx32 ", %" B_PRId32 ", %" B_PRId32 ", %" B_PRIdINO ","
177 " %" B_PRIdINO ", %" B_PRIdINO ", \"%s\")\n", port, token, what, op,
178 nsida, nsidb, vnida, vnidb, vnidc, name);
179 return send_notification(port, token, what, op, nsida, nsidb, vnida,
180 vnidb, vnidc, name);
181 }
182
183 // NotifyListener
184 int
NotifyListener(int32 opcode,nspace_id nsid,vnode_id vnida,vnode_id vnidb,vnode_id vnidc,const char * name)185 Volume::NotifyListener(int32 opcode, nspace_id nsid, vnode_id vnida,
186 vnode_id vnidb, vnode_id vnidc, const char *name)
187 {
188 return notify_listener(opcode, nsid, vnida, vnidb, vnidc, name);
189 }
190
191
192 // #pragma mark -
193 // #pragma mark ----- FS -----
194
195 // Unmount
196 status_t
Unmount()197 Volume::Unmount()
198 {
199 return B_BAD_VALUE;
200 }
201
202 // Sync
203 status_t
Sync()204 Volume::Sync()
205 {
206 return B_BAD_VALUE;
207 }
208
209 // ReadFSStat
210 status_t
ReadFSStat(fs_info * info)211 Volume::ReadFSStat(fs_info* info)
212 {
213 return B_BAD_VALUE;
214 }
215
216 // WriteFSStat
217 status_t
WriteFSStat(struct fs_info * info,int32 mask)218 Volume::WriteFSStat(struct fs_info* info, int32 mask)
219 {
220 return B_BAD_VALUE;
221 }
222
223
224 // #pragma mark -
225 // #pragma mark ----- vnodes -----
226
227 // ReadVNode
228 status_t
ReadVNode(vnode_id vnid,char reenter,Node ** _node)229 Volume::ReadVNode(vnode_id vnid, char reenter, Node** _node)
230 {
231 return B_BAD_VALUE;
232 }
233
234 // WriteVNode
235 status_t
WriteVNode(Node * node,char reenter)236 Volume::WriteVNode(Node* node, char reenter)
237 {
238 return B_BAD_VALUE;
239 }
240
241 // RemoveVNode
242 status_t
RemoveVNode(Node * node,char reenter)243 Volume::RemoveVNode(Node* node, char reenter)
244 {
245 return B_BAD_VALUE;
246 }
247
248
249 // #pragma mark -
250 // #pragma mark ----- nodes -----
251
252 // FSync
253 status_t
FSync(Node * node)254 Volume::FSync(Node* node)
255 {
256 return B_BAD_VALUE;
257 }
258
259 // ReadStat
260 status_t
ReadStat(Node * node,struct stat * st)261 Volume::ReadStat(Node* node, struct stat* st)
262 {
263 return B_BAD_VALUE;
264 }
265
266 // WriteStat
267 status_t
WriteStat(Node * node,struct stat * st,uint32 mask)268 Volume::WriteStat(Node* node, struct stat *st, uint32 mask)
269 {
270 return B_BAD_VALUE;
271 }
272
273 // Access
274 status_t
Access(Node * node,int mode)275 Volume::Access(Node* node, int mode)
276 {
277 return B_BAD_VALUE;
278 }
279
280
281 // #pragma mark -
282 // #pragma mark ----- files -----
283
284 // Create
285 status_t
Create(Node * dir,const char * name,int openMode,int mode,vnode_id * vnid,void ** cookie)286 Volume::Create(Node* dir, const char* name, int openMode, int mode,
287 vnode_id* vnid, void** cookie)
288 {
289 return B_BAD_VALUE;
290 }
291
292 // Open
293 status_t
Open(Node * node,int openMode,void ** cookie)294 Volume::Open(Node* node, int openMode, void** cookie)
295 {
296 return B_BAD_VALUE;
297 }
298
299 // Close
300 status_t
Close(Node * node,void * cookie)301 Volume::Close(Node* node, void* cookie)
302 {
303 return B_BAD_VALUE;
304 }
305
306 // FreeCookie
307 status_t
FreeCookie(Node * node,void * cookie)308 Volume::FreeCookie(Node* node, void* cookie)
309 {
310 return B_BAD_VALUE;
311 }
312
313 // Read
314 status_t
Read(Node * node,void * cookie,off_t pos,void * _buffer,size_t bufferSize,size_t * _bytesRead)315 Volume::Read(Node* node, void* cookie, off_t pos, void* _buffer,
316 size_t bufferSize, size_t* _bytesRead)
317 {
318 return B_BAD_VALUE;
319 }
320
321 // Write
322 status_t
Write(Node * node,void * cookie,off_t pos,const void * _buffer,size_t bufferSize,size_t * bytesWritten)323 Volume::Write(Node* node, void* cookie, off_t pos, const void* _buffer,
324 size_t bufferSize, size_t* bytesWritten)
325 {
326 return B_BAD_VALUE;
327 }
328
329 // IOCtl
330 status_t
IOCtl(Node * node,void * cookie,int cmd,void * buffer,size_t bufferSize)331 Volume::IOCtl(Node* node, void* cookie, int cmd, void* buffer,
332 size_t bufferSize)
333 {
334 return B_DEV_INVALID_IOCTL;
335 }
336
337 // SetFlags
338 status_t
SetFlags(Node * node,void * cookie,int flags)339 Volume::SetFlags(Node* node, void* cookie, int flags)
340 {
341 return B_BAD_VALUE;
342 }
343
344
345 // #pragma mark -
346 // #pragma mark ----- hard links / symlinks -----
347
348 // Link
349 status_t
Link(Node * dir,const char * name,Node * node)350 Volume::Link(Node* dir, const char* name, Node* node)
351 {
352 return B_BAD_VALUE;
353 }
354
355 // Unlink
356 status_t
Unlink(Node * dir,const char * name)357 Volume::Unlink(Node* dir, const char* name)
358 {
359 return B_BAD_VALUE;
360 }
361
362 // Symlink
363 status_t
Symlink(Node * dir,const char * name,const char * target)364 Volume::Symlink(Node* dir, const char* name, const char* target)
365 {
366 return B_BAD_VALUE;
367 }
368
369 // ReadLink
370 status_t
ReadLink(Node * node,char * buffer,size_t bufferSize,size_t * bytesRead)371 Volume::ReadLink(Node* node, char* buffer, size_t bufferSize,
372 size_t* bytesRead)
373 {
374 return B_BAD_VALUE;
375 }
376
377 // Rename
378 status_t
Rename(Node * oldDir,const char * oldName,Node * newDir,const char * newName)379 Volume::Rename(Node* oldDir, const char* oldName, Node* newDir,
380 const char* newName)
381 {
382 return B_BAD_VALUE;
383 }
384
385
386 // #pragma mark -
387 // #pragma mark ----- directories -----
388
389 // MkDir
390 status_t
MkDir(Node * dir,const char * name,int mode)391 Volume::MkDir(Node* dir, const char* name, int mode)
392 {
393 return B_BAD_VALUE;
394 }
395
396 // RmDir
397 status_t
RmDir(Node * dir,const char * name)398 Volume::RmDir(Node* dir, const char* name)
399 {
400 return B_BAD_VALUE;
401 }
402
403 // OpenDir
404 status_t
OpenDir(Node * node,void ** _cookie)405 Volume::OpenDir(Node* node, void** _cookie)
406 {
407 return B_BAD_VALUE;
408 }
409
410 // CloseDir
411 status_t
CloseDir(Node * node,void * cookie)412 Volume::CloseDir(Node* node, void* cookie)
413 {
414 return B_BAD_VALUE;
415 }
416
417 // FreeDirCookie
418 status_t
FreeDirCookie(Node * node,void * _cookie)419 Volume::FreeDirCookie(Node* node, void* _cookie)
420 {
421 return B_BAD_VALUE;
422 }
423
424 // ReadDir
425 status_t
ReadDir(Node * node,void * _cookie,struct dirent * buffer,size_t bufferSize,int32 count,int32 * countRead)426 Volume::ReadDir(Node* node, void* _cookie, struct dirent* buffer,
427 size_t bufferSize, int32 count, int32* countRead)
428 {
429 return B_BAD_VALUE;
430 }
431
432 // RewindDir
433 status_t
RewindDir(Node * node,void * _cookie)434 Volume::RewindDir(Node* node, void* _cookie)
435 {
436 return B_BAD_VALUE;
437 }
438
439 // Walk
440 status_t
Walk(Node * dir,const char * entryName,char ** resolvedPath,vnode_id * vnid)441 Volume::Walk(Node* dir, const char* entryName, char** resolvedPath,
442 vnode_id* vnid)
443 {
444 return B_BAD_VALUE;
445 }
446
447
448 // #pragma mark -
449 // #pragma mark ----- attributes -----
450
451 // OpenAttrDir
452 status_t
OpenAttrDir(Node * node,void ** _cookie)453 Volume::OpenAttrDir(Node* node, void** _cookie)
454 {
455 return B_BAD_VALUE;
456 }
457
458 // CloseAttrDir
459 status_t
CloseAttrDir(Node * node,void * cookie)460 Volume::CloseAttrDir(Node* node, void* cookie)
461 {
462 return B_BAD_VALUE;
463 }
464
465 // FreeAttrDirCookie
466 status_t
FreeAttrDirCookie(Node * node,void * _cookie)467 Volume::FreeAttrDirCookie(Node* node, void* _cookie)
468 {
469 return B_BAD_VALUE;
470 }
471
472 // ReadAttrDir
473 status_t
ReadAttrDir(Node * node,void * _cookie,struct dirent * buffer,size_t bufferSize,int32 count,int32 * countRead)474 Volume::ReadAttrDir(Node* node, void* _cookie, struct dirent* buffer,
475 size_t bufferSize, int32 count, int32* countRead)
476 {
477 return B_BAD_VALUE;
478 }
479
480 // RewindAttrDir
481 status_t
RewindAttrDir(Node * node,void * _cookie)482 Volume::RewindAttrDir(Node* node, void* _cookie)
483 {
484 return B_BAD_VALUE;
485 }
486
487 // ReadAttr
488 status_t
ReadAttr(Node * node,const char * name,int type,off_t pos,void * _buffer,size_t bufferSize,size_t * _bytesRead)489 Volume::ReadAttr(Node* node, const char* name, int type, off_t pos,
490 void* _buffer, size_t bufferSize, size_t* _bytesRead)
491 {
492 return B_BAD_VALUE;
493 }
494
495 // WriteAttr
496 status_t
WriteAttr(Node * node,const char * name,int type,off_t pos,const void * _buffer,size_t bufferSize,size_t * bytesWritten)497 Volume::WriteAttr(Node* node, const char* name, int type, off_t pos,
498 const void* _buffer, size_t bufferSize, size_t* bytesWritten)
499 {
500 return B_BAD_VALUE;
501 }
502
503 // RemoveAttr
504 status_t
RemoveAttr(Node * node,const char * name)505 Volume::RemoveAttr(Node* node, const char* name)
506 {
507 return B_BAD_VALUE;
508 }
509
510 // RenameAttr
511 status_t
RenameAttr(Node * node,const char * oldName,const char * newName)512 Volume::RenameAttr(Node* node, const char* oldName, const char* newName)
513 {
514 return B_BAD_VALUE;
515 }
516
517 // StatAttr
518 status_t
StatAttr(Node * node,const char * name,struct attr_info * attrInfo)519 Volume::StatAttr(Node* node, const char* name, struct attr_info* attrInfo)
520 {
521 return B_BAD_VALUE;
522 }
523
524
525 // #pragma mark -
526 // #pragma mark ----- queries -----
527
528 // OpenQuery
529 status_t
OpenQuery(const char * queryString,uint32 flags,port_id port,int32 token,QueryIterator ** iterator)530 Volume::OpenQuery(const char* queryString, uint32 flags, port_id port,
531 int32 token, QueryIterator** iterator)
532 {
533 return B_BAD_VALUE;
534 }
535
536 // FreeQueryIterator
537 void
FreeQueryIterator(QueryIterator * iterator)538 Volume::FreeQueryIterator(QueryIterator* iterator)
539 {
540 }
541
542 // ReadQuery
543 status_t
ReadQuery(QueryIterator * iterator,struct dirent * buffer,size_t bufferSize,int32 count,int32 * countRead)544 Volume::ReadQuery(QueryIterator* iterator, struct dirent* buffer,
545 size_t bufferSize, int32 count, int32* countRead)
546 {
547 return B_BAD_VALUE;
548 }
549
550