static int add_entry(struct inode *inode, char *name,ino_t ino) { struct buffer *buf; struct dir_entry *de; int size=0; if (!inode) panic("find_entry:inode is NULL"); for (int i = 0; i < 7 + 512; i++) { buf = bread(inode->i_dev, minix1_wbmap(inode, i)); if (!buf) panic("add_entry:can not read buf"); de = (struct dir_entry *) buf->b_data; for (int j = 0; j < 1024 / sizeof(struct dir_entry); j++) { if (size<inode->i_size && de->ino) { size += sizeof(struct dir_entry); de++; continue; } strncpy(de->name,name,NAME_LEN); de->ino=ino; buf->b_flag |= B_DIRTY; size += sizeof(struct dir_entry); if (size > inode->i_size) { inode->i_size = size; inode->i_flag |= I_DIRTY; } brelse(buf); return 0; } brelse(buf); return 1; } return 1; }
int minix1_file_write(struct inode *inode, char * buf, size_t size, off_t off, int rw_flag) { struct buffer *bh; int left, chars; left = size; while (left) { bh = bread(inode->i_dev, minix1_wbmap(inode, off / 1024)); if (!bh) { panic("write file error"); } chars = min((1024 - off % 1024), left); memcpy(bh->b_data + off % 1024, buf, chars); off += chars; left -= chars; bh->b_flag|=B_DIRTY; brelse(bh); } return size - left; }