1 /*
2 * Copyright (c) 2022-2023, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8 #include <string.h>
9 #include "storage_partition.h"
10
11
storage_partition_init(struct storage_partition * partition,const struct uuid_octets * partition_guid,size_t num_blocks,size_t block_size)12 void storage_partition_init(
13 struct storage_partition *partition,
14 const struct uuid_octets *partition_guid,
15 size_t num_blocks,
16 size_t block_size)
17 {
18 memset(partition, 0, sizeof(struct storage_partition));
19
20 if (partition_guid) partition->partition_guid = *partition_guid;
21 partition->block_size = block_size;
22 partition->num_blocks = num_blocks;
23
24 partition->base_lba = 0;
25 storage_partition_acl_init(&partition->acl);
26 }
27
storage_partition_deinit(struct storage_partition * partition)28 void storage_partition_deinit(
29 struct storage_partition *partition)
30 {
31 memset(partition, 0, sizeof(struct storage_partition));
32 }
33
storage_partition_grant_access(struct storage_partition * partition,uint32_t client_id)34 bool storage_partition_grant_access(
35 struct storage_partition *partition,
36 uint32_t client_id)
37 {
38 return storage_partition_acl_add(&partition->acl, client_id);
39 }
40
storage_partition_assign_ownership(struct storage_partition * partition,const char * owner_id)41 bool storage_partition_assign_ownership(
42 struct storage_partition *partition,
43 const char *owner_id)
44 {
45 return storage_partition_acl_set_owner_id(&partition->acl, owner_id);
46 }
47
storage_partition_is_guid_matched(const struct storage_partition * partition,const struct uuid_octets * partition_guid)48 bool storage_partition_is_guid_matched(
49 const struct storage_partition *partition,
50 const struct uuid_octets *partition_guid)
51 {
52 return (memcmp(&partition->partition_guid, partition_guid, sizeof(struct uuid_octets)) == 0);
53 }
54
storage_partition_is_open_permitted(struct storage_partition * partition,uint32_t client_id,storage_partition_authorizer authorizer)55 bool storage_partition_is_open_permitted(
56 struct storage_partition *partition,
57 uint32_t client_id,
58 storage_partition_authorizer authorizer)
59 {
60 return storage_partition_acl_authorize(&partition->acl, client_id, authorizer);
61 }
62
storage_partition_is_access_permitted(const struct storage_partition * partition,uint32_t client_id)63 bool storage_partition_is_access_permitted(
64 const struct storage_partition *partition,
65 uint32_t client_id)
66 {
67 return storage_partition_acl_check(&partition->acl, client_id);
68 }
69
storage_partition_is_lba_legal(const struct storage_partition * partition,uint64_t lba)70 bool storage_partition_is_lba_legal(
71 const struct storage_partition *partition,
72 uint64_t lba)
73 {
74 return lba < partition->num_blocks;
75 }
76
storage_partition_clip_length(const struct storage_partition * partition,uint64_t lba,size_t offset,size_t req_len)77 size_t storage_partition_clip_length(
78 const struct storage_partition *partition,
79 uint64_t lba,
80 size_t offset,
81 size_t req_len)
82 {
83 size_t clipped_len = 0;
84
85 if (lba < partition->num_blocks) {
86
87 size_t remaining_len = (partition->num_blocks - lba) * partition->block_size;
88
89 remaining_len = (offset < remaining_len) ? remaining_len - offset : 0;
90 clipped_len = (req_len > remaining_len) ? remaining_len : req_len;
91 }
92
93 return clipped_len;
94 }
95
storage_partition_clip_num_blocks(const struct storage_partition * partition,uint64_t lba,size_t num_blocks)96 size_t storage_partition_clip_num_blocks(
97 const struct storage_partition *partition,
98 uint64_t lba,
99 size_t num_blocks)
100 {
101 size_t clipped_num_blocks = 0;
102
103 if (lba < partition->num_blocks) {
104
105 size_t remaining_blocks = partition->num_blocks - lba;
106
107 clipped_num_blocks = (num_blocks > remaining_blocks) ? remaining_blocks : num_blocks;
108 }
109
110 return clipped_num_blocks;
111 }
112