code:smount - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
6082
6083 /*
6084 * the mount system call.
6085 */
6086 smount()
6087 {
6088 int d;
6089 register *ip;
6090 register struct mount *mp, *smp;
6091 extern uchar;
6092
6093 d = getmdev();
从 u.u_dirp 即special 指定的INODE(块设备装载INODE) 提取 设备号d6094 if(u.u_error)
6095 return;
6098 if(ip == NULL)
6099 return;
6100 if(ip->i_count!=1 || (ip->i_mode&(IFBLK&IFCHR))!=0)
- ip ← name 对应的INODE
6101 goto out;
6102 smp = NULL;
- 以下情况 转到出错处理
- ip被其他进程使用(ip->i_count!=1)
- ip不是设备装载INODE
6103 for(mp = &mount[0]; mp < &mount[NMOUNT]; mp++) {
6104 if(mp->m_bufp != NULL) {
6105 if(d == mp->m_dev)
6106 goto out;
6107 } else
6108 if(smp == NULL)
6109 smp = mp;
6110 }
6111 if(smp == NULL)
- 遍历mount[],找到 空闲项(mp->m_bufp == NULL)
- 若已有 对应设备的加载项,则转到出错处理
6112 goto out;
6113 (*bdevsw[d.d_major].d_open)(d, !u.u_arg[2]);
6114 if(u.u_error)
6115 goto out;
6116 mp = bread(d, 1);
- 启动对应设备
- 对 RK磁盘 没有作用
- 至于 传入的参数 原因不明,列入遗留问题
6117 if(u.u_error) {
- 读出 d设备的超级块
6118 brelse(mp);
6119 goto out1;
6120 }
6121 smp->m_inodp = ip;
6122 smp->m_dev = d;
6123 smp->m_bufp = getblk(NODEV);
6124 bcopy(mp->b_addr, smp->m_bufp->b_addr, 256);
6125 smp = smp->m_bufp->b_addr;
6126 smp->s_ilock = 0;
6127 smp->s_flock = 0;
6128 smp->s_ronly = u.u_arg[2] & 1;
6129 brelse(mp);
- 置 加载块 smp 相关参数
6130 ip->i_flag =| IMOUNT;
6131 prele(ip);
- ip 置 IMOUNT 标志
6132 return;
6133
6134 out:
6135 u.u_error = EBUSY;
6136 out1:
- 错误代码 : EBUSY
6137 iput(ip);
6138 }
6139 /* ------------------------- */
- (mount = 21.)
- sys mount; special; name; rwflag