Skip to content

Commit 83657ae

Browse files
committed
DAOS-18604 dfs: EC should not be used for directories
- if dir-oclass is set to EC on container create, use default instead. - daos fs set-attr of an EC oclass on directory should apply only to files. directories will be create with the default in that case. - fix daos fs get-attr to show such changes Signed-off-by: Mohamad Chaarawi <mohamad.chaarawi@hpe.com>
1 parent 4f6622c commit 83657ae

File tree

4 files changed

+40
-6
lines changed

4 files changed

+40
-6
lines changed

src/client/dfs/common.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/**
22
* (C) Copyright 2018-2024 Intel Corporation.
3+
* (C) Copyright 2026 Hewlett Packard Enterprise Development LP
34
*
45
* SPDX-License-Identifier: BSD-2-Clause-Patent
56
*/
@@ -643,8 +644,15 @@ create_dir(dfs_t *dfs, dfs_obj_t *parent, daos_oclass_id_t cid, dfs_obj_t *dir)
643644
if (cid == 0) {
644645
if (parent->d.oclass == 0)
645646
cid = dfs->attr.da_dir_oclass_id;
646-
else
647+
else {
647648
cid = parent->d.oclass;
649+
/*
650+
* If the parent oclass is EC, do not use that for a directory and use the
651+
* container default instead.
652+
*/
653+
if (daos_oid_is_ec(cid))
654+
cid = dfs->attr.da_dir_oclass_id;
655+
}
648656
}
649657

650658
/** Allocate an OID for the dir - local operation */

src/client/dfs/cont.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/**
22
* (C) Copyright 2018-2024 Intel Corporation.
3-
* (C) Copyright 2025 Hewlett Packard Enterprise Development LP
3+
* (C) Copyright 2025-2026 Hewlett Packard Enterprise Development LP
44
*
55
* SPDX-License-Identifier: BSD-2-Clause-Patent
66
*/
@@ -189,8 +189,14 @@ dfs_cont_create(daos_handle_t poh, uuid_t *cuuid, dfs_attr_t *attr, daos_handle_
189189
}
190190
if (attr->da_file_oclass_id)
191191
dattr.da_file_oclass_id = attr->da_file_oclass_id;
192-
if (attr->da_dir_oclass_id)
192+
if (attr->da_dir_oclass_id) {
193193
dattr.da_dir_oclass_id = attr->da_dir_oclass_id;
194+
if (daos_oid_is_ec(dattr.da_dir_oclass_id)) {
195+
D_WARN("EC object class for directories is not supported,"
196+
" reverting to use default");
197+
dattr.da_dir_oclass_id = 0;
198+
}
199+
}
194200

195201
/** check non default mode */
196202
if ((attr->da_mode & MODE_MASK) == DFS_RELAXED ||

src/client/dfs/obj.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/**
22
* (C) Copyright 2018-2024 Intel Corporation.
3-
* (C) Copyright 2025 Hewlett Packard Enterprise Development LP
3+
* (C) Copyright 2025-2026 Hewlett Packard Enterprise Development LP
44
*
55
* SPDX-License-Identifier: BSD-2-Clause-Patent
66
*/
@@ -81,7 +81,16 @@ dfs_obj_get_info(dfs_t *dfs, dfs_obj_t *obj, dfs_obj_info_t *info)
8181

8282
/** what is the default oclass files and dirs will be created with in this dir */
8383
if (obj->d.oclass) {
84-
info->doi_dir_oclass_id = obj->d.oclass;
84+
/** if parent oclass is EC, dir would be chosen as container default */
85+
if (!daos_oid_is_ec(obj->d.oclass)) {
86+
info->doi_dir_oclass_id = obj->d.oclass;
87+
} else {
88+
if (dfs->attr.da_dir_oclass_id)
89+
info->doi_dir_oclass_id = dfs->attr.da_dir_oclass_id;
90+
else
91+
rc = daos_obj_get_oclass(dfs->coh, DAOS_OT_MULTI_HASHED, 0,
92+
0, &info->doi_dir_oclass_id);
93+
}
8594
info->doi_file_oclass_id = obj->d.oclass;
8695
} else {
8796
if (dfs->attr.da_dir_oclass_id)

src/include/daos/object.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/**
22
* (C) Copyright 2016-2023 Intel Corporation.
3-
* (C) Copyright 2025 Hewlett Packard Enterprise Development LP
3+
* (C) Copyright 2025-2026 Hewlett Packard Enterprise Development LP
44
*
55
* SPDX-License-Identifier: BSD-2-Clause-Patent
66
*/
@@ -404,6 +404,17 @@ daos_oclass_is_ec(struct daos_oclass_attr *oca)
404404
return oca->ca_resil == DAOS_RES_EC;
405405
}
406406

407+
static inline bool
408+
daos_oid_is_ec(daos_oclass_id_t cid)
409+
{
410+
struct daos_oclass_attr *oca;
411+
412+
oca = daos_oclass_id2attr(cid, NULL);
413+
if (oca == NULL)
414+
return false;
415+
return daos_oclass_is_ec(oca);
416+
}
417+
407418
static inline void
408419
daos_obj_set_oid(daos_obj_id_t *oid, enum daos_otype_t type,
409420
enum daos_obj_redun ord, uint32_t nr_grps,

0 commit comments

Comments
 (0)