2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: services/fs/minix/minix.c
6 * PROGRAMMER: David Welch (welch@mcmail.com)
10 /* INCLUDES *****************************************************************/
22 /* FUNCTIONS ****************************************************************/
24 NTSTATUS
MinixDeleteInode(PDEVICE_OBJECT Volume
,
25 MINIX_DEVICE_EXTENSION
* DeviceExt
,
31 Buffer
= ExAllocatePool(NonPagedPool
,BLOCKSIZE
);
32 MinixReadSector(Volume
, (ino
/ 8192)+2, (PVOID
)Buffer
);
34 clear_bit(off
%32,&Buffer
[off
/32]);
35 MinixWriteSector(Volume
, (ino
/ 8192)+2, (PVOID
)Buffer
);
36 return(STATUS_SUCCESS
);
39 static ULONG
MinixAllocateInode(PDEVICE_OBJECT Volume
,
40 MINIX_DEVICE_EXTENSION
* DeviceExt
)
46 Buffer
= ExAllocatePool(NonPagedPool
,BLOCKSIZE
);
47 for (i
=0; i
<DeviceExt
->sb
->s_imap_blocks
; i
++)
49 MinixReadSector(Volume
,i
+ 2,Buffer
);
50 ino
= find_first_zero_bit(Buffer
,8192);
53 set_bit(ino
%32,&Buffer
[32]);
54 MinixWriteSector(Volume
,i
+ 2,Buffer
);
56 return(ino
+ (i
*8192));
63 ULONG
MinixNewInode(PDEVICE_OBJECT Volume
,
64 MINIX_DEVICE_EXTENSION
* DeviceExt
,
65 struct minix_inode
* new_inode
)
69 ino
= MinixAllocateInode(Volume
,DeviceExt
);
74 MinixWriteInode(Volume
,DeviceExt
,ino
,new_inode
);
78 NTSTATUS
MinixWriteInode(PDEVICE_OBJECT Volume
,
79 MINIX_DEVICE_EXTENSION
* DeviceExt
,
81 struct minix_inode
* result
)
85 struct minix_inode
* inodes
;
87 DPRINT("MinixWriteInode(ino %x, result %x)\n",ino
,result
);
89 buffer
= ExAllocatePool(NonPagedPool
,1024);
90 inodes
= (struct minix_inode
*)buffer
;
92 block
= 2 + DeviceExt
->sb
->s_imap_blocks
+ DeviceExt
->sb
->s_zmap_blocks
93 + ((ino
-1) / MINIX_INODES_PER_BLOCK
);
94 MinixReadSector(Volume
,block
,buffer
);
95 memcpy(&inodes
[(ino
-1)%MINIX_INODES_PER_BLOCK
],result
,
96 sizeof(struct minix_inode
));
97 MinixWriteSector(Volume
,block
,buffer
);
100 return(STATUS_SUCCESS
);
103 NTSTATUS
MinixReadInode(PDEVICE_OBJECT DeviceObject
,
104 MINIX_DEVICE_EXTENSION
* DeviceExt
,
106 struct minix_inode
* result
)
109 struct minix_inode
* inodes
;
112 DPRINT("MinixReadInode(ino %x, result %x)\n",ino
,result
);
114 block
= 2 + DeviceExt
->sb
->s_imap_blocks
+ DeviceExt
->sb
->s_zmap_blocks
115 + ((ino
-1) / MINIX_INODES_PER_BLOCK
);
116 DPRINT("Reading block %x offset %x\n",block
,block
*BLOCKSIZE
);
117 DPRINT("Index %x\n",(ino
-1)%MINIX_INODES_PER_BLOCK
);
119 BaseAddress
= ExAllocatePool(NonPagedPool
, PAGE_SIZE
);
121 MinixReadPage(DeviceObject
,
125 inodes
= (struct minix_inode
*)(BaseAddress
+ ((block
% 4) * 512));
128 &inodes
[(ino
-1)%MINIX_INODES_PER_BLOCK
],
129 sizeof(struct minix_inode
));
130 DPRINT("result->i_uid %x\n",result
->i_uid
);
131 DPRINT("result->i_size %x\n",result
->i_size
);
133 ExFreePool(BaseAddress
);
135 return(STATUS_SUCCESS
);