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);
}

コメント