xref: /haiku/src/add-ons/kernel/file_systems/btrfs/Chunk.cpp (revision 72156a402f54ea4be9dc3e3e9704c612f7d9ad16)
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  */
8 
9 
10 #include "Chunk.h"
11 
12 #include <stdlib.h>
13 #include <string.h>
14 
15 
16 //#define TRACE_BTRFS
17 #ifdef TRACE_BTRFS
18 #	define TRACE(x...) dprintf("\33[34mbtrfs:\33[0m " x)
19 #else
20 #	define TRACE(x...) ;
21 #endif
22 #	define FATAL(x...) dprintf("\33[34mbtrfs:\33[0m " x)
23 
24 
25 Chunk::Chunk(struct btrfs_chunk* chunk, fsblock_t offset)
26 	:
27 	fChunk(NULL),
28 	fInitStatus(B_OK)
29 {
30 	fChunkOffset = offset;
31 	fChunk = (struct btrfs_chunk*)malloc(sizeof(struct btrfs_chunk)
32 		+ chunk->StripeCount() * sizeof(struct btrfs_stripe));
33 	if (fChunk == NULL)
34 		fInitStatus = B_NO_MEMORY;
35 	memcpy(fChunk, chunk, sizeof(struct btrfs_chunk)
36 		+ chunk->StripeCount() * sizeof(struct btrfs_stripe));
37 
38 	TRACE("chunk[0] length %llu owner %llu stripe_length %llu type %llu "
39 			"stripe_count %u sub_stripes %u sector_size %lu\n", chunk->Length(),
40 			chunk->Owner(), chunk->StripeLength(), chunk->Type(),
41 			chunk->StripeCount(), chunk->SubStripes(), chunk->SectorSize());
42 	for(int32 i = 0; i < chunk->StripeCount(); i++) {
43 		TRACE("chunk.stripe[%ld].physical %lld deviceid %lld\n", i,
44 			chunk->stripes[i].Offset(), chunk->stripes[i].DeviceID());
45 	}
46 }
47 
48 
49 Chunk::~Chunk()
50 {
51 	free(fChunk);
52 }
53 
54 
55 uint32
56 Chunk::Size() const
57 {
58 	return sizeof(struct btrfs_chunk)
59 		+ fChunk->StripeCount() * sizeof(struct btrfs_stripe);
60 }
61 
62 
63 status_t
64 Chunk::FindBlock(off_t logical, off_t &physical)
65 {
66 	if (fChunk == NULL)
67 		return B_NO_INIT;
68 
69 	if (logical < fChunkOffset
70 		|| logical > (fChunkOffset + fChunk->Length()))
71 			return B_BAD_VALUE;
72 
73 	// only one stripe
74 	physical = logical + fChunk->stripes[0].Offset() - fChunkOffset;
75 	return B_OK;
76 }
77 
78