Changeset 59762469 in rtems


Ignore:
Timestamp:
Mar 15, 2011, 7:32:39 AM (9 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.11, master
Children:
4e553c60
Parents:
ecfeb16b
Message:

2011-03-15 Chris Johns <chrisj@…>

  • 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.
Location:
cpukit
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • cpukit/ChangeLog

    recfeb16b r59762469  
     12011-03-15      Chris Johns <chrisj@rtems.org>
     2
     3        * libfs/src/rfs/rtems-rfs-rtems-file.c,
     4        libfs/src/rfs/rtems-rfs-rtems.c, libfs/src/rfs/rtems-rfs-rtems.h:
     5        The fix to the removal of file_info from iop was broken. The
     6        node_access field must be the inode number in the RFS because the
     7        file system ops provides no way to tell is a stat call is the
     8        result of stat, fstat, or lstat. The solution is to move the file
     9        handle to node_access_2 which is also shared with doff but these
     10        do not overlap.
     11       
    1122011-03-15      Chris Johns <chrisj@rtems.org>
    213
  • cpukit/libfs/src/rfs/rtems-rfs-rtems-file.c

    recfeb16b r59762469  
    7272 
    7373  iop->size = rtems_rfs_file_size (file);
    74   iop->pathinfo.node_access = file;
     74  rtems_rfs_rtems_set_iop_file_handle (iop, file);
    7575 
    7676  rtems_rfs_rtems_unlock (fs);
     
    8888rtems_rfs_rtems_file_close (rtems_libio_t* iop)
    8989{
    90   rtems_rfs_file_handle* file = iop->pathinfo.node_access;
     90  rtems_rfs_file_handle* file = rtems_rfs_rtems_get_iop_file_handle (iop);
    9191  rtems_rfs_file_system* fs = rtems_rfs_file_fs (file);
    9292  int                    rc;
     
    118118                           size_t         count)
    119119{
    120   rtems_rfs_file_handle* file = iop->pathinfo.node_access;
     120  rtems_rfs_file_handle* file = rtems_rfs_rtems_get_iop_file_handle (iop);
    121121  rtems_rfs_pos          pos;
    122122  uint8_t*               data = buffer;
     
    183183                            size_t         count)
    184184{
    185   rtems_rfs_file_handle* file = iop->pathinfo.node_access;
     185  rtems_rfs_file_handle* file = rtems_rfs_rtems_get_iop_file_handle (iop);
    186186  rtems_rfs_pos          pos;
    187187  const uint8_t*         data = buffer;
     
    280280                            int            whence)
    281281{
    282   rtems_rfs_file_handle* file = iop->pathinfo.node_access;
     282  rtems_rfs_file_handle* file = rtems_rfs_rtems_get_iop_file_handle (iop);
    283283  rtems_rfs_pos          pos;
    284284  int                    rc;
     
    301301 
    302302  return iop->offset;
    303 }
    304 
    305 /**
    306  * Stat the file.
    307  *
    308  * @param iop
    309  * @param buf
    310  * @return int
    311  */
    312 static int
    313 rtems_rfs_rtems_file_fstat (rtems_filesystem_location_info_t* pathloc,
    314                             struct stat*                      buf)
    315 {
    316   rtems_rfs_file_handle* file = pathloc->node_access;
    317   int                    rc;
    318 
    319   if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_STAT))
    320     printf ("rtems-rfs: file-fstat: handle:%p\n", file);
    321 
    322   rtems_rfs_rtems_lock (rtems_rfs_file_fs (file));
    323 
    324   rc = rtems_rfs_rtems_stat_inode (rtems_rfs_file_fs (file),
    325                                    rtems_rfs_file_inode (file),
    326                                    buf);
    327 
    328   rtems_rfs_rtems_unlock (rtems_rfs_file_fs (file));
    329 
    330   return rc;
    331 }
    332 
    333 /**
    334  * File change mode routine.
    335  *
    336  * @param iop
    337  * @param mode
    338  * @return int
    339  */
    340 static int
    341 rtems_rfs_rtems_file_fchmod (rtems_filesystem_location_info_t* pathloc,
    342                              mode_t                            mode)
    343 {
    344   rtems_rfs_file_handle* file = pathloc->node_access;
    345   int                    rc;
    346 
    347   if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FCHMOD))
    348     printf ("rtems-rfs: file-fchmod: handle:%p\n", file);
    349 
    350   rtems_rfs_rtems_lock (rtems_rfs_file_fs (file));
    351 
    352   rc = rtems_rfs_rtems_fchmod_inode (rtems_rfs_file_fs (file),
    353                                      rtems_rfs_file_inode (file),
    354                                      mode);
    355 
    356   rtems_rfs_rtems_unlock (rtems_rfs_file_fs (file));
    357 
    358   return rc;
    359303}
    360304
     
    370314                                rtems_off64_t  length)
    371315{
    372   rtems_rfs_file_handle* file = iop->pathinfo.node_access;
     316  rtems_rfs_file_handle* file = rtems_rfs_rtems_get_iop_file_handle (iop);
    373317  int                    rc;
    374318
     
    400344  .ioctl_h     = rtems_rfs_rtems_file_ioctl,
    401345  .lseek_h     = rtems_rfs_rtems_file_lseek,
    402   .fstat_h     = rtems_rfs_rtems_file_fstat,
    403   .fchmod_h    = rtems_rfs_rtems_file_fchmod,
     346  .fstat_h     = rtems_rfs_rtems_fstat,
     347  .fchmod_h    = rtems_rfs_rtems_fchmod,
    404348  .ftruncate_h = rtems_rfs_rtems_file_ftruncate,
    405349  .fpathconf_h = rtems_filesystem_default_fpathconf,
  • cpukit/libfs/src/rfs/rtems-rfs-rtems.c

    recfeb16b r59762469  
    794794
    795795int
    796 rtems_rfs_rtems_fchmod_inode (rtems_rfs_file_system*  fs,
    797                               rtems_rfs_inode_handle* inode,
    798                               mode_t                  mode)
    799 {
    800   uint16_t imode;
     796rtems_rfs_rtems_fchmod (rtems_filesystem_location_info_t* pathloc,
     797                        mode_t                            mode)
     798{
     799  rtems_rfs_file_system*  fs = rtems_rfs_rtems_pathloc_dev (pathloc);
     800  rtems_rfs_ino           ino = rtems_rfs_rtems_get_pathloc_ino (pathloc);
     801  rtems_rfs_inode_handle  inode;
     802  uint16_t                imode;
    801803#if defined (RTEMS_POSIX_API)
    802   uid_t     uid;
     804  uid_t                   uid;
    803805#endif
     806  int                     rc;
    804807
    805808  if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FCHMOD))
    806     printf ("rtems-rfs-rtems: fchmod indo: in: ino:%" PRId32 " mode:%06" PRIomode_t "\n",
    807             rtems_rfs_inode_ino (inode), mode);
    808  
    809   imode = rtems_rfs_inode_get_mode (inode);
     809    printf ("rtems-rfs-rtems: fchmod: in: ino:%" PRId32 " mode:%06" PRIomode_t "\n",
     810            ino, mode);
     811 
     812  rtems_rfs_rtems_lock (fs);
     813 
     814  rc = rtems_rfs_inode_open (fs, ino, &inode, true);
     815  if (rc)
     816  {
     817    rtems_rfs_rtems_unlock (fs);
     818    return rtems_rfs_rtems_error ("fchmod: opening inode", rc);
     819  }
     820
     821  imode = rtems_rfs_inode_get_mode (&inode);
    810822 
    811823  /*
     
    815827  uid = geteuid();
    816828
    817   if ((uid != rtems_rfs_inode_get_uid (inode)) && (uid != 0))
    818     return EPERM;
     829  if ((uid != rtems_rfs_inode_get_uid (&inode)) && (uid != 0))
     830  {
     831    rtems_rfs_inode_close (fs, &inode);
     832    rtems_rfs_rtems_unlock (fs);
     833    return rtems_rfs_rtems_error ("fchmod: checking uid", EPERM);
     834  }
    819835#endif
    820836
     
    822838  imode |= mode & (S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID | S_ISVTX);
    823839
    824   rtems_rfs_inode_set_mode (inode, imode);
    825  
    826   return 0;
    827 }
    828 
    829 int
    830 rtems_rfs_rtems_fchmod (rtems_filesystem_location_info_t* pathloc,
    831                         mode_t                            mode)
    832 {
    833   rtems_rfs_file_system*  fs = rtems_rfs_rtems_pathloc_dev (pathloc);
    834   rtems_rfs_ino           ino = rtems_rfs_rtems_get_pathloc_ino (pathloc);
    835   rtems_rfs_inode_handle  inode;
    836   int                     rc;
    837 
    838   if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FCHMOD))
    839     printf ("rtems-rfs-rtems: fchmod: in: ino:%" PRId32 " mode:%06" PRIomode_t "\n",
    840             ino, mode);
    841  
    842   rtems_rfs_rtems_lock (fs);
    843  
    844   rc = rtems_rfs_inode_open (fs, ino, &inode, true);
    845   if (rc)
    846   {
    847     rtems_rfs_rtems_unlock (fs);
    848     return rtems_rfs_rtems_error ("fchmod: opening inode", rc);
    849   }
    850 
    851   rc = rtems_rfs_rtems_fchmod_inode (fs, &inode, mode);
    852   if (rc > 0)
    853   {
    854     rtems_rfs_inode_close (fs, &inode);
    855     rtems_rfs_rtems_unlock (fs);
    856     return rtems_rfs_rtems_error ("fchmod: fchmod inode", EPERM);
    857   }
     840  rtems_rfs_inode_set_mode (&inode, imode);
    858841 
    859842  rc = rtems_rfs_inode_close (fs, &inode);
     
    870853
    871854int
    872 rtems_rfs_rtems_stat_inode (rtems_rfs_file_system*  fs,
    873                             rtems_rfs_inode_handle* inode,
    874                             struct stat*            buf)
    875 {
     855rtems_rfs_rtems_fstat (rtems_filesystem_location_info_t* pathloc,
     856                       struct stat*                      buf)
     857{
     858  rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (pathloc);
     859  rtems_rfs_ino          ino = rtems_rfs_rtems_get_pathloc_ino (pathloc);
     860  rtems_rfs_inode_handle inode;
    876861  rtems_rfs_file_shared* shared;
    877862  uint16_t               mode;
     863  int                    rc;
    878864
    879865  if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_STAT))
    880     printf ("rtems-rfs-rtems: stat-inode: in: ino:%" PRId32 "\n",
    881             rtems_rfs_inode_ino (inode));
    882 
    883   mode = rtems_rfs_inode_get_mode (inode);
     866    printf ("rtems-rfs-rtems: stat: in: ino:%" PRId32 "\n", ino);
     867
     868  rtems_rfs_rtems_lock (fs);
     869 
     870  rc = rtems_rfs_inode_open (fs, ino, &inode, true);
     871  if (rc)
     872  {
     873    rtems_rfs_rtems_unlock (fs);
     874    return rtems_rfs_rtems_error ("stat: opening inode", rc);
     875  }
     876
     877  mode = rtems_rfs_inode_get_mode (&inode);
    884878 
    885879  if (RTEMS_RFS_S_ISCHR (mode) || RTEMS_RFS_S_ISBLK (mode))
    886880  {
    887881    buf->st_rdev =
    888       rtems_filesystem_make_dev_t (rtems_rfs_inode_get_block (inode, 0),
    889                                    rtems_rfs_inode_get_block (inode, 1));
     882      rtems_filesystem_make_dev_t (rtems_rfs_inode_get_block (&inode, 0),
     883                                   rtems_rfs_inode_get_block (&inode, 1));
    890884  }
    891885 
    892886  buf->st_dev     = rtems_rfs_fs_device (fs);
    893   buf->st_ino     = rtems_rfs_inode_ino (inode);
     887  buf->st_ino     = rtems_rfs_inode_ino (&inode);
    894888  buf->st_mode    = rtems_rfs_rtems_mode (mode);
    895   buf->st_nlink   = rtems_rfs_inode_get_links (inode);
    896   buf->st_uid     = rtems_rfs_inode_get_uid (inode);
    897   buf->st_gid     = rtems_rfs_inode_get_gid (inode);
     889  buf->st_nlink   = rtems_rfs_inode_get_links (&inode);
     890  buf->st_uid     = rtems_rfs_inode_get_uid (&inode);
     891  buf->st_gid     = rtems_rfs_inode_get_gid (&inode);
    898892
    899893  /*
     
    901895   * the open file rather than the inode.
    902896   */
    903   shared = rtems_rfs_file_get_shared (fs, rtems_rfs_inode_ino (inode));
     897  shared = rtems_rfs_file_get_shared (fs, rtems_rfs_inode_ino (&inode));
    904898
    905899  if (shared)
     
    917911  else
    918912  {
    919     buf->st_atime   = rtems_rfs_inode_get_atime (inode);
    920     buf->st_mtime   = rtems_rfs_inode_get_mtime (inode);
    921     buf->st_ctime   = rtems_rfs_inode_get_ctime (inode);
    922     buf->st_blocks  = rtems_rfs_inode_get_block_count (inode);
     913    buf->st_atime   = rtems_rfs_inode_get_atime (&inode);
     914    buf->st_mtime   = rtems_rfs_inode_get_mtime (&inode);
     915    buf->st_ctime   = rtems_rfs_inode_get_ctime (&inode);
     916    buf->st_blocks  = rtems_rfs_inode_get_block_count (&inode);
    923917
    924918    if (S_ISLNK (buf->st_mode))
    925       buf->st_size = rtems_rfs_inode_get_block_offset (inode);
     919      buf->st_size = rtems_rfs_inode_get_block_offset (&inode);
    926920    else
    927       buf->st_size = rtems_rfs_inode_get_size (fs, inode);
     921      buf->st_size = rtems_rfs_inode_get_size (fs, &inode);
    928922  }
    929923 
    930924  buf->st_blksize = rtems_rfs_fs_block_size (fs);
    931925 
    932   return 0;
    933 }
    934 
    935 int
    936 rtems_rfs_rtems_fstat (rtems_filesystem_location_info_t* pathloc,
    937                        struct stat*                      buf)
    938 {
    939   rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (pathloc);
    940   rtems_rfs_ino          ino = rtems_rfs_rtems_get_pathloc_ino (pathloc);
    941   rtems_rfs_inode_handle inode;
    942   int                    rc;
    943 
    944   if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_STAT))
    945     printf ("rtems-rfs-rtems: stat: in: ino:%" PRId32 "\n", ino);
    946 
    947   rtems_rfs_rtems_lock (fs);
    948  
    949   rc = rtems_rfs_inode_open (fs, ino, &inode, true);
    950   if (rc)
    951   {
    952     rtems_rfs_rtems_unlock (fs);
    953     return rtems_rfs_rtems_error ("stat: opening inode", rc);
    954   }
    955 
    956   rc = rtems_rfs_rtems_stat_inode (fs, &inode, buf);
    957   if (rc > 0)
    958   {
    959     rtems_rfs_rtems_unlock (fs);
    960     return rtems_rfs_rtems_error ("stat: stat'ing the inode", rc);
    961   }
    962 
    963926  rc = rtems_rfs_inode_close (fs, &inode);
    964927  if (rc > 0)
  • cpukit/libfs/src/rfs/rtems-rfs-rtems.h

    recfeb16b r59762469  
    192192 *
    193193 * @param _iop The I/O pointer.
    194  * @return
     194 * @return ino
    195195 */
    196196#define rtems_rfs_rtems_get_iop_ino(_iop) \
    197197  ((intptr_t)(_iop)->pathinfo.node_access)
     198
     199/**
     200 * Get the file handle from the I/O pointer.
     201 *
     202 * @param _iop The I/O pointer.
     203 * @return filehandle The file handle
     204 */
     205#define rtems_rfs_rtems_get_iop_file_handle(_iop) \
     206  ((rtems_rfs_file_handle*)(_iop)->pathinfo.node_access_2)
     207
     208/**
     209 * Set the file handle in the I/O pointer.
     210 *
     211 * @param _iop The I/O pointer.
     212 * @param _fh The file handle.
     213 */
     214#define rtems_rfs_rtems_set_iop_file_handle(_iop, _fh) \
     215  (_iop)->pathinfo.node_access_2 = (_fh)
    198216
    199217/**
     
    275293 * The following routine does a stat on a node.
    276294 *
    277  * @param fs The file system data.
    278  * @param inode The inode to stat held in memory.
    279  * @param buf The stat buffer to fill.
    280  * @return int The result code.
    281  */
    282 int rtems_rfs_rtems_stat_inode (rtems_rfs_file_system*  fs,
    283                                 rtems_rfs_inode_handle* inode,
    284                                 struct stat*            buf);
    285 
    286 /**
    287  * The following routine does a stat on a node.
    288  *
    289295 * @param iop
    290296 * @param buf
     
    295301
    296302/**
    297  * File change mode routine changes an inode.
    298  *
    299  * @param fs The file system data.
    300  * @param inode The inode to change held in memory.
    301  * @param buf The new mode.
    302  * @return int The result code.
    303  */
    304 int rtems_rfs_rtems_fchmod_inode (rtems_rfs_file_system*  fs,
    305                                   rtems_rfs_inode_handle* inode,
    306                                   mode_t                  mode);
    307 
    308 /**
    309303 * File change mode routine.
    310304 *
Note: See TracChangeset for help on using the changeset viewer.