Do read write - mathfur/minix GitHub Wiki
呼出元
do_read
概要
- servers/vfs/read.c:87 にて定義
- read_writeをエラー処理とロック機構でラップしたもの
引数
実装
int do_read_write(rw_flag)
int rw_flag; /* READING or WRITING */
{
/* Perform read(fd, buffer, nbytes) or write(fd, buffer, nbytes) call. */
struct filp *f;
tll_access_t locktype; // TLL_NONE | TLL_READ | TLL_READSER | TLL_WRITE
// TLL == 3相ロック
// # define scratch(p) (scratchpad[((int) ((p) - fproc))])
scratch(fp).file.fd_nr = job_m_in.fd;
scratch(fp).io.io_buffer = job_m_in.buffer;
scratch(fp).io.io_nbytes = (size_t) job_m_in.nbytes;
locktype = (rw_flag == READING) ? VNODE_READ : VNODE_WRITE;
// filpが取得できなければエラー
if ((f = get_filp(scratch(fp).file.fd_nr, locktype)) == NULL)
return(err_code);
// filpのR/W権限チェック -> だめならfilpロックを離す
if (((f->filp_mode) & (rw_flag == READING ? R_BIT : W_BIT)) == 0) {
unlock_filp(f);
return(f->filp_mode == FILP_CLOSED ? EIO : EBADF);
}
if (scratch(fp).io.io_nbytes == 0) {
unlock_filp(f);
return(0); /* so char special files need not check for 0*/
}
int r = read_write(rw_flag, f, scratch(fp).io.io_buffer, scratch(fp).io.io_nbytes,
who_e);
unlock_filp(f);
return(r);
}
コメント