int yaffs_read(int fd, void *buf, unsigned int nbyte) { yaffsfs_Handle *h = NULL; yaffs_Object *obj = NULL; int pos = 0; int nRead = -1; int maxRead; yaffsfs_Lock(); h = yaffsfs_GetHandlePointer(fd); obj = yaffsfs_GetHandleObject(fd); if(!h || !obj) { // bad handle yaffsfs_SetError(-EBADF); } else if( h && obj) { pos= h->position; if(yaffs_GetObjectFileLength(obj) > pos) { maxRead = yaffs_GetObjectFileLength(obj) - pos; } else { maxRead = 0; } if(nbyte > maxRead) { nbyte = maxRead; } if(nbyte > 0) { nRead = yaffs_ReadDataFromFile(obj,buf,pos,nbyte); if(nRead >= 0) { h->position = pos + nRead; } else { //todo error } } else { nRead = 0; } } yaffsfs_Unlock(); return (nRead >= 0) ? nRead : -1; }
static int yaffs_readpage_nolock(struct file *f, struct page *pg) { yaffs_Object *obj; unsigned char *pg_buf; int ret; yaffs_Device *dev; T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_readpage at %08x, size %08x\n", (unsigned)(pg->index << PAGE_CACHE_SHIFT), (unsigned)PAGE_CACHE_SIZE)); obj = yaffs_DentryToObject(f->f_dentry); dev = obj->myDev; #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) BUG_ON(!PageLocked(pg)); #else if (!PageLocked(pg)) PAGE_BUG(pg); #endif pg_buf = kmap(pg); yaffs_GrossLock(dev); ret = yaffs_ReadDataFromFile(obj, pg_buf, pg->index << PAGE_CACHE_SHIFT, PAGE_CACHE_SIZE); yaffs_GrossUnlock(dev); if (ret >= 0) ret = 0; if (ret) { ClearPageUptodate(pg); SetPageError(pg); } else { SetPageUptodate(pg); ClearPageError(pg); } flush_dcache_page(pg); kunmap(pg); T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_readpage done\n")); return ret; }