From 597624691b9611fc67b0f38b9257cea23287c6c2 Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Tue, 15 Mar 2011 07:32:39 +0000 Subject: [PATCH] 2011-03-15 Chris Johns * libfs/src/rfs/rtems-rfs-rtems-file.c, libfs/src/rfs/rtems-rfs-rtems.c, libfs/src/rfs/rtems-rfs-rtems.h: The fix to the removal of file_info from iop was broken. The node_access field must be the inode number in the RFS because the file system ops provides no way to tell is a stat call is the result of stat, fstat, or lstat. The solution is to move the file handle to node_access_2 which is also shared with doff but these do not overlap. --- cpukit/ChangeLog | 11 ++ cpukit/libfs/src/rfs/rtems-rfs-rtems-file.c | 72 ++-------- cpukit/libfs/src/rfs/rtems-rfs-rtems.c | 137 +++++++------------- cpukit/libfs/src/rfs/rtems-rfs-rtems.h | 44 +++---- 4 files changed, 88 insertions(+), 176 deletions(-) diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog index 9ad3604ebb..21b940403f 100644 --- a/cpukit/ChangeLog +++ b/cpukit/ChangeLog @@ -1,3 +1,14 @@ +2011-03-15 Chris Johns + + * libfs/src/rfs/rtems-rfs-rtems-file.c, + libfs/src/rfs/rtems-rfs-rtems.c, libfs/src/rfs/rtems-rfs-rtems.h: + The fix to the removal of file_info from iop was broken. The + node_access field must be the inode number in the RFS because the + file system ops provides no way to tell is a stat call is the + result of stat, fstat, or lstat. The solution is to move the file + handle to node_access_2 which is also shared with doff but these + do not overlap. + 2011-03-15 Chris Johns PR 1757/filesystem diff --git a/cpukit/libfs/src/rfs/rtems-rfs-rtems-file.c b/cpukit/libfs/src/rfs/rtems-rfs-rtems-file.c index 0c9641490d..2f2df428dd 100644 --- a/cpukit/libfs/src/rfs/rtems-rfs-rtems-file.c +++ b/cpukit/libfs/src/rfs/rtems-rfs-rtems-file.c @@ -71,7 +71,7 @@ rtems_rfs_rtems_file_open (rtems_libio_t* iop, printf("rtems-rfs: file-open: handle:%p\n", file); iop->size = rtems_rfs_file_size (file); - iop->pathinfo.node_access = file; + rtems_rfs_rtems_set_iop_file_handle (iop, file); rtems_rfs_rtems_unlock (fs); return 0; @@ -87,7 +87,7 @@ rtems_rfs_rtems_file_open (rtems_libio_t* iop, static int rtems_rfs_rtems_file_close (rtems_libio_t* iop) { - rtems_rfs_file_handle* file = iop->pathinfo.node_access; + rtems_rfs_file_handle* file = rtems_rfs_rtems_get_iop_file_handle (iop); rtems_rfs_file_system* fs = rtems_rfs_file_fs (file); int rc; @@ -117,7 +117,7 @@ rtems_rfs_rtems_file_read (rtems_libio_t* iop, void* buffer, size_t count) { - rtems_rfs_file_handle* file = iop->pathinfo.node_access; + rtems_rfs_file_handle* file = rtems_rfs_rtems_get_iop_file_handle (iop); rtems_rfs_pos pos; uint8_t* data = buffer; ssize_t read = 0; @@ -182,7 +182,7 @@ rtems_rfs_rtems_file_write (rtems_libio_t* iop, const void* buffer, size_t count) { - rtems_rfs_file_handle* file = iop->pathinfo.node_access; + rtems_rfs_file_handle* file = rtems_rfs_rtems_get_iop_file_handle (iop); rtems_rfs_pos pos; const uint8_t* data = buffer; ssize_t write = 0; @@ -279,7 +279,7 @@ rtems_rfs_rtems_file_lseek (rtems_libio_t* iop, rtems_off64_t offset, int whence) { - rtems_rfs_file_handle* file = iop->pathinfo.node_access; + rtems_rfs_file_handle* file = rtems_rfs_rtems_get_iop_file_handle (iop); rtems_rfs_pos pos; int rc; @@ -302,62 +302,6 @@ rtems_rfs_rtems_file_lseek (rtems_libio_t* iop, return iop->offset; } -/** - * Stat the file. - * - * @param iop - * @param buf - * @return int - */ -static int -rtems_rfs_rtems_file_fstat (rtems_filesystem_location_info_t* pathloc, - struct stat* buf) -{ - rtems_rfs_file_handle* file = pathloc->node_access; - int rc; - - if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_STAT)) - printf ("rtems-rfs: file-fstat: handle:%p\n", file); - - rtems_rfs_rtems_lock (rtems_rfs_file_fs (file)); - - rc = rtems_rfs_rtems_stat_inode (rtems_rfs_file_fs (file), - rtems_rfs_file_inode (file), - buf); - - rtems_rfs_rtems_unlock (rtems_rfs_file_fs (file)); - - return rc; -} - -/** - * File change mode routine. - * - * @param iop - * @param mode - * @return int - */ -static int -rtems_rfs_rtems_file_fchmod (rtems_filesystem_location_info_t* pathloc, - mode_t mode) -{ - rtems_rfs_file_handle* file = pathloc->node_access; - int rc; - - if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FCHMOD)) - printf ("rtems-rfs: file-fchmod: handle:%p\n", file); - - rtems_rfs_rtems_lock (rtems_rfs_file_fs (file)); - - rc = rtems_rfs_rtems_fchmod_inode (rtems_rfs_file_fs (file), - rtems_rfs_file_inode (file), - mode); - - rtems_rfs_rtems_unlock (rtems_rfs_file_fs (file)); - - return rc; -} - /** * This routine processes the ftruncate() system call. * @@ -369,7 +313,7 @@ static int rtems_rfs_rtems_file_ftruncate (rtems_libio_t* iop, rtems_off64_t length) { - rtems_rfs_file_handle* file = iop->pathinfo.node_access; + rtems_rfs_file_handle* file = rtems_rfs_rtems_get_iop_file_handle (iop); int rc; if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_FTRUNC)) @@ -399,8 +343,8 @@ const rtems_filesystem_file_handlers_r rtems_rfs_rtems_file_handlers = { .write_h = rtems_rfs_rtems_file_write, .ioctl_h = rtems_rfs_rtems_file_ioctl, .lseek_h = rtems_rfs_rtems_file_lseek, - .fstat_h = rtems_rfs_rtems_file_fstat, - .fchmod_h = rtems_rfs_rtems_file_fchmod, + .fstat_h = rtems_rfs_rtems_fstat, + .fchmod_h = rtems_rfs_rtems_fchmod, .ftruncate_h = rtems_rfs_rtems_file_ftruncate, .fpathconf_h = rtems_filesystem_default_fpathconf, .fsync_h = rtems_rfs_rtems_fdatasync, diff --git a/cpukit/libfs/src/rfs/rtems-rfs-rtems.c b/cpukit/libfs/src/rfs/rtems-rfs-rtems.c index f136c15f6f..bf688f0f67 100644 --- a/cpukit/libfs/src/rfs/rtems-rfs-rtems.c +++ b/cpukit/libfs/src/rfs/rtems-rfs-rtems.c @@ -792,40 +792,6 @@ rtems_rfs_rtems_readlink (rtems_filesystem_location_info_t* pathloc, return (int) length; } -int -rtems_rfs_rtems_fchmod_inode (rtems_rfs_file_system* fs, - rtems_rfs_inode_handle* inode, - mode_t mode) -{ - uint16_t imode; -#if defined (RTEMS_POSIX_API) - uid_t uid; -#endif - - if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FCHMOD)) - printf ("rtems-rfs-rtems: fchmod indo: in: ino:%" PRId32 " mode:%06" PRIomode_t "\n", - rtems_rfs_inode_ino (inode), mode); - - imode = rtems_rfs_inode_get_mode (inode); - - /* - * Verify I am the owner of the node or the super user. - */ -#if defined (RTEMS_POSIX_API) - uid = geteuid(); - - if ((uid != rtems_rfs_inode_get_uid (inode)) && (uid != 0)) - return EPERM; -#endif - - imode &= ~(S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID | S_ISVTX); - imode |= mode & (S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID | S_ISVTX); - - rtems_rfs_inode_set_mode (inode, imode); - - return 0; -} - int rtems_rfs_rtems_fchmod (rtems_filesystem_location_info_t* pathloc, mode_t mode) @@ -833,6 +799,10 @@ rtems_rfs_rtems_fchmod (rtems_filesystem_location_info_t* pathloc, rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (pathloc); rtems_rfs_ino ino = rtems_rfs_rtems_get_pathloc_ino (pathloc); rtems_rfs_inode_handle inode; + uint16_t imode; +#if defined (RTEMS_POSIX_API) + uid_t uid; +#endif int rc; if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FCHMOD)) @@ -848,13 +818,26 @@ rtems_rfs_rtems_fchmod (rtems_filesystem_location_info_t* pathloc, return rtems_rfs_rtems_error ("fchmod: opening inode", rc); } - rc = rtems_rfs_rtems_fchmod_inode (fs, &inode, mode); - if (rc > 0) + imode = rtems_rfs_inode_get_mode (&inode); + + /* + * Verify I am the owner of the node or the super user. + */ +#if defined (RTEMS_POSIX_API) + uid = geteuid(); + + if ((uid != rtems_rfs_inode_get_uid (&inode)) && (uid != 0)) { rtems_rfs_inode_close (fs, &inode); rtems_rfs_rtems_unlock (fs); - return rtems_rfs_rtems_error ("fchmod: fchmod inode", EPERM); + return rtems_rfs_rtems_error ("fchmod: checking uid", EPERM); } +#endif + + imode &= ~(S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID | S_ISVTX); + imode |= mode & (S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID | S_ISVTX); + + rtems_rfs_inode_set_mode (&inode, imode); rc = rtems_rfs_inode_close (fs, &inode); if (rc > 0) @@ -869,38 +852,49 @@ rtems_rfs_rtems_fchmod (rtems_filesystem_location_info_t* pathloc, } int -rtems_rfs_rtems_stat_inode (rtems_rfs_file_system* fs, - rtems_rfs_inode_handle* inode, - struct stat* buf) +rtems_rfs_rtems_fstat (rtems_filesystem_location_info_t* pathloc, + struct stat* buf) { + rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (pathloc); + rtems_rfs_ino ino = rtems_rfs_rtems_get_pathloc_ino (pathloc); + rtems_rfs_inode_handle inode; rtems_rfs_file_shared* shared; uint16_t mode; + int rc; if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_STAT)) - printf ("rtems-rfs-rtems: stat-inode: in: ino:%" PRId32 "\n", - rtems_rfs_inode_ino (inode)); + printf ("rtems-rfs-rtems: stat: in: ino:%" PRId32 "\n", ino); - mode = rtems_rfs_inode_get_mode (inode); + rtems_rfs_rtems_lock (fs); + + rc = rtems_rfs_inode_open (fs, ino, &inode, true); + if (rc) + { + rtems_rfs_rtems_unlock (fs); + return rtems_rfs_rtems_error ("stat: opening inode", rc); + } + + mode = rtems_rfs_inode_get_mode (&inode); if (RTEMS_RFS_S_ISCHR (mode) || RTEMS_RFS_S_ISBLK (mode)) { buf->st_rdev = - rtems_filesystem_make_dev_t (rtems_rfs_inode_get_block (inode, 0), - rtems_rfs_inode_get_block (inode, 1)); + rtems_filesystem_make_dev_t (rtems_rfs_inode_get_block (&inode, 0), + rtems_rfs_inode_get_block (&inode, 1)); } buf->st_dev = rtems_rfs_fs_device (fs); - buf->st_ino = rtems_rfs_inode_ino (inode); + buf->st_ino = rtems_rfs_inode_ino (&inode); buf->st_mode = rtems_rfs_rtems_mode (mode); - buf->st_nlink = rtems_rfs_inode_get_links (inode); - buf->st_uid = rtems_rfs_inode_get_uid (inode); - buf->st_gid = rtems_rfs_inode_get_gid (inode); + buf->st_nlink = rtems_rfs_inode_get_links (&inode); + buf->st_uid = rtems_rfs_inode_get_uid (&inode); + buf->st_gid = rtems_rfs_inode_get_gid (&inode); /* * Need to check is the ino is an open file. If so we take the values from * the open file rather than the inode. */ - shared = rtems_rfs_file_get_shared (fs, rtems_rfs_inode_ino (inode)); + shared = rtems_rfs_file_get_shared (fs, rtems_rfs_inode_ino (&inode)); if (shared) { @@ -916,50 +910,19 @@ rtems_rfs_rtems_stat_inode (rtems_rfs_file_system* fs, } else { - buf->st_atime = rtems_rfs_inode_get_atime (inode); - buf->st_mtime = rtems_rfs_inode_get_mtime (inode); - buf->st_ctime = rtems_rfs_inode_get_ctime (inode); - buf->st_blocks = rtems_rfs_inode_get_block_count (inode); + buf->st_atime = rtems_rfs_inode_get_atime (&inode); + buf->st_mtime = rtems_rfs_inode_get_mtime (&inode); + buf->st_ctime = rtems_rfs_inode_get_ctime (&inode); + buf->st_blocks = rtems_rfs_inode_get_block_count (&inode); if (S_ISLNK (buf->st_mode)) - buf->st_size = rtems_rfs_inode_get_block_offset (inode); + buf->st_size = rtems_rfs_inode_get_block_offset (&inode); else - buf->st_size = rtems_rfs_inode_get_size (fs, inode); + buf->st_size = rtems_rfs_inode_get_size (fs, &inode); } buf->st_blksize = rtems_rfs_fs_block_size (fs); - return 0; -} - -int -rtems_rfs_rtems_fstat (rtems_filesystem_location_info_t* pathloc, - struct stat* buf) -{ - rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (pathloc); - rtems_rfs_ino ino = rtems_rfs_rtems_get_pathloc_ino (pathloc); - rtems_rfs_inode_handle inode; - int rc; - - if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_STAT)) - printf ("rtems-rfs-rtems: stat: in: ino:%" PRId32 "\n", ino); - - rtems_rfs_rtems_lock (fs); - - rc = rtems_rfs_inode_open (fs, ino, &inode, true); - if (rc) - { - rtems_rfs_rtems_unlock (fs); - return rtems_rfs_rtems_error ("stat: opening inode", rc); - } - - rc = rtems_rfs_rtems_stat_inode (fs, &inode, buf); - if (rc > 0) - { - rtems_rfs_rtems_unlock (fs); - return rtems_rfs_rtems_error ("stat: stat'ing the inode", rc); - } - rc = rtems_rfs_inode_close (fs, &inode); if (rc > 0) { diff --git a/cpukit/libfs/src/rfs/rtems-rfs-rtems.h b/cpukit/libfs/src/rfs/rtems-rfs-rtems.h index 17b87f5ef8..19f51da31c 100644 --- a/cpukit/libfs/src/rfs/rtems-rfs-rtems.h +++ b/cpukit/libfs/src/rfs/rtems-rfs-rtems.h @@ -191,11 +191,29 @@ typedef struct rtems_rfs_rtems_private * Get the ino from the I/O pointer. * * @param _iop The I/O pointer. - * @return + * @return ino */ #define rtems_rfs_rtems_get_iop_ino(_iop) \ ((intptr_t)(_iop)->pathinfo.node_access) +/** + * Get the file handle from the I/O pointer. + * + * @param _iop The I/O pointer. + * @return filehandle The file handle + */ +#define rtems_rfs_rtems_get_iop_file_handle(_iop) \ + ((rtems_rfs_file_handle*)(_iop)->pathinfo.node_access_2) + +/** + * Set the file handle in the I/O pointer. + * + * @param _iop The I/O pointer. + * @param _fh The file handle. + */ +#define rtems_rfs_rtems_set_iop_file_handle(_iop, _fh) \ + (_iop)->pathinfo.node_access_2 = (_fh) + /** * Create the name of the handler's table given the type of handlers. * @@ -271,18 +289,6 @@ extern const rtems_filesystem_file_handlers_r rtems_rfs_rtems_device_handlers; extern const rtems_filesystem_file_handlers_r rtems_rfs_rtems_link_handlers; extern const rtems_filesystem_file_handlers_r rtems_rfs_rtems_file_handlers; -/** - * The following routine does a stat on a node. - * - * @param fs The file system data. - * @param inode The inode to stat held in memory. - * @param buf The stat buffer to fill. - * @return int The result code. - */ -int rtems_rfs_rtems_stat_inode (rtems_rfs_file_system* fs, - rtems_rfs_inode_handle* inode, - struct stat* buf); - /** * The following routine does a stat on a node. * @@ -293,18 +299,6 @@ int rtems_rfs_rtems_stat_inode (rtems_rfs_file_system* fs, int rtems_rfs_rtems_fstat (rtems_filesystem_location_info_t* pathloc, struct stat* buf); -/** - * File change mode routine changes an inode. - * - * @param fs The file system data. - * @param inode The inode to change held in memory. - * @param buf The new mode. - * @return int The result code. - */ -int rtems_rfs_rtems_fchmod_inode (rtems_rfs_file_system* fs, - rtems_rfs_inode_handle* inode, - mode_t mode); - /** * File change mode routine. *