static int make_root(struct v7fs_self *fs) { struct v7fs_inode inode; struct v7fs_dirent *dir; int error; /* INO 1 badblk (don't used) */ memset(&inode, 0, sizeof(inode)); inode.inode_number = 1; inode.mode = V7FS_IFREG; /* V7 manner */ v7fs_inode_writeback(fs, &inode); /* INO 2 root */ v7fs_ino_t ino; if ((error = v7fs_inode_allocate(fs, &ino))) { errno = error; warn("Can't allocate / inode"); return error; } memset(&inode, 0, sizeof(inode)); inode.inode_number = ino; inode.mode = 0777 | V7FS_IFDIR; inode.uid = 0; inode.gid = 0; inode.nlink = 2; /* . + .. */ inode.atime = inode.mtime = inode.ctime = time(0); /* root dirent. */ v7fs_datablock_expand(fs, &inode, sizeof(*dir) * 2); v7fs_daddr_t blk = inode.addr[0]; void *buf; if (!(buf = scratch_read(fs, blk))) { v7fs_inode_deallocate(fs, ino); errno = error = EIO; warn("Can't read / dirent."); return error; } dir = (struct v7fs_dirent *)buf; /*disk endian */ strcpy(dir[0].name, "."); dir[0].inode_number = V7FS_VAL16(fs, ino); strcpy(dir[1].name, ".."); dir[1].inode_number = V7FS_VAL16(fs, ino); if (!fs->io.write(fs->io.cookie, buf, blk)) {/*writeback */ scratch_free(fs, buf); errno = error = EIO; warn("Can't write / dirent."); return error; } scratch_free(fs, buf); v7fs_inode_writeback(fs, &inode); if ((error = v7fs_superblock_writeback(fs))) { errno = error; warnx("Can't write superblock."); } return error; }
int v7fs_sync(struct mount *mp, int waitfor, kauth_cred_t cred) { struct v7fs_mount *v7fsmount = mp->mnt_data; struct v7fs_self *fs = v7fsmount->core; struct v7fs_node *v7fs_node; struct v7fs_inode *inode; struct vnode *v; int err, error; int retry_cnt; DPRINTF("\n"); v7fs_superblock_writeback(fs); for (retry_cnt = 0; retry_cnt < 2; retry_cnt++) { error = 0; mutex_enter(&mntvnode_lock); for (v7fs_node = LIST_FIRST(&v7fsmount->v7fs_node_head); v7fs_node != NULL; v7fs_node = LIST_NEXT(v7fs_node, link)) { inode = &v7fs_node->inode; if (!v7fs_inode_allocated(inode)) { continue; } v = v7fs_node->vnode; mutex_enter(v->v_interlock); mutex_exit(&mntvnode_lock); err = vget(v, LK_EXCLUSIVE | LK_NOWAIT); if (err == 0) { err = VOP_FSYNC(v, cred, FSYNC_WAIT, 0, 0); vput(v); } if (err != 0) error = err; mutex_enter(&mntvnode_lock); } mutex_exit(&mntvnode_lock); if (error == 0) break; } return error; }
static int partition_check(struct v7fs_self *fs) { struct v7fs_superblock *sb = &fs->superblock; int error; if ((error = v7fs_superblock_load(fs))) { if (error != EINVAL) { /* Invalid superblock information is OK. */ warnx("Can't read superblock sector."); } } sb->modified = 1; if ((error = v7fs_superblock_writeback(fs))) { if (errno == EROFS) { warnx("Overwriting disk label? "); } warnx("Can't write superblock sector."); } return error; }