static status_t fs_read_pages(fs_volume* _volume, fs_vnode* _node, void* _cookie, off_t pos, const iovec* vecs, size_t count, size_t* _numBytes) { iso9660_volume* volume = (iso9660_volume*)_volume->private_volume; iso9660_inode* node = (iso9660_inode*)_node->private_node; uint32 fileSize = node->dataLen[FS_DATA_FORMAT]; size_t bytesLeft = *_numBytes; if (pos >= fileSize) { *_numBytes = 0; return B_OK; } if (pos + bytesLeft > fileSize) { bytesLeft = fileSize - pos; *_numBytes = bytesLeft; } file_io_vec fileVec; fileVec.offset = pos + node->startLBN[FS_DATA_FORMAT] * volume->logicalBlkSize[FS_DATA_FORMAT]; fileVec.length = bytesLeft; uint32 vecIndex = 0; size_t vecOffset = 0; return read_file_io_vec_pages(volume->fd, &fileVec, 1, vecs, count, &vecIndex, &vecOffset, &bytesLeft); }
static status_t btrfs_read_pages(fs_volume* _volume, fs_vnode* _node, void* _cookie, off_t pos, const iovec* vecs, size_t count, size_t* _numBytes) { Volume* volume = (Volume*)_volume->private_volume; Inode* inode = (Inode*)_node->private_node; if (inode->FileCache() == NULL) return B_BAD_VALUE; rw_lock_read_lock(inode->Lock()); uint32 vecIndex = 0; size_t vecOffset = 0; size_t bytesLeft = *_numBytes; status_t status; while (true) { file_io_vec fileVecs[8]; size_t fileVecCount = 8; status = file_map_translate(inode->Map(), pos, bytesLeft, fileVecs, &fileVecCount, 0); if (status != B_OK && status != B_BUFFER_OVERFLOW) break; bool bufferOverflow = status == B_BUFFER_OVERFLOW; size_t bytes = bytesLeft; status = read_file_io_vec_pages(volume->Device(), fileVecs, fileVecCount, vecs, count, &vecIndex, &vecOffset, &bytes); if (status != B_OK || !bufferOverflow) break; pos += bytes; bytesLeft -= bytes; } rw_lock_read_unlock(inode->Lock()); return status; }