Does it have another way to find out a range of start and end physical unit
LBAs from file description? Like from linux that I am trying to port to
OpenSolaris.
Following is a function call. I can send you a source, it’s about more than
one paper page long.
void TWL_File_LBA::get_unit_lba_range(char *file_name,
ULONGLONG byte_offset,
ULONGLONG record_length,
ULONGLONG &range_start_unit_lba,
ULONGLONG &range_end_unit_lba,
ULONGLONG &run_length)
In this function it mainly does these steps:
get_volume_name(file_name, VolName, sizeof(VolName), &FsType);
GetLogicalVolumeNum(VolName, &VolGroup, &LogVol);
GetPhysVolInfo(VolGroup, LogVol, VolName, sizeof(VolName), &pe_start);
VolStartLBA += GetPartitionStartLBA(VolName);
if (-1 == ioctl(fileFD, FIGETBSZ, &FsBlockSize))
while (CurFileBlock != 0)
if (-1 == ioctl(fileFD, FIBMAP, &FsBlockAtOffset))
Then use FsBlockSize and FsBlockAtOffset to calculate a range of unit LBAs and
run_length
range_start_unit_lba = VolStartLBA + (CurFsBlock * (FsBlockSize >> 9));
if (CurFileBlock == EndFileBlock)
range_end_unit_lba = VolStartLBA + (CurFsBlock * (FsBlockSize >> 9)) +
((WrcDatFileSize % FsBlockSize) >> 9) - 1;
else
range_end_unit_lba = VolStartLBA + ((CurFsBlock + 1) * (FsBlockSize >> 9))
- 1;
unit_lba = VolStartLBA + (FsBlockAtOffset * (FsBlockSize >> 9)) + ((byte_offset
% FsBlockSize) >> 9);
nSectors = (range_end_unit_lba - unit_lba) + 1;
run_length = nSectors << 9;
if (run_length > record_length)
run_length = record_length;
Thank you very much for your time.
Thai.
--
This message posted from opensolaris.org
_______________________________________________
opensolaris-code mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/opensolaris-code