/*===========================================================================* * do_statvfs * *===========================================================================*/ int do_statvfs() { /* Perform the stat(name, buf) system call. */ int r; struct vnode *vp; struct vmnt *vmp; char fullpath[PATH_MAX]; struct lookup resolve; vir_bytes vname1, statbuf; size_t vname1_length; vname1 = (vir_bytes) job_m_in.name1; vname1_length = (size_t) job_m_in.name1_length; statbuf = (vir_bytes) job_m_in.name2; lookup_init(&resolve, fullpath, PATH_NOFLAGS, &vmp, &vp); resolve.l_vmnt_lock = VMNT_READ; resolve.l_vnode_lock = VNODE_READ; if (fetch_name(vname1, vname1_length, fullpath) != OK) return(err_code); if ((vp = eat_path(&resolve, fp)) == NULL) return(err_code); r = req_statvfs(vp->v_fs_e, who_e, statbuf); unlock_vnode(vp); unlock_vmnt(vmp); put_vnode(vp); return r; }
/*===========================================================================* * update_statvfs * *===========================================================================*/ int update_statvfs(struct vmnt *vmp, struct statvfs *buf) { /* Get statistics from a file system, and cache part of the results. */ int r; if ((r = req_statvfs(vmp->m_fs_e, buf)) != OK) return r; vmp->m_stats.f_flag = buf->f_flag; vmp->m_stats.f_bsize = buf->f_bsize; vmp->m_stats.f_frsize = buf->f_frsize; vmp->m_stats.f_iosize = buf->f_iosize; vmp->m_stats.f_blocks = buf->f_blocks; vmp->m_stats.f_bfree = buf->f_bfree; vmp->m_stats.f_bavail = buf->f_bavail; vmp->m_stats.f_bresvd = buf->f_bresvd; vmp->m_stats.f_files = buf->f_files; vmp->m_stats.f_ffree = buf->f_ffree; vmp->m_stats.f_favail = buf->f_favail; vmp->m_stats.f_fresvd = buf->f_fresvd; vmp->m_stats.f_syncreads = buf->f_syncreads; vmp->m_stats.f_syncwrites = buf->f_syncwrites; vmp->m_stats.f_asyncreads = buf->f_asyncreads; vmp->m_stats.f_asyncwrites = buf->f_asyncwrites; vmp->m_stats.f_namemax = buf->f_namemax; return OK; }
/*===========================================================================* * do_fstatvfs * *===========================================================================*/ int do_fstatvfs() { /* Perform the fstat(fd, buf) system call. */ register struct filp *rfilp; int r, rfd; vir_bytes statbuf; rfd = job_m_in.fd; statbuf = (vir_bytes) job_m_in.name2; /* Is the file descriptor valid? */ if ((rfilp = get_filp(rfd, VNODE_READ)) == NULL) return(err_code); r = req_statvfs(rfilp->filp_vno->v_fs_e, who_e, statbuf); unlock_filp(rfilp); return(r); }