osaf/libs/core/include/ncs_osprm.h      |   1 +
 osaf/libs/core/leap/os_defs.c           |  13 ++++++++++---
 osaf/services/saf/cpsv/cpnd/cpnd_proc.c |   1 +
 osaf/services/saf/cpsv/cpnd/cpnd_res.c  |   2 ++
 osaf/services/saf/glsv/glnd/glnd_shm.c  |   1 +
 osaf/services/saf/mqsv/mqnd/mqnd_shm.c  |   1 +
 6 files changed, 16 insertions(+), 3 deletions(-)


Provided   ensured  disk space is allocated for  NCS_OS_POSIX_SHM_REQ_OPEN 
request using  posix_fallocate()
so that  application such as CPSV subsequent writes to bytes in the specified 
range are guaranteed not to fail because of lack of disk space.
Updated the Opensaf services according to new options based on requirements .

diff --git a/osaf/libs/core/include/ncs_osprm.h 
b/osaf/libs/core/include/ncs_osprm.h
--- a/osaf/libs/core/include/ncs_osprm.h
+++ b/osaf/libs/core/include/ncs_osprm.h
@@ -564,6 +564,7 @@ uint32_t ncs_os_posix_mq(NCS_OS_POSIX_MQ
                uint32_t i_flags;
                uint32_t i_map_flags;
                uint64_t i_size;
+               bool ensures_space;
                uint64_t i_offset;
                void *o_addr;
                int32_t o_fd;
diff --git a/osaf/libs/core/leap/os_defs.c b/osaf/libs/core/leap/os_defs.c
--- a/osaf/libs/core/leap/os_defs.c
+++ b/osaf/libs/core/leap/os_defs.c
@@ -795,9 +795,16 @@ uint32_t ncs_os_posix_shm(NCS_OS_POSIX_S
                if (req->info.open.o_fd < 0) {
                        return NCSCC_RC_FAILURE;
                } else {
-                       if (ftruncate(req->info.open.o_fd, (off_t) shm_size /* 
off_t == long */ ) < 0) {
-                               printf("ftruncate failed with errno value %d 
\n", errno);
-                               return NCSCC_RC_FAILURE;
+                       if (req->info.open.ensures_space == true) {
+                               if (posix_fallocate(req->info.open.o_fd, 0, 
shm_size) == ENOSPC) {
+                                       LOG_ER("posix_shm:posix_fallocate 
failed() with not enough space left ENOSPC: %d \n", errno);
+                                       return NCSCC_RC_FAILURE;
+                               }
+                       } else {
+                               if (ftruncate(req->info.open.o_fd, (off_t) 
shm_size /* off_t == long */ ) < 0) {
+                                       printf("ftruncate failed with errno 
value %d \n", errno);
+                                       return NCSCC_RC_FAILURE;
+                                }
                        }
 
                        prot_flag = ncs_shm_prot_flags(req->info.open.i_flags);
diff --git a/osaf/services/saf/cpsv/cpnd/cpnd_proc.c 
b/osaf/services/saf/cpsv/cpnd/cpnd_proc.c
--- a/osaf/services/saf/cpsv/cpnd/cpnd_proc.c
+++ b/osaf/services/saf/cpsv/cpnd/cpnd_proc.c
@@ -481,6 +481,7 @@ uint32_t cpnd_ckpt_replica_create(CPND_C
        cp_node->replica_info.open.info.open.i_size =
            sizeof(CPSV_CKPT_HDR) + cp_node->create_attrib.maxSections * 
(sizeof(CPSV_SECT_HDR) +
                                                                          
cp_node->create_attrib.maxSectionSize);
+       cp_node->replica_info.open.info.open.ensures_space = true;
        cp_node->replica_info.open.info.open.i_offset = 0;
        cp_node->replica_info.open.info.open.i_name = buf;
        cp_node->replica_info.open.info.open.i_map_flags = MAP_SHARED;
diff --git a/osaf/services/saf/cpsv/cpnd/cpnd_res.c 
b/osaf/services/saf/cpsv/cpnd/cpnd_res.c
--- a/osaf/services/saf/cpsv/cpnd/cpnd_res.c
+++ b/osaf/services/saf/cpsv/cpnd/cpnd_res.c
@@ -160,6 +160,7 @@ uint32_t cpnd_ckpt_replica_create_res(NC
        open_req->type = NCS_OS_POSIX_SHM_REQ_OPEN;
        open_req->info.open.i_size =
            sizeof(CPSV_CKPT_HDR) + (cp_info->maxSections * 
((sizeof(CPSV_SECT_HDR) + cp_info->maxSecSize)));
+       open_req->info.open.ensures_space = true;
        open_req->info.open.i_offset = 0;
        open_req->info.open.i_name = buf;
        open_req->info.open.i_map_flags = MAP_SHARED;
@@ -344,6 +345,7 @@ void *cpnd_restart_shm_create(NCS_OS_POS
        cpnd_open_req->info.open.i_size =
            sizeof(CLIENT_HDR) + (MAX_CLIENTS * sizeof(CLIENT_INFO)) + 
sizeof(CKPT_HDR) +
            (MAX_CKPTS * sizeof(CKPT_INFO));
+       cpnd_open_req->info.open.ensures_space = true;
        cpnd_open_req->info.open.i_offset = 0;
        cpnd_open_req->info.open.i_name = buffer;
        cpnd_open_req->info.open.i_map_flags = MAP_SHARED;
diff --git a/osaf/services/saf/glsv/glnd/glnd_shm.c 
b/osaf/services/saf/glsv/glnd/glnd_shm.c
--- a/osaf/services/saf/glsv/glnd/glnd_shm.c
+++ b/osaf/services/saf/glsv/glnd/glnd_shm.c
@@ -71,6 +71,7 @@ static uint32_t glnd_shm_open(GLND_CB *c
 
        glnd_open_req.type = NCS_OS_POSIX_SHM_REQ_OPEN;
        glnd_open_req.info.open.i_size = shm_size;
+       glnd_open_req.info.open.ensures_space = false;
        glnd_open_req.info.open.i_offset = 0;
        glnd_open_req.info.open.i_name = shm_name;
        glnd_open_req.info.open.i_map_flags = MAP_SHARED;
diff --git a/osaf/services/saf/mqsv/mqnd/mqnd_shm.c 
b/osaf/services/saf/mqsv/mqnd/mqnd_shm.c
--- a/osaf/services/saf/mqsv/mqnd/mqnd_shm.c
+++ b/osaf/services/saf/mqsv/mqnd/mqnd_shm.c
@@ -66,6 +66,7 @@ uint32_t mqnd_shm_create(MQND_CB *cb)
        mqnd_open_req.type = NCS_OS_POSIX_SHM_REQ_OPEN;
        mqnd_open_req.info.open.i_size =
            sizeof(MQND_SHM_VERSION) + (sizeof(MQND_QUEUE_CKPT_INFO) * 
cb->mqnd_shm.max_open_queues);
+       mqnd_open_req.info.open.ensures_space = false;
        mqnd_open_req.info.open.i_offset = 0;
        mqnd_open_req.info.open.i_name = shm_name;
        mqnd_open_req.info.open.i_map_flags = MAP_SHARED;

------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to