From: Chris Johns <chr...@rtems.org> NFSv4 mounts NFS file systems to the flat root of a pseudo file system. This change allow the same basename to be used. --- rtemsbsd/fs/nfsclient/nfs.c | 31 +++++++++++++++++++------ rtemsbsd/rtems/rtems-bsd-syscall-api.c | 32 +++++++++++--------------- 2 files changed, 37 insertions(+), 26 deletions(-)
diff --git a/rtemsbsd/fs/nfsclient/nfs.c b/rtemsbsd/fs/nfsclient/nfs.c index ffbf7f4d..a3a29b62 100644 --- a/rtemsbsd/fs/nfsclient/nfs.c +++ b/rtemsbsd/fs/nfsclient/nfs.c @@ -830,8 +830,10 @@ rtems_nfs_initialize( rtems_filesystem_mount_table_entry_t *mt_entry, const void *data) { struct nfs_args args; - const char *fspath = NULL; + static int mount_counter; + char fspath[NAME_MAX + 1]; char *at; + int len; int error; if (RTEMS_DEBUG) { @@ -923,15 +925,30 @@ rtems_nfs_initialize( rtems_bsd_vfs_mount_init(mt_entry); - fspath = mt_entry->target; - if (*fspath == '/') { - ++fspath; + at = mt_entry->target + strlen(mt_entry->target); + len = 0; + while (at != mt_entry->target && !rtems_filesystem_is_delimiter(at[-1])) { + at--; + len++; } - if (strchr(fspath, '/') != 0) { + + /* + * Account for the mount number and leading `/` + */ + if (len >= sizeof(fspath) - (6 + 2)) { error = EINVAL; goto out; } + /* + * Append a unique number to the end of the path created in + * the FreeBSD root file system. All mounts are in the root + * directory of the root file system and so flat. A user could + * use different mount paths with the same end name. Without + * the counter appended they would clash. + */ + snprintf(fspath, sizeof(fspath), "/%s-%d", at, mount_counter++); + if (getnfsargs(mt_entry->dev, &args) < 0) { if (RTEMS_DEBUG) printf( @@ -949,7 +966,7 @@ rtems_nfs_initialize( * export then find the vnode and hold it. Make sure we find the root * node of the NFS share and the not the root file system's mount node. */ - error = rtems_bsd_rootfs_mkdir(fspath); + error = rtems_bsd_rootfs_mkdir(fspath + 1); if (error == 0) { struct addrinfo *ai; enum tryret tryret; @@ -964,7 +981,7 @@ rtems_nfs_initialize( if (tryret == TRYRET_SUCCESS) { error = nfs_trymount(mt_entry, ai, &args, fspath, data); if (RTEMS_DEBUG) - printf("nfs: mount: (%d) %s\n", error, strerror(error)); + printf("nfs: mount: (%d) %s\n", error, strerror(error)); break; } else { error = EIO; diff --git a/rtemsbsd/rtems/rtems-bsd-syscall-api.c b/rtemsbsd/rtems/rtems-bsd-syscall-api.c index 142e4faf..81361e94 100644 --- a/rtemsbsd/rtems/rtems-bsd-syscall-api.c +++ b/rtemsbsd/rtems/rtems-bsd-syscall-api.c @@ -889,6 +889,7 @@ rtems_bsd_sysgen_open_node( struct vnode *cdir; struct vnode *rdir; const char *opath; + rtems_filesystem_location_info_t *rootloc; int opathlen; int fd; int error; @@ -902,6 +903,8 @@ rtems_bsd_sysgen_open_node( fdp = td->td_proc->p_fd; + rootloc = &iop->pathinfo.mt_entry->mt_fs_root->location; + /* * There is no easy or clean means to open a vnode and follow the * POSIX open semantics. See `kern_openat`. You can open a vnode but @@ -912,11 +915,16 @@ rtems_bsd_sysgen_open_node( * parent directory vnode to position ourselves in the parent * directory. The pathloc vnode points to the '.' or '..' directory. */ - opath = path + strlen(path); - opathlen = 0; - while (opath != path && !rtems_filesystem_is_delimiter(opath[-1])) { - opath--; - opathlen++; + if (rtems_bsd_libio_loc_to_vnode(&iop->pathinfo) == + rtems_bsd_libio_loc_to_vnode(rootloc)) { + opath = "."; + } else { + opath = path + strlen(path); + opathlen = 0; + while (opath != path && !rtems_filesystem_is_delimiter(opath[-1])) { + opath--; + opathlen++; + } } if (rtems_filesystem_is_current_directory(opath, opathlen) || rtems_filesystem_is_parent_directory(opath, opathlen)) { @@ -929,8 +937,6 @@ rtems_bsd_sysgen_open_node( opath = "."; cdir = rtems_bsd_libio_loc_to_vnode(&iop->pathinfo); } else { - rtems_filesystem_location_info_t *rootloc = - &iop->pathinfo.mt_entry->mt_fs_root->location; /* * We need the parent directory so open can find the * entry. If we are creating the file the pathinfo @@ -943,18 +949,6 @@ rtems_bsd_sysgen_open_node( } if (fdp->fd_cdir == NULL) { cdir = rtems_bsd_libio_loc_to_vnode_dir(rootloc); - } else if (rtems_bsd_libio_loc_to_vnode(&iop->pathinfo) == - rtems_bsd_libio_loc_to_vnode(rootloc)) { - /* - * If this is a directory and this is the root node of - * the mounted file system we need to move up the - * hidden pseudo file system node. - */ - if (isdir) { - cdir = rootvnode; - } else { - cdir = rtems_bsd_libio_loc_to_vnode(rootloc); - } } } -- 2.37.1 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel