int yaffs_write(int fd, const void *buf, unsigned int nbyte) { yaffsfs_Handle *h = NULL; yaffs_Object *obj = NULL; int pos = 0; int nWritten = -1; yaffsfs_Lock(); h = yaffsfs_GetHandlePointer(fd); obj = yaffsfs_GetHandleObject(fd); if(!h || !obj) { // bad handle yaffsfs_SetError(-EBADF); } else if( h && obj && h->readOnly) { // todo error } else if( h && obj) { if(h->append) { pos = yaffs_GetObjectFileLength(obj); } else { pos = h->position; } nWritten = yaffs_WriteDataToFile(obj,buf,pos,nbyte); if(nWritten >= 0) { h->position = pos + nWritten; } else { //todo error } } yaffsfs_Unlock(); return (nWritten >= 0) ? nWritten : -1; }
static int yaffs_writepage(struct page *page) #endif { struct address_space *mapping = page->mapping; loff_t offset = (loff_t) page->index << PAGE_CACHE_SHIFT; struct inode *inode; unsigned long end_index; char *buffer; yaffs_Object *obj; int nWritten = 0; unsigned nBytes; if (!mapping) BUG(); inode = mapping->host; if (!inode) BUG(); if (offset > inode->i_size) { T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_writepage at %08x, inode size = %08x!!!\n", (unsigned)(page->index << PAGE_CACHE_SHIFT), (unsigned)inode->i_size)); T(YAFFS_TRACE_OS, (KERN_DEBUG " -> don't care!!\n")); unlock_page(page); return 0; } end_index = inode->i_size >> PAGE_CACHE_SHIFT; if (page->index < end_index) { nBytes = PAGE_CACHE_SIZE; } else { nBytes = inode->i_size & (PAGE_CACHE_SIZE - 1); } get_page(page); buffer = kmap(page); obj = yaffs_InodeToObject(inode); yaffs_GrossLock(obj->myDev); T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_writepage at %08x, size %08x\n", (unsigned)(page->index << PAGE_CACHE_SHIFT), nBytes)); T(YAFFS_TRACE_OS, (KERN_DEBUG "writepag0: obj = %05x, ino = %05x\n", (int)obj->variant.fileVariant.fileSize, (int)inode->i_size)); nWritten = yaffs_WriteDataToFile(obj, buffer, page->index << PAGE_CACHE_SHIFT, nBytes, 0); T(YAFFS_TRACE_OS, (KERN_DEBUG "writepag1: obj = %05x, ino = %05x\n", (int)obj->variant.fileVariant.fileSize, (int)inode->i_size)); yaffs_GrossUnlock(obj->myDev); kunmap(page); SetPageUptodate(page); UnlockPage(page); put_page(page); return (nWritten == nBytes) ? 0 : -ENOSPC; }