On 10/22/13 6:25 AM, Pradeep Kumar wrote: > I was able to resolve the issue. This was indeed related to conversion between FSB to actual data block in image file. I would like to thanks Dave for showing the direction. > So to summarize the extent data (128 bits, format =2) gives absolute block number which is in term of XFS file system block this need to be converted into actual disk block. > > I've used two macros for it. > 1. #define XFS_FSB_TO_AGNO <http://lxr.free-electrons.com/ident?i=XFS_FSB_TO_AGNO>(mp,fsbno) > 2.#define XFS_FSB_TO_AGBNO <http://lxr.free-electrons.com/ident?i=XFS_FSB_TO_AGBNO>(mp,fsbno). > > First one give the actual AG number and the second one gives the block number in that AG. > > Now coming back to my previous example which I posted > My extent data was. > 00 00 00 00 00 00 00 00 00 00 00 04 99 80 00 01 (LSB) > > After unpacking, absolute block number = 9420 (0x24cc). > Converting to actual data block using above two macros gives me AG No. = 1, AG Block No = 1228. So final block (1*6400 + 1228 = 7628) which is correct.(I was able to get correct file contents) > Please let me know if above computation is correct. It seems correct to me as I'm able to retrieve all the files. > > Still I couldn't get two macros. > 1. #define XFS_FSS_TO_BB <http://lxr.free-electrons.com/ident?i=XFS_FSS_TO_BB>(mp,sec <http://lxr.free-electrons.com/ident?i=sec>) ((sec <http://lxr.free-electrons.com/ident?i=sec>) << (mp)->m_sectbb_log). > *2. *#define XFS_BB_TO_FSBT <http://lxr.free-electrons.com/ident?i=XFS_BB_TO_FSBT>(mp,bb <http://lxr.free-electrons.com/ident?i=bb>) ((bb <http://lxr.free-electrons.com/ident?i=bb>) >> (mp)->m_blkbb_log). > > I couldn't find m_sectbb_log and m_blkbb_log fields. Please someone share more knowledge on above > macros like where they are used and also description of input and output field Use the source, Luke: [linux-2.6]$ grep m_blkbb_log fs/xfs/*.h fs/xfs/xfs_mount.h: __uint8_t m_blkbb_log; /* blocklog - BBSHIFT */ linux-2.6]$ grep m_sectbb_log fs/xfs/*.h ... fs/xfs/xfs_mount.h: __uint8_t m_sectbb_log; /* sectlog - BBSHIFT */ it's the log of the (block/sector) size, minus the basic block (512) shift (9) /* * Block I/O parameterization. A basic block (BB) is the lowest size of * filesystem allocation, and must equal 512. Length units given to bio * routines are in BB's. */ #define BBSHIFT 9 -Eric > Thanks and Regards, > Pradeep > > > > > > On 22 October 2013 10:08, Pradeep Kumar <praks411@xxxxxxxxx <mailto:praks411@xxxxxxxxx>> wrote: > > Hi Dave, > > Thanks for the reply. I think I may get my solution. Can you explain the difference between the two? > I've created sample xfs file using mkfs.xfs with mostly default parameter > 1. Sector Size = 512 > 2. Block size = 4096 > 3. AG Number = 2 > 4. Number of blocks per AG = 6400. > > So when I get absolute block 9420 from file extent data I'm going to (6400 + 3020) , 3020 block of second AG which is wrong. The file start from 7628 absolute block or (6400 + 1228), 1228 block of second AG. > Please describe in some detail above the conversion which you are talking about. > > Thanks and Regards, > Pradeep > > > > On 22 October 2013 02:12, Dave Chinner <david@xxxxxxxxxxxxx <mailto:david@xxxxxxxxxxxxx>> wrote: > > On Tue, Oct 22, 2013 at 01:32:22AM +0200, Pradeep Kumar wrote: > > Hi, > > > > I'm writing a small utility to parse XFS fs image on windows. > > I'm able to fetch the files in the first AG (0). > > However when it comes to the files which are in different AG I'm facing > > some problem in parsing extent bmap 128bits data of file inode (format == > > 2). > > Extents use filesystem block encodings, not disk addresses. Look up > the macros XFS_DADDR_TO_FSB and XFS_FSB_TO_DADDR. > > Cheers, > > Dave. > -- > Dave Chinner > david@xxxxxxxxxxxxx <mailto:david@xxxxxxxxxxxxx> > > > > > > _______________________________________________ > xfs mailing list > xfs@xxxxxxxxxxx > http://oss.sgi.com/mailman/listinfo/xfs > _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs