ErrorCode writeInodeData(FileSystem* fs, Inode* inode, BYTE* buf, size_type off, size_type size, size_type* writebyte){ assert(off < MAX_FILE_SIZE); /* size_type i = 0; for(i=0; i<size; i++){ printf("%c", *(buf+i)); } */ size_type byteswritten = 0; size_type start = off; while(byteswritten < size){ size_type b_id; size_type b_offset; size_type len; ErrorCode err = Potato_bmap(fs, inode, &start, &b_id, &b_offset); if(err == Success && b_id > 0){ len = size - byteswritten < BLOCK_SIZE-b_offset? size-byteswritten:BLOCK_SIZE-b_offset; printf("[writeInodeData] write block %ld, offset %ld, len %ld\n", b_id, b_offset, len); err = writeDataBlock(fs, b_id, buf, b_offset, len); if(err != Success){ return err; } }else{ ErrorCode err = Potato_balloc(fs, inode, start/BLOCK_SIZE, &b_id); printf("[writeInodeData] cur b_id: %ld\n", b_id); if(err != Success) return err; b_offset = start%BLOCK_SIZE; len = size - byteswritten < BLOCK_SIZE-b_offset? size-byteswritten:BLOCK_SIZE-b_offset; err = writeDataBlock(fs, b_id, buf, b_offset, len); if(err != Success) return err; } byteswritten += len; start+= len; buf+=len; } *writebyte = byteswritten; inode->fileSize = off+size>inode->fileSize? off+size: inode->fileSize; return Success; }
void writeBlock(CacheData *cacheData) { if (cacheData!=NULL) { writeDataBlock(cacheData); } }