VirtualBox

Changeset 76299 in vbox


Ignore:
Timestamp:
Dec 19, 2018 7:10:01 PM (6 years ago)
Author:
vboxsync
Message:

Runtime/fs/extvfs: Updates

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/iprt/formats/ext.h

    r76292 r76299  
    551551 * @{ */
    552552/** Inode table and bitmaps are not initialized. */
    553 #define EXT_GROUP_DESC_F_INODE_UNINIT                RT_BIT_16(0)
     553#define EXT_GROUP_DESC_F_INODE_UNINIT                RT_BIT(0)
    554554/** Block bitmap is not initialized. */
    555 #define EXT_GROUP_DESC_F_BLOCK_UNINIT                RT_BIT_16(1)
     555#define EXT_GROUP_DESC_F_BLOCK_UNINIT                RT_BIT(1)
    556556/** Inode table is zeroed. */
    557 #define EXT_GROUP_DESC_F_INODE_ZEROED                RT_BIT_16(2)
     557#define EXT_GROUP_DESC_F_INODE_ZEROED                RT_BIT(2)
    558558/** @} */
    559559
     
    576576typedef const EXTBLOCKGROUPDESC *PCEXTBLOCKGROUPDESC;
    577577
     578
     579/** Number of block entries in the inodes block map. */
     580#define EXT_INODE_BLOCK_ENTRIES                      15
    578581
    579582/**
     
    611614    } Osd1;
    612615    /** 0x28: Block map or extent tree. */
    613     uint32_t    au32Block[15];
     616    uint32_t    au32Block[EXT_INODE_BLOCK_ENTRIES];
    614617    /** 0x64: File version. */
    615618    uint32_t    u32Version;
     
    698701 * @{ */
    699702/** Others can execute the file. */
    700 #define EXT_INODE_MODE_EXEC_OTHER                    RT_BIT_16(0)
     703#define EXT_INODE_MODE_EXEC_OTHER                    RT_BIT(0)
    701704/** Others can write to the file. */
    702 #define EXT_INODE_MODE_WRITE_OTHER                   RT_BIT_16(1)
     705#define EXT_INODE_MODE_WRITE_OTHER                   RT_BIT(1)
    703706/** Others can read the file. */
    704 #define EXT_INODE_MODE_READ_OTHER                    RT_BIT_16(2)
     707#define EXT_INODE_MODE_READ_OTHER                    RT_BIT(2)
    705708/** Members of the same group can execute the file. */
    706 #define EXT_INODE_MODE_EXEC_GROUP                    RT_BIT_16(3)
     709#define EXT_INODE_MODE_EXEC_GROUP                    RT_BIT(3)
    707710/** Members of the same group can write to the file. */
    708 #define EXT_INODE_MODE_WRITE_GROUP                   RT_BIT_16(4)
     711#define EXT_INODE_MODE_WRITE_GROUP                   RT_BIT(4)
    709712/** Members of the same group can read the file. */
    710 #define EXT_INODE_MODE_READ_GROUP                    RT_BIT_16(5)
     713#define EXT_INODE_MODE_READ_GROUP                    RT_BIT(5)
    711714/** Owner can execute the file. */
    712 #define EXT_INODE_MODE_EXEC_OWNER                    RT_BIT_16(6)
     715#define EXT_INODE_MODE_EXEC_OWNER                    RT_BIT(6)
    713716/** Owner can write to the file. */
    714 #define EXT_INODE_MODE_WRITE_OWNER                   RT_BIT_16(7)
     717#define EXT_INODE_MODE_WRITE_OWNER                   RT_BIT(7)
    715718/** Owner can read the file. */
    716 #define EXT_INODE_MODE_READ_OWNER                    RT_BIT_16(8)
     719#define EXT_INODE_MODE_READ_OWNER                    RT_BIT(8)
    717720/** Sticky file mode. */
    718 #define EXT_INODE_MODE_STICKY                        RT_BIT_16(9)
     721#define EXT_INODE_MODE_STICKY                        RT_BIT(9)
    719722/** File is set GID. */
    720 #define EXT_INODE_MODE_SET_GROUP_ID                  RT_BIT_16(10)
     723#define EXT_INODE_MODE_SET_GROUP_ID                  RT_BIT(10)
    721724/** File is set UID. */
    722 #define EXT_INODE_MODE_SET_USER_ID                   RT_BIT_16(11)
     725#define EXT_INODE_MODE_SET_USER_ID                   RT_BIT(11)
    723726/** @} */
    724727
     
    739742/** Inode represents a socket. */
    740743#define EXT_INODE_MODE_TYPE_SOCKET                   UINT16_C(0xc000)
     744/** Returns the inode type from the combined mode field. */
     745#define EXT_INODE_MODE_TYPE_GET_TYPE(a_Mode)         ((a_Mode) & 0xf000)
    741746/** @} */
    742747
  • trunk/src/VBox/Runtime/common/fs/extvfs.cpp

    r76294 r76299  
    103103    /** Reference counter. */
    104104    volatile uint32_t cRefs;
    105     /** Block number where the inode is stored. */
    106     uint64_t          iBlockInode;
    107     /** Offset in bytes into block where the inode is stored. */
    108     uint32_t          offInode;
    109     /** Inode data size. */
    110     uint64_t          cbData;
     105    /** Byte offset in the backing file where the inode is stored.. */
     106    uint64_t          offInode;
     107    /** Inode data. */
     108    RTFSOBJINFO       ObjInfo;
     109    /** Inode flags (copied from the on disk inode). */
     110    uint32_t          fFlags;
     111    /** Copy of the block map/extent tree. */
     112    uint32_t          aiBlocks[EXT_INODE_BLOCK_ENTRIES];
    111113} RTFSEXTINODE;
    112114/** Pointer to an in-memory inode. */
     
    121123    /** Volume this directory belongs to. */
    122124    PRTFSEXTVOL         pVol;
     125    /** The underlying inode structure. */
     126    PRTFSEXTINODE       pInode;
    123127    /** Set if we've reached the end of the directory enumeration. */
    124128    bool                fNoMoreFiles;
     
    325329            Log2(("EXT:   iSnapshotListInode          %#RX32\n", RT_LE2H_U32(pSb->iSnapshotListInode)));
    326330            Log2(("EXT:   cErrorsSeen                 %#RX32\n", RT_LE2H_U32(pSb->cErrorsSeen)));
    327             Log2(("EXT:   [...]\n")); /** @todo: Missing fields if becoming interesting. */
     331            Log2(("EXT:   [...]\n")); /** @todo Missing fields if becoming interesting. */
    328332            Log2(("EXT:   iInodeLostFound             %#RX32\n", RT_LE2H_U32(pSb->iInodeLostFound)));
    329333            Log2(("EXT:   iInodeProjQuota             %#RX32\n", RT_LE2H_U32(pSb->iInodeProjQuota)));
    330334            Log2(("EXT:   u32ChksumSeed               %#RX32\n", RT_LE2H_U32(pSb->u32ChksumSeed)));
    331             Log2(("EXT:   [...]\n")); /** @todo: Missing fields if becoming interesting. */
     335            Log2(("EXT:   [...]\n")); /** @todo Missing fields if becoming interesting. */
    332336            Log2(("EXT:   u32Chksum                   %#RX32\n", RT_LE2H_U32(pSb->u32Chksum)));
    333337        }
     
    797801                    rtFsExtInode_Log(pThis, iInode, &Inode);
    798802#endif
    799                     /** @todo Fill in data. */
     803                    pInode->offInode            = offRead;
     804                    pInode->fFlags              = RT_LE2H_U32(Inode.Core.fFlags);
     805                    pInode->ObjInfo.cbObject    =   (uint64_t)RT_LE2H_U32(Inode.Core.cbSizeHigh) << 32
     806                                                  | (uint64_t)RT_LE2H_U32(Inode.Core.cbSizeLow);
     807                    pInode->ObjInfo.cbAllocated = (  (uint64_t)RT_LE2H_U16(Inode.Core.Osd2.Lnx.cBlocksHigh) << 32
     808                                                   | (uint64_t)RT_LE2H_U32(Inode.Core.cBlocksLow)) * pThis->cbBlock;
     809                    RTTimeSpecSetSeconds(&pInode->ObjInfo.AccessTime, RT_LE2H_U32(Inode.Core.u32TimeLastAccess));
     810                    RTTimeSpecSetSeconds(&pInode->ObjInfo.ModificationTime, RT_LE2H_U32(Inode.Core.u32TimeLastModification));
     811                    RTTimeSpecSetSeconds(&pInode->ObjInfo.ChangeTime, RT_LE2H_U32(Inode.Core.u32TimeLastChange));
     812                    pInode->ObjInfo.Attr.enmAdditional = RTFSOBJATTRADD_UNIX;
     813                    pInode->ObjInfo.Attr.u.Unix.uid    =   (uint32_t)RT_LE2H_U16(Inode.Core.Osd2.Lnx.uUidHigh) << 16
     814                                                         | (uint32_t)RT_LE2H_U16(Inode.Core.uUidLow);
     815                    pInode->ObjInfo.Attr.u.Unix.gid    =   (uint32_t)RT_LE2H_U16(Inode.Core.Osd2.Lnx.uGidHigh) << 16
     816                                                         | (uint32_t)RT_LE2H_U16(Inode.Core.uGidLow);
     817                    pInode->ObjInfo.Attr.u.Unix.cHardlinks = RT_LE2H_U16(Inode.Core.cHardLinks);
     818                    pInode->ObjInfo.Attr.u.Unix.INodeIdDevice = 0;
     819                    pInode->ObjInfo.Attr.u.Unix.INodeId       = iInode;
     820                    pInode->ObjInfo.Attr.u.Unix.fFlags        = 0;
     821                    pInode->ObjInfo.Attr.u.Unix.GenerationId  = RT_LE2H_U32(Inode.Core.u32Version);
     822                    pInode->ObjInfo.Attr.u.Unix.Device        = 0;
     823                    if (pThis->cbInode >= sizeof(EXTINODECOMB))
     824                        RTTimeSpecSetSeconds(&pInode->ObjInfo.BirthTime, RT_LE2H_U32(Inode.Extra.u32TimeCreation));
     825                    else
     826                        RTTimeSpecSetSeconds(&pInode->ObjInfo.BirthTime, RT_LE2H_U32(Inode.Core.u32TimeLastChange));
     827                    for (unsigned i = 0; i < RT_ELEMENTS(pInode->aiBlocks); i++)
     828                        pInode->aiBlocks[i] = RT_LE2H_U32(Inode.Core.au32Block[i]);
     829
     830                    /* Fill in the mode. */
     831                    pInode->ObjInfo.Attr.fMode = 0;
     832                    uint32_t fInodeMode = RT_LE2H_U32(Inode.Core.fMode);
     833                    switch (EXT_INODE_MODE_TYPE_GET_TYPE(fInodeMode))
     834                    {
     835                        case EXT_INODE_MODE_TYPE_FIFO:
     836                            pInode->ObjInfo.Attr.fMode |= RTFS_TYPE_FIFO;
     837                            break;
     838                        case EXT_INODE_MODE_TYPE_CHAR:
     839                            pInode->ObjInfo.Attr.fMode |= RTFS_TYPE_DEV_CHAR;
     840                            break;
     841                        case EXT_INODE_MODE_TYPE_DIR:
     842                            pInode->ObjInfo.Attr.fMode |= RTFS_TYPE_DIRECTORY;
     843                            break;
     844                        case EXT_INODE_MODE_TYPE_BLOCK:
     845                            pInode->ObjInfo.Attr.fMode |= RTFS_TYPE_DEV_BLOCK;
     846                            break;
     847                        case EXT_INODE_MODE_TYPE_REGULAR:
     848                            pInode->ObjInfo.Attr.fMode |= RTFS_TYPE_FILE;
     849                            break;
     850                        case EXT_INODE_MODE_TYPE_SYMLINK:
     851                            pInode->ObjInfo.Attr.fMode |= RTFS_TYPE_SYMLINK;
     852                            break;
     853                        case EXT_INODE_MODE_TYPE_SOCKET:
     854                            pInode->ObjInfo.Attr.fMode |= RTFS_TYPE_SOCKET;
     855                            break;
     856                        default:
     857                            rc = VERR_VFS_BOGUS_FORMAT;
     858                    }
     859                    if (fInodeMode & EXT_INODE_MODE_EXEC_OTHER)
     860                        pInode->ObjInfo.Attr.fMode |= RTFS_UNIX_IXOTH;
     861                    if (fInodeMode & EXT_INODE_MODE_WRITE_OTHER)
     862                        pInode->ObjInfo.Attr.fMode |= RTFS_UNIX_IWOTH;
     863                    if (fInodeMode & EXT_INODE_MODE_READ_OTHER)
     864                        pInode->ObjInfo.Attr.fMode |= RTFS_UNIX_IROTH;
     865                    if (fInodeMode & EXT_INODE_MODE_EXEC_GROUP)
     866                        pInode->ObjInfo.Attr.fMode |= RTFS_UNIX_IXGRP;
     867                    if (fInodeMode & EXT_INODE_MODE_WRITE_GROUP)
     868                        pInode->ObjInfo.Attr.fMode |= RTFS_UNIX_IWGRP;
     869                    if (fInodeMode & EXT_INODE_MODE_READ_GROUP)
     870                        pInode->ObjInfo.Attr.fMode |= RTFS_UNIX_IRGRP;
     871                    if (fInodeMode & EXT_INODE_MODE_EXEC_OWNER)
     872                        pInode->ObjInfo.Attr.fMode |= RTFS_UNIX_IXUSR;
     873                    if (fInodeMode & EXT_INODE_MODE_WRITE_OWNER)
     874                        pInode->ObjInfo.Attr.fMode |= RTFS_UNIX_IWUSR;
     875                    if (fInodeMode & EXT_INODE_MODE_READ_OWNER)
     876                        pInode->ObjInfo.Attr.fMode |= RTFS_UNIX_IRUSR;
     877                    if (fInodeMode & EXT_INODE_MODE_STICKY)
     878                        pInode->ObjInfo.Attr.fMode |= RTFS_UNIX_ISTXT;
     879                    if (fInodeMode & EXT_INODE_MODE_SET_GROUP_ID)
     880                        pInode->ObjInfo.Attr.fMode |= RTFS_UNIX_ISGID;
     881                    if (fInodeMode & EXT_INODE_MODE_SET_USER_ID)
     882                        pInode->ObjInfo.Attr.fMode |= RTFS_UNIX_ISUID;
    800883                }
    801884            }
     
    839922
    840923
     924/**
     925 * Worker for various QueryInfo methods.
     926 *
     927 * @returns IPRT status code.
     928 * @param   pInode              The inode structure to return info for.
     929 * @param   pObjInfo            Where to return object info.
     930 * @param   enmAddAttr          What additional info to return.
     931 */
     932static int rtFsExtInode_QueryInfo(PRTFSEXTINODE pInode, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAddAttr)
     933{
     934    RT_ZERO(*pObjInfo);
     935
     936    pObjInfo->cbObject           = pInode->ObjInfo.cbObject;
     937    pObjInfo->cbAllocated        = pInode->ObjInfo.cbAllocated;
     938    pObjInfo->AccessTime         = pInode->ObjInfo.AccessTime;
     939    pObjInfo->ModificationTime   = pInode->ObjInfo.ModificationTime;
     940    pObjInfo->ChangeTime         = pInode->ObjInfo.ChangeTime;
     941    pObjInfo->BirthTime          = pInode->ObjInfo.BirthTime;
     942    pObjInfo->Attr.fMode         = pInode->ObjInfo.Attr.fMode;
     943    pObjInfo->Attr.enmAdditional = enmAddAttr;
     944    switch (enmAddAttr)
     945    {
     946        case RTFSOBJATTRADD_UNIX:
     947            memcpy(&pObjInfo->Attr.u.Unix, &pInode->ObjInfo.Attr.u.Unix, sizeof(pInode->ObjInfo.Attr.u.Unix));
     948            break;
     949
     950        case RTFSOBJATTRADD_UNIX_OWNER:
     951            pObjInfo->Attr.u.UnixOwner.uid = pInode->ObjInfo.Attr.u.Unix.uid;
     952            break;
     953
     954        case RTFSOBJATTRADD_UNIX_GROUP:
     955            pObjInfo->Attr.u.UnixGroup.gid = pInode->ObjInfo.Attr.u.Unix.gid;
     956            break;
     957
     958        default:
     959            break;
     960    }
     961
     962    return VINF_SUCCESS;
     963}
     964
     965
    841966/*
    842967 *
     
    854979    PRTFSEXTDIR pThis = (PRTFSEXTDIR)pvThis;
    855980    LogFlowFunc(("pThis=%p\n", pThis));
    856     RT_NOREF(pThis);
     981    rtFsExtInodeRelease(pThis->pVol, pThis->pInode);
     982    pThis->pInode = NULL;
    857983    return VINF_SUCCESS;
    858984}
     
    866992    PRTFSEXTDIR pThis = (PRTFSEXTDIR)pvThis;
    867993    LogFlowFunc(("\n"));
    868     RT_NOREF(pThis, pObjInfo, enmAddAttr);
    869     return VERR_NOT_IMPLEMENTED;
     994    return rtFsExtInode_QueryInfo(pThis->pInode, pObjInfo, enmAddAttr);
    870995}
    871996
     
    10741199    int rc = rtFsExtInodeLoad(pThis, iInode, &pInode);
    10751200    if (RT_SUCCESS(rc))
    1076         rtFsExtInodeRelease(pThis, pInode);
     1201    {
     1202        if (RTFS_IS_DIRECTORY(pInode->ObjInfo.Attr.fMode))
     1203        {
     1204            PRTFSEXTDIR pNewDir;
     1205            rc = RTVfsNewDir(&g_rtFsExtDirOps, sizeof(*pNewDir), 0 /*fFlags*/, pThis->hVfsSelf, NIL_RTVFSLOCK,
     1206                             phVfsDir, (void **)&pNewDir);
     1207            if (RT_SUCCESS(rc))
     1208            {
     1209                pNewDir->fNoMoreFiles = false;
     1210                pNewDir->pVol         = pThis;
     1211                pNewDir->pInode       = pInode;
     1212            }
     1213        }
     1214        else
     1215            rc = VERR_VFS_BOGUS_FORMAT;
     1216
     1217        if (RT_FAILURE(rc))
     1218            rtFsExtInodeRelease(pThis, pInode);
     1219    }
     1220
    10771221    RT_NOREF(phVfsDir, g_rtFsExtDirOps);
    10781222    return rc;
     
    11001244static bool rtFsExtIsBlockRangeInUse(PRTFSEXTBLKGRP pBlkGrpDesc, uint64_t iBlockStart, size_t cBlocks)
    11011245{
    1102     /** @todo: Optimize with ASMBitFirstSet(). */
     1246    /** @todo Optimize with ASMBitFirstSet(). */
    11031247    while (cBlocks)
    11041248    {
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette