コード例 #1
0
ファイル: namei.c プロジェクト: kenanconan/firekylin
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;
}
コード例 #2
0
ファイル: file.c プロジェクト: scutalouise/firekylin
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;
}