xref: /haiku/src/add-ons/kernel/file_systems/btrfs/Chunk.cpp (revision c42868a015daa160e093679b2637b1cf9f0b26ba)
1 /*
2  * Copyright 2011, Haiku Inc. All rights reserved.
3  * This file may be used under the terms of the MIT License.
4  *
5  * Authors:
6  *		Jérôme Duval
7  *		Chế Vũ Gia Hy
8  */
9 
10 
11 #include "Chunk.h"
12 
13 
14 //#define TRACE_BTRFS
15 #ifdef TRACE_BTRFS
16 #	define TRACE(x...) dprintf("\33[34mbtrfs:\33[0m " x)
17 #else
18 #	define TRACE(x...) ;
19 #endif
20 #	define FATAL(x...) dprintf("\33[34mbtrfs:\33[0m " x)
21 
22 
23 Chunk::Chunk(btrfs_chunk* chunk, fsblock_t offset)
24 	:
25 	fChunk(NULL),
26 	fInitStatus(B_OK)
27 {
28 	fChunkOffset = offset;
29 	fChunk = (btrfs_chunk*)malloc(sizeof(btrfs_chunk)
30 		+ chunk->StripeCount() * sizeof(btrfs_stripe));
31 	if (fChunk == NULL) {
32 		fInitStatus = B_NO_MEMORY;
33 		return;
34 	}
35 
36 	memcpy(fChunk, chunk, sizeof(btrfs_chunk)
37 		+ chunk->StripeCount() * sizeof(btrfs_stripe));
38 
39 	TRACE("chunk[0] length %" B_PRIu64 " owner %" B_PRIu64 " stripe_length %"
40 		B_PRIu64 " type %" B_PRIu64 " stripe_count %u sub_stripes %u "
41 		"sector_size %" B_PRIu32 "\n", chunk->Length(), chunk->Owner(),
42 		chunk->StripeLength(), chunk->Type(), chunk->StripeCount(),
43 		chunk->SubStripes(), chunk->SectorSize());
44 	for (int32 i = 0; i < chunk->StripeCount(); i++) {
45 		TRACE("chunk.stripe[%" B_PRId32 "].physical %" B_PRId64 " deviceid %"
46 			B_PRId64 "\n", i, chunk->stripes[i].Offset(),
47 			chunk->stripes[i].DeviceID());
48 	}
49 }
50 
51 
52 Chunk::~Chunk()
53 {
54 	free(fChunk);
55 }
56 
57 
58 uint32
59 Chunk::Size() const
60 {
61 	return sizeof(btrfs_chunk)
62 		+ fChunk->StripeCount() * sizeof(btrfs_stripe);
63 }
64 
65 
66 status_t
67 Chunk::FindBlock(off_t logical, off_t& physical)
68 {
69 	if (fChunk == NULL)
70 		return B_NO_INIT;
71 
72 	if (logical < (off_t)fChunkOffset
73 		|| logical > (off_t)(fChunkOffset + fChunk->Length()))
74 		return B_BAD_VALUE;
75 
76 	// only one stripe
77 	physical = logical + fChunk->stripes[0].Offset() - fChunkOffset;
78 	return B_OK;
79 }
80 
81