XINU
Functions
lfscreate.c File Reference
#include <xinu.h>
#include <ramdisk.h>
Include dependency graph for lfscreate.c:

Go to the source code of this file.

Functions

status lfscreate (did32 disk, ibid32 lfiblks, uint32 dsiz)
 

Function Documentation

◆ lfscreate()

status lfscreate ( did32  disk,
ibid32  lfiblks,
uint32  dsiz 
)

Definition at line 10 of file lfscreate.c.

References close(), lfiblk::ib_next, LF_AREA_DIR, LF_BLKSIZ, LF_DNULL, LF_INULL, lfibclear(), lfibput(), LFS_ID, memset(), NULLCH, OK, SYSERR, and write().

15 {
16  uint32 sectors; /* Number of sectors to use */
17  uint32 ibsectors; /* Number of sectors of i-blocks*/
18  uint32 ibpersector; /* Number of i-blocks per sector*/
19  struct lfdir dir; /* Buffer to hold the directory */
20  uint32 dblks; /* Total free data blocks */
21  struct lfiblk iblock; /* Space for one i-block */
22  struct lfdbfree dblock; /* Data block on the free list */
23  dbid32 dbindex; /* Index for data blocks */
24  int32 retval; /* Return value from func call */
25  int32 i; /* Loop index */
26 
27  /* Compute total sectors on disk */
28 
29  sectors = dsiz / LF_BLKSIZ; /* Truncate to full sector */
30 
31  /* Compute number of sectors comprising i-blocks */
32 
33  ibpersector = LF_BLKSIZ / sizeof(struct lfiblk);
34  ibsectors = (lfiblks+(ibpersector-1)) / ibpersector;/* Round up */
35  lfiblks = ibsectors * ibpersector;
36  if (ibsectors > sectors/2) { /* Invalid arguments */
37  return SYSERR;
38  }
39 
40  /* Create an initial directory */
41 
42  memset((char *)&dir, NULLCH, sizeof(struct lfdir));
43  dir.lfd_fsysid = LFS_ID;
44  dir.lfd_nfiles = 0;
45  dir.lfd_allzeros = 0;
46  dir.lfd_allones = 0xffffffff;
47  dir.lfd_revid = ((LFS_ID>>24) & 0x000000ff) |
48  ((LFS_ID>> 8) & 0x0000ff00) |
49  ((LFS_ID<< 8) & 0x00ff0000) |
50  ((LFS_ID<<24) & 0xff000000) ;
51  dbindex= (dbid32)(ibsectors + 1);
52  dir.lfd_dfree = dbindex;
53  dblks = sectors - ibsectors - 1;
54  retval = write(disk,(char *)&dir, LF_AREA_DIR);
55  if (retval == SYSERR) {
56  return SYSERR;
57  }
58 
59  /* Create list of free i-blocks on disk */
60 
61  lfibclear(&iblock, 0);
62  for (i=0; i<lfiblks-1; i++) {
63  iblock.ib_next = (ibid32)(i + 1);
64  lfibput(disk, i, &iblock);
65  }
66  iblock.ib_next = LF_INULL;
67  lfibput(disk, i, &iblock);
68 
69  /* Create list of free data blocks on disk */
70 
71  memset((char*)&dblock, NULLCH, LF_BLKSIZ);
72  for (i=0; i<dblks-1; i++) {
73  dblock.lf_nextdb = dbindex + 1;
74  write(disk, (char *)&dblock, dbindex);
75  dbindex++;
76  }
77  dblock.lf_nextdb = LF_DNULL;
78  write(disk, (char *)&dblock, dbindex);
79  close(disk);
80  return OK;
81 }
int32 dbid32
データブロックID(ファイルシステムで使用する)
Definition: kernel.h:42
int32 ibid32
ブロックIDのインデックス(ファイルシステムで使用する)
Definition: kernel.h:40
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
syscall close(did32)
Definition: close.c:9
void lfibclear(struct lfiblk *, int32)
Definition: lfibclear.c:9
#define OK
処理が成功した場合
Definition: kernel.h:77
#define LF_INULL
Definition: lfilesys.h:55
#define LF_AREA_DIR
Definition: lfilesys.h:67
syscall write(did32, char *, uint32)
Definition: write.c:9
#define LF_BLKSIZ
Definition: lfilesys.h:48
int int32
符号あり32ビット整数(int)
Definition: kernel.h:11
#define LF_DNULL
Definition: lfilesys.h:56
void * memset(void *, const int, int32)
指定のByteブロックに対して、同じ値をNバイト分書き込む。
Definition: memset.c:13
#define LFS_ID
Definition: lfilesys.h:80
unsigned int uint32
符号なし32ビット整数(unsigned int)
Definition: kernel.h:15
#define NULLCH
NULL文字(NULL終端)
Definition: kernel.h:70
status lfibput(did32, ibid32, struct lfiblk *)
Definition: lfibput.c:10
Here is the call graph for this function: