PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
block.c
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright 2001-2004, ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9#
10# PFS block/zone related routines
11*/
12
13#include <errno.h>
14#include <stdio.h>
15#ifdef _IOP
16#include <sysclib.h>
17#else
18#include <string.h>
19#endif
20
21#include "libpfs.h"
22
23// Returns the next block descriptor inode
24pfs_cache_t *pfsBlockGetNextSegment(pfs_cache_t *clink, int *result)
25{
26 pfsCacheFree(clink);
27
28 if (clink->u.inode->next_segment.number)
29 return pfsCacheGetData(clink->pfsMount,
30 clink->u.inode->next_segment.subpart,
31 clink->u.inode->next_segment.number << clink->pfsMount->inode_scale,
32 PFS_CACHE_FLAG_SEGI, result);
33
34 PFS_PRINTF(PFS_DRV_NAME": Error: There is no next segment descriptor\n");
35 *result=-EINVAL;
36 return NULL;
37}
38
39// Sets 'blockpos' to point to the next block segment for the inode (and moves onto the
40// next block descriptor inode if necessary)
41int pfsBlockSeekNextSegment(pfs_cache_t *clink, pfs_blockpos_t *blockpos)
42{
43 pfs_cache_t *nextSegment;
44 int result=0;
45
46 if (blockpos->byte_offset)
47 {
48 PFS_PRINTF(PFS_DRV_NAME": Panic: This is a bug!\n");
49 return -1;
50 }
51
52 // If we're at the end of the block descriptor array for the current
53 // inode, then move onto the next inode
54 if (pfsFixIndex(blockpos->block_segment+1)==0)
55 {
56 if ((nextSegment=pfsBlockGetNextSegment(pfsCacheUsedAdd(blockpos->inode), &result)) == NULL)
57 return result;
58 pfsCacheFree(blockpos->inode);
59 blockpos->inode=nextSegment;
60 if (clink->u.inode->number_data-1 == ++blockpos->block_segment)
61 return -EINVAL;
62 }
63
64 blockpos->block_offset=0;
65 blockpos->block_segment++;
66 return result;
67}
68
69u32 pfsBlockSyncPos(pfs_blockpos_t *blockpos, u64 size)
70{
71 u32 i;
72
73 i = (u32)(size / blockpos->inode->pfsMount->zsize);
74 blockpos->byte_offset += size % blockpos->inode->pfsMount->zsize;
75
76 if (blockpos->byte_offset >= blockpos->inode->pfsMount->zsize)
77 {
78 blockpos->byte_offset -= blockpos->inode->pfsMount->zsize;
79 i++;
80 }
81 return i;
82}
83
84int pfsBlockInitPos(pfs_cache_t *clink, pfs_blockpos_t *blockpos, u64 position)
85{
86 blockpos->inode=pfsCacheUsedAdd(clink);
87 blockpos->byte_offset=0;
88
89 if (clink->u.inode->size)
90 {
91 blockpos->block_segment=1;
92 blockpos->block_offset=0;
93 }else{
94 blockpos->block_segment=0;
95 blockpos->block_offset=1;
96 }
97 return pfsInodeSync(blockpos, position, clink->u.inode->number_data);
98}
#define EINVAL
Definition errno.h:63