Inode::Inode(Volume* volume, ino_t id) : fVolume(volume), fID(id), fCache(NULL), fMap(NULL), fCached(false), fHasExtraAttributes(false) { rw_lock_init(&fLock, "ext2 inode"); recursive_lock_init(&fSmallDataLock, "ext2 inode small data"); TRACE("Inode::Inode(): ext2_inode: %lu, disk inode: %lu\n", sizeof(ext2_inode), fVolume->InodeSize()); fNodeSize = sizeof(ext2_inode) > fVolume->InodeSize() ? fVolume->InodeSize() : sizeof(ext2_inode); fInitStatus = UpdateNodeFromDisk(); if (fInitStatus == B_OK) { fHasExtraAttributes = (fNodeSize == sizeof(ext2_inode) && fNode.ExtraInodeSize() + EXT2_INODE_NORMAL_SIZE == sizeof(ext2_inode)); if (IsDirectory() || (IsSymLink() && Size() < 60)) { TRACE("Inode::Inode(): Not creating the file cache\n"); fCached = false; fInitStatus = B_OK; } else fInitStatus = EnableFileCache(); } else TRACE("Inode: Failed initialization\n"); }
Inode::Inode(Volume* volume, ino_t id) : fVolume(volume), fID(id), fCache(NULL), fMap(NULL) { rw_lock_init(&fLock, "btrfs inode"); fInitStatus = UpdateNodeFromDisk(); if (fInitStatus == B_OK) { if (!IsDirectory() && !IsSymLink()) { fCache = file_cache_create(fVolume->ID(), ID(), Size()); fMap = file_map_create(fVolume->ID(), ID(), Size()); } } }
void Inode::TransactionDone(bool success) { if (!success) { // Revert any changes to the inode if (fInitStatus == B_OK && UpdateNodeFromDisk() != B_OK) panic("Failed to reload inode from disk!\n"); else if (fInitStatus == B_NO_INIT) { // TODO: Unpublish vnode? panic("Failed to finish creating inode\n"); } } else { if (fInitStatus == B_NO_INIT) { TRACE("Inode::TransactionDone(): Inode creation succeeded\n"); fInitStatus = B_OK; } } }