[PATCH] libcsupport: Add no_reg_make_node as a mount option to the mount table

chrisj at rtems.org chrisj at rtems.org
Mon Jan 25 01:10:22 UTC 2021


From: Chris Johns <chrisj at rtems.org>

- Add the bool flag no_reg_make_mode to the mount table so a file
  system can indicate creating regular files is not done by
  use the mknod handler. The file system will handle creating a
  file node in the open handler.

- Note, the mount option is an enum which means there is only one
  exclusive option supported. As a result no encapsulation is
  provided and file systems need to set no_reg_make_node directly.

Closes #4222
---
 cpukit/include/rtems/libio.h  |  1 +
 cpukit/libcsupport/src/open.c | 13 ++++++++-----
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/cpukit/include/rtems/libio.h b/cpukit/include/rtems/libio.h
index 18141c3d3c..d4042691c8 100644
--- a/cpukit/include/rtems/libio.h
+++ b/cpukit/include/rtems/libio.h
@@ -1613,6 +1613,7 @@ struct rtems_filesystem_mount_table_entry_tt {
   rtems_filesystem_global_location_t    *mt_fs_root;
   bool                                   mounted;
   bool                                   writeable;
+  bool                                   no_reg_make_node;
   const rtems_filesystem_limits_and_options_t *pathconf_limits_and_options;
 
   /*
diff --git a/cpukit/libcsupport/src/open.c b/cpukit/libcsupport/src/open.c
index bdb50240b4..c238dce5f7 100644
--- a/cpukit/libcsupport/src/open.c
+++ b/cpukit/libcsupport/src/open.c
@@ -34,7 +34,7 @@ static void create_regular_file(
 )
 {
   int rv = 0;
-  const rtems_filesystem_location_info_t *currentloc = 
+  const rtems_filesystem_location_info_t *currentloc =
     rtems_filesystem_eval_path_get_currentloc( ctx );
   const char *token = rtems_filesystem_eval_path_get_token( ctx );
   size_t tokenlen = rtems_filesystem_eval_path_get_tokenlen( ctx );
@@ -85,10 +85,15 @@ static int do_open(
     | (make ? RTEMS_FS_MAKE : 0)
     | (exclusive ?  RTEMS_FS_EXCLUSIVE : 0);
   rtems_filesystem_eval_path_context_t ctx;
+  const rtems_filesystem_location_info_t *currentloc;
+  bool create_reg_file;
 
   rtems_filesystem_eval_path_start( &ctx, path, eval_flags );
 
-  if ( rtems_filesystem_eval_path_has_token( &ctx ) ) {
+  currentloc = rtems_filesystem_eval_path_get_currentloc( &ctx );
+  create_reg_file = !currentloc->mt_entry->no_reg_make_node;
+
+  if ( create_reg_file && rtems_filesystem_eval_path_has_token( &ctx ) ) {
     create_regular_file( &ctx, mode );
   }
 
@@ -99,11 +104,9 @@ static int do_open(
 #endif
 
   if ( write_access || open_dir ) {
-    const rtems_filesystem_location_info_t *currentloc =
-      rtems_filesystem_eval_path_get_currentloc( &ctx );
     mode_t type = rtems_filesystem_location_type( currentloc );
 
-    if ( write_access && S_ISDIR( type ) ) {
+    if ( create_reg_file && write_access && S_ISDIR( type ) ) {
       rtems_filesystem_eval_path_error( &ctx, EISDIR );
     }
 
-- 
2.24.1



More information about the devel mailing list