void DeviceOpener::RemoveCache(bool allowWrites) { if (fBlockCache == NULL) return; block_cache_delete(fBlockCache, allowWrites); fBlockCache = NULL; }
Volume::~Volume() { delete fRootDirectory; delete fBlockAllocator; if (fBlockCache != NULL) block_cache_delete(fBlockCache, false); if (fFD >= 0) close(fFD); free(fName); }
status_t Volume::Unmount() { TRACE("Volume::Unmount()\n"); TRACE("Volume::Unmount(): Putting root node\n"); put_vnode(fFSVolume, RootNode()->ID()); TRACE("Volume::Unmount(): Deleting the block cache\n"); block_cache_delete(fBlockCache, !IsReadOnly()); TRACE("Volume::Unmount(): Closing device\n"); close(fDevice); TRACE("Volume::Unmount(): Done\n"); return B_OK; }
static status_t fs_mount(fs_volume* _volume, const char* device, uint32 flags, const char* args, ino_t* _rootID) { bool allowJoliet = true; iso9660_volume* volume; // Check for a 'nojoliet' parm // all we check for is the existance of 'nojoliet' in the parms. if (args != NULL) { uint32 i; char* spot; char* buf = strdup(args); uint32 len = strlen(buf); // lower case the parms data for (i = 0; i < len + 1; i++) buf[i] = tolower(buf[i]); // look for nojoliet spot = strstr(buf, "nojoliet"); if (spot != NULL) allowJoliet = false; free(buf); } // Try and mount volume as an ISO volume. status_t result = ISOMount(device, O_RDONLY, &volume, allowJoliet); if (result == B_OK) { *_rootID = ISO_ROOTNODE_ID; _volume->private_volume = volume; _volume->ops = &gISO9660VolumeOps; volume->volume = _volume; volume->id = _volume->id; result = publish_vnode(_volume, *_rootID, &volume->rootDirRec, &gISO9660VnodeOps, volume->rootDirRec.attr.stat[FS_DATA_FORMAT].st_mode, 0); if (result != B_OK) { block_cache_delete(volume->fBlockCache, false); free(volume); result = B_ERROR; } } return result; }
status_t Volume::Unmount() { put_vnode(fVolume, ToVnode(Root())); fBlockAllocator.Uninitialize(); // This will also flush the log & all blocks to disk delete fJournal; fJournal = NULL; delete fIndicesNode; block_cache_delete(fBlockCache, !IsReadOnly()); close(fDevice); return B_OK; }
status_t Volume::Unmount() { TRACE("Volume::Unmount()\n"); status_t status = fJournal->Uninit(); delete fJournal; delete fJournalInode; TRACE("Volume::Unmount(): Putting root node\n"); put_vnode(fFSVolume, RootNode()->ID()); TRACE("Volume::Unmount(): Deleting the block cache\n"); block_cache_delete(fBlockCache, !IsReadOnly()); TRACE("Volume::Unmount(): Closing device\n"); close(fDevice); TRACE("Volume::Unmount(): Done\n"); return status; }
static status_t fs_unmount(fs_volume* _volume) { status_t result = B_NO_ERROR; iso9660_volume* volume = (iso9660_volume*)_volume->private_volume; TRACE(("fs_unmount - ENTER\n")); // Unlike in BeOS, we need to put the reference to our root node ourselves put_vnode(_volume, ISO_ROOTNODE_ID); block_cache_delete(volume->fBlockCache, false); close(volume->fdOfSession); result = close(volume->fd); free(volume); TRACE(("fs_unmount - EXIT, result is %s\n", strerror(result))); return result; }