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

Go to the source code of this file.

Functions

devcall rdsclose (struct dentry *devptr)
 

Function Documentation

◆ rdsclose()

devcall rdsclose ( struct dentry devptr)

Definition at line 9 of file rdsclose.c.

References dentry::dvminor, OK, rdscblk::rd_chnext, rdscblk::rd_ctnext, RD_FREE, rdscblk::rd_free, RD_INVALID, rdbuff::rd_next, RD_OPEN, rdbuff::rd_prev, rdscblk::rd_rhnext, rdscblk::rd_rtnext, rdscblk::rd_state, rdbuff::rd_status, rdstab, and SYSERR.

Referenced by rdscontrol().

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
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
#define RD_INVALID
Definition: rdisksys.h:49
Here is the caller graph for this function: