コード例 #1
0
ファイル: Inode.cpp プロジェクト: jiangxilong/haiku
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");
}
コード例 #2
0
ファイル: Inode.cpp プロジェクト: AmirAbrams/haiku
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());
		}
	}
}
コード例 #3
0
ファイル: Inode.cpp プロジェクト: jiangxilong/haiku
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;
		}
	}
}