XINU
rdsclose.c
Go to the documentation of this file.
1 /* rdsclose.c - rdsclose */
2 
3 #include <xinu.h>
4 
5 /*------------------------------------------------------------------------
6  * rdsclose - Close a remote disk device
7  *------------------------------------------------------------------------
8  */
10  struct dentry *devptr /* Entry in device switch table */
11  )
12 {
13  struct rdscblk *rdptr; /* Ptr to control block entry */
14  struct rdbuff *bptr; /* Ptr to buffer on a list */
15  struct rdbuff *nptr; /* Ptr to next buff on the list */
16  int32 nmoved; /* Number of buffers moved */
17 
18  /* Device must be open */
19 
20  rdptr = &rdstab[devptr->dvminor];
21  if (rdptr->rd_state != RD_OPEN) {
22  return SYSERR;
23  }
24 
25  /* Request queue must be empty */
26 
27  if (rdptr->rd_rhnext != (struct rdbuff *)&rdptr->rd_rtnext) {
28  return SYSERR;
29  }
30 
31  /* Move all buffers from the cache to the free list */
32 
33  bptr = rdptr->rd_chnext;
34  nmoved = 0;
35  while (bptr != (struct rdbuff *)&rdptr->rd_ctnext) {
36  nmoved++;
37 
38  /* Unlink buffer from cache */
39 
40  nptr = bptr->rd_next;
41  (bptr->rd_prev)->rd_next = nptr;
42  nptr->rd_prev = bptr->rd_prev;
43 
44  /* Insert buffer into free list */
45 
46  bptr->rd_next = rdptr->rd_free;
47 
48  rdptr->rd_free = bptr;
49  bptr->rd_status = RD_INVALID;
50 
51  /* Move to next buffer in the cache */
52 
53  bptr = nptr;
54  }
55 
56  /* Set the state to indicate the device is closed */
57 
58  rdptr->rd_state = RD_FREE;
59  return OK;
60 }
#define RD_OPEN
Definition: rdisksys.h:37
#define RD_FREE
Definition: rdisksys.h:36
int32 dvminor
Definition: conf.h:8
全てのシステムヘッダファイルをインクルードする。
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
struct rdbuff * rd_rtnext
Definition: rdisksys.h:75
int32 rd_status
Definition: rdisksys.h:62
#define OK
処理が成功した場合
Definition: kernel.h:77
devcall rdsclose(struct dentry *devptr)
Definition: rdsclose.c:9
Definition: conf.h:6
struct rdbuff * rd_free
Definition: rdisksys.h:87
struct rdbuff * rd_prev
Definition: rdisksys.h:57
struct rdbuff * rd_rhnext
Definition: rdisksys.h:73
struct rdscblk rdstab[]
Definition: rdsinit.c:11
int int32
符号あり32ビット整数(int)
Definition: kernel.h:11
struct rdbuff * rd_next
Definition: rdisksys.h:56
struct rdbuff * rd_ctnext
Definition: rdisksys.h:82
struct rdbuff * rd_chnext
Definition: rdisksys.h:80
int32 rd_state
Definition: rdisksys.h:69
int32 devcall
デバイスコール関数 返り値の型
Definition: kernel.h:49
#define RD_INVALID
Definition: rdisksys.h:49