static loff_t proc_root_llseek(struct file *file, loff_t offset, int origin) { loff_t ret; mutex_lock(&file->f_dentry->d_inode->i_mutex); ret = default_llseek(file, offset, origin); mutex_unlock(&file->f_dentry->d_inode->i_mutex); return ret; }
static inline loff_t nrx_file_lseek(struct file *f, loff_t offset, int whence) { loff_t retval; lock_kernel(); if (f->f_op->llseek != NULL) retval = (*f->f_op->llseek)(f, offset, whence); else retval = default_llseek(f, offset, whence); unlock_kernel(); return retval; }
/* * ======== OsalKfile_open ======== */ Int OsalKfile_open (String fileName, Char * fileMode, OsalKfile_Handle * fileHandle) { Int status = OSALKFILE_SUCCESS; struct file * fileDesc = NULL; OsalKfile_Object * fileObject = NULL; mm_segment_t fs; GT_3trace (curTrace, GT_ENTER, "OsalKfile_open", fileName, fileMode, fileHandle); GT_assert (curTrace, (fileName != NULL)); GT_assert (curTrace, (fileMode != NULL)); GT_assert (curTrace, (fileHandle != NULL)); #if !defined(SYSLINK_BUILD_OPTIMIZE) if (fileName == NULL) { /*! @retval OSALKFILE_E_INVALIDARG NULL provided for argument fileName. */ status = OSALKFILE_E_INVALIDARG; GT_setFailureReason (curTrace, GT_4CLASS, "OsalKfile_open", status, "NULL provided for argument fileName"); } else if (fileMode == NULL) { /*! @retval OSALKFILE_E_INVALIDARG NULL provided for argument fileMode. */ status = OSALKFILE_E_INVALIDARG; GT_setFailureReason (curTrace, GT_4CLASS, "OsalKfile_open", status, "NULL provided for argument fileMode"); } else if (fileMode [0] != 'r') { /*! @retval OSALKFILE_E_INVALIDARG Only read 'r' mode is supported. */ status = OSALKFILE_E_INVALIDARG; GT_setFailureReason (curTrace, GT_4CLASS, "OsalKfile_open", status, "Only read 'r' mode is supported."); } else if (fileHandle == NULL) { /*! @retval OSALKFILE_E_INVALIDARG NULL provided for argument fileHandle. */ status = OSALKFILE_E_INVALIDARG; GT_setFailureReason (curTrace, GT_4CLASS, "OsalKfile_open", status, "NULL provided for argument fileHandle"); } else { #endif /* #if !defined(SYSLINK_BUILD_OPTIMIZE) */ *fileHandle = NULL; fileObject = Memory_alloc (NULL, sizeof (OsalKfile_Object), 0, NULL); #if !defined(SYSLINK_BUILD_OPTIMIZE) if (fileObject == NULL) { /*! @retval OSALKFILE_E_MEMORY Failed to allocate memory for OsalKfile object. */ status = OSALKFILE_E_MEMORY; GT_setFailureReason (curTrace, GT_4CLASS, "OsalKfile_open", status, "Failed to allocate memory for OsalKfile object."); } else { #endif /* #if !defined(SYSLINK_BUILD_OPTIMIZE) */ fs = get_fs (); set_fs (KERNEL_DS); fileDesc = filp_open (fileName, O_RDONLY, 0) ; #if !defined(SYSLINK_BUILD_OPTIMIZE) if ( (IS_ERR (fileDesc)) || (fileDesc == NULL) || (fileDesc->f_op == NULL) || (fileDesc->f_op->read == NULL)) { /*! @retval OSALKFILE_E_FILEOPEN Failed to open file. */ status = OSALKFILE_E_FILEOPEN; GT_setFailureReason (curTrace, GT_4CLASS, "Kfile_Open", status, "Failed to open file."); } else { #endif /* #if !defined(SYSLINK_BUILD_OPTIMIZE) */ fileObject->fileDesc = fileDesc; fileObject->fileName = fileName; fileObject->curPos = 0; *fileHandle = (OsalKfile_Handle) fileObject; /* Get the file size */ fileDesc->f_pos = 0u; if (fileDesc->f_op->llseek != NULL) { fileObject->size = fileDesc->f_op->llseek (fileDesc, 0, SEEK_END); fileDesc->f_op->llseek (fileDesc, 0, SEEK_SET); } else { fileObject->size = default_llseek (fileDesc,0,SEEK_END); default_llseek (fileDesc, 0, SEEK_SET); } #if !defined(SYSLINK_BUILD_OPTIMIZE) } #endif /* #if !defined(SYSLINK_BUILD_OPTIMIZE) */ /* If the function call failed then free the object allocated * earlier. */ if (status < 0) { Memory_free (NULL, fileObject, sizeof (OsalKfile_Object)); *fileHandle = NULL; } set_fs (fs); #if !defined(SYSLINK_BUILD_OPTIMIZE) } } #endif /* #if !defined(SYSLINK_BUILD_OPTIMIZE) */ GT_1trace (curTrace, GT_LEAVE, "OsalKfile_open", status); /*! @retval OSALKFILE_SUCCESS Operation successfully completed. */ return status; }
/* * ======== OsalKfile_seek ======== */ Int OsalKfile_seek (OsalKfile_Handle fileHandle, Int32 offset, OsalKfile_Pos pos) { Int status = OSALKFILE_SUCCESS; struct file * fileDesc = NULL; OsalKfile_Object * fileObject = NULL; mm_segment_t fs; GT_3trace (curTrace, GT_ENTER, "OsalKfile_seek", fileHandle, offset, pos); GT_assert (curTrace, (fileHandle != NULL)); GT_assert (curTrace, (pos < OsalKfile_Pos_EndValue)); #if !defined(SYSLINK_BUILD_OPTIMIZE) if (fileHandle == NULL) { /*! @retval OSALKFILE_E_INVALIDARG NULL provided for argument fileHandle. */ status = OSALKFILE_E_INVALIDARG; GT_setFailureReason (curTrace, GT_4CLASS, "OsalKfile_seek", status, "NULL provided for argument fileHandle"); } else { #endif /* #if !defined(SYSLINK_BUILD_OPTIMIZE) */ fileObject = (OsalKfile_Object* ) fileHandle; fs = get_fs (); set_fs (get_ds ()); fileDesc = fileObject->fileDesc; switch (pos) { case OsalKfile_Pos_SeekSet: { if ((offset < 0) || (offset > fileObject->size)) { /*! @retval OSALKFILE_E_OUTOFRANGE offset is out of range for seek from the specified pos */ status = OSALKFILE_E_OUTOFRANGE; GT_setFailureReason (curTrace, GT_4CLASS, "OsalKfile_seek", status, "offset is out of range for" " seek from the specified pos"); } else { if (fileDesc->f_op->llseek != NULL) { /* This may be the case if yaffs2 file system is used.*/ fileObject->curPos = fileDesc->f_op->llseek (fileDesc, offset, SEEK_SET); } else { fileObject->curPos = default_llseek (fileDesc, offset, SEEK_SET); } } } break; case OsalKfile_Pos_SeekCur: { if ( ((fileObject->curPos + offset) > fileObject->size) || ((fileObject->curPos + offset) < 0)) { /*! @retval OSALKFILE_E_OUTOFRANGE offset is out of range for seek from the specified pos */ status = OSALKFILE_E_OUTOFRANGE; GT_setFailureReason (curTrace, GT_4CLASS, "OsalKfile_seek", status, "offset is out of range for" " seek from the specified pos"); } else { if (fileDesc->f_op->llseek != NULL) { /* This may be the case if yaffs2 file system is used.*/ fileObject->curPos = fileDesc->f_op->llseek (fileDesc, offset, SEEK_CUR); } else { fileObject->curPos = default_llseek (fileDesc, offset, SEEK_CUR); } } } break; case OsalKfile_Pos_SeekEnd: { /* A negative offset indicates offset from the end of file. * Check that the specified offset is not beyond * the bounds of the file. */ if ((-offset < 0) || (-offset > fileObject->size)) { /*! @retval OSALKFILE_E_OUTOFRANGE offset is out of range for seek from the specified pos */ status = OSALKFILE_E_OUTOFRANGE; GT_setFailureReason (curTrace, GT_4CLASS, "OsalKfile_seek", status, "offset is out of range for" " seek from the specified pos"); } else { if (fileDesc->f_op->llseek != NULL) { /* This may be the case if yaffs2 file system is used.*/ fileObject->curPos = fileDesc->f_op->llseek (fileDesc, offset, SEEK_END); } else { fileObject->curPos = default_llseek (fileDesc, offset, SEEK_END); } } } break; default: { /*! @retval OSALKFILE_E_INVALIDARG Invalid value provided for argument pos. */ status = OSALKFILE_E_INVALIDARG; GT_setFailureReason (curTrace, GT_4CLASS, "OsalKfile_seek", status, "Invalid value provided for argument pos."); } break; } set_fs (fs); #if !defined(SYSLINK_BUILD_OPTIMIZE) } #endif /* #if !defined(SYSLINK_BUILD_OPTIMIZE) */ GT_1trace (curTrace, GT_LEAVE, "OsalKfile_seek", status); /*! @retval OSALKFILE_SUCCESS Operation successfully completed. */ return status; }
/** ============================================================================ * @func KFILEDEF_Seek * * @desc Repositions the file pointer according to specified arguments. * * @modif None * ============================================================================ */ EXPORT_API DSP_STATUS KFILEDEF_Seek (IN Void * fileHandle, IN Int32 offset, IN KFILE_FileSeek origin) { DSP_STATUS status = DSP_SOK ; struct file * fileDesc = NULL ; mm_segment_t fs ; KFILEDEF_Object * fileObj = NULL ; TRC_3ENTER ("KFILEDEF_Seek", fileHandle, offset, origin) ; DBC_Require (fileHandle != NULL) ; DBC_Require ( (origin == KFILE_SeekSet) || (origin == KFILE_SeekCur) || (origin == KFILE_SeekEnd)) ; if (fileHandle == NULL) { status = DSP_EFILE ; SET_FAILURE_REASON ; } else { fileObj = (KFILEDEF_Object *) fileHandle ; fs = get_fs () ; set_fs (get_ds()) ; fileDesc = fileObj->fileDesc ; ; switch (origin) { case KFILE_SeekSet: if ( (offset < 0) || (offset > fileObj->size)) { status = DSP_ERANGE ; SET_FAILURE_REASON ; } else { /* Changes for yaffs2 support */ if (fileDesc->f_op->llseek != NULL) { fileObj->curPos = fileDesc->f_op->llseek (fileDesc, offset, SEEK_SET) ; } else { fileObj->curPos = default_llseek (fileDesc, offset, SEEK_SET) ; } } break ; case KFILE_SeekCur: if ( ((fileObj->curPos + offset) > fileObj->size) || ((fileObj->curPos + offset) < 0)) { status = DSP_ERANGE ; SET_FAILURE_REASON ; } else { /* Changes for yaffs2 support */ if (fileDesc->f_op->llseek != NULL) { fileObj->curPos = fileDesc->f_op->llseek (fileDesc, offset, SEEK_CUR) ; } else { fileObj->curPos = default_llseek (fileDesc, offset, SEEK_CUR) ; } } break ; case KFILE_SeekEnd: /* ---------------------------------------------------------------- * A negative offset indicates offset from the end of file. * Check that the specified offset is not beyond * the bounds of the file. * ---------------------------------------------------------------- */ if ( (-offset < 0) || (-offset > fileObj->size)) { status = DSP_ERANGE ; SET_FAILURE_REASON ; } else { /* Changes for yaffs2 support */ if (fileDesc->f_op->llseek != NULL) { fileObj->curPos = fileDesc->f_op->llseek (fileDesc, offset, SEEK_END) ; } else { fileObj->curPos = default_llseek (fileDesc, offset, SEEK_END) ; } } break ; default: TRC_0PRINT (TRC_LEVEL7, "Invalid origin specified\n") ; status = DSP_EINVALIDARG ; SET_FAILURE_REASON ; break ; } set_fs (fs) ; } TRC_1LEAVE ("KFILEDEF_Seek", status) ; return status ; }
/** ============================================================================ * @func KFILEDEF_Open * * @desc Opens a file specified by name of file. * * @modif None * ============================================================================ */ EXPORT_API DSP_STATUS KFILEDEF_Open (IN CONST FileName fileName, IN CONST Char8 * mode, OUT Void ** fileHandlePtr) { DSP_STATUS status = DSP_SOK ; Uint32 length = 0 ; struct file * fileDesc = NULL ; mm_segment_t fs ; KFILEDEF_Object * fileObj = NULL ; TRC_3ENTER ("KFILEDEF_Open ()", fileName, mode, fileHandlePtr) ; DBC_Require (fileName != NULL) ; DBC_Require (mode != NULL) ; DBC_Require (fileHandlePtr != NULL) ; if ( (fileName == NULL) || (fileHandlePtr == NULL) || (mode == NULL) || (mode [0] != 'r')) { status = DSP_EINVALIDARG ; SET_FAILURE_REASON ; } else { *fileHandlePtr = NULL ; status = GEN_Strlen (fileName, &length) ; if (DSP_FAILED (status)) { SET_FAILURE_REASON ; } else if (length == 0) { status = DSP_EINVALIDARG ; SET_FAILURE_REASON ; } else { status = MEM_Alloc ((Void **) &fileObj, sizeof (KFILEDEF_Object), MEM_DEFAULT) ; } } if (DSP_SUCCEEDED (status)) { fs = get_fs () ; set_fs (KERNEL_DS) ; /* -------------------------------------------------------------------- * Open the file. Initialize the file object * after validating the object returned by kernel. * The third argument is ignored unless creating files. * -------------------------------------------------------------------- */ fileDesc = filp_open (fileName, O_RDONLY, 0) ; if ( (IS_ERR (fileDesc)) || (fileDesc == NULL) || (fileDesc->f_op == NULL) || (fileDesc->f_op->read == NULL)) { status = DSP_EFILE ; SET_FAILURE_REASON ; } else { fileObj->fileDesc = fileDesc ; fileObj->fileName = fileName ; fileObj->curPos = 0 ; /* Get the file size */ fileDesc->f_pos = 0u ; *fileHandlePtr = (Void *) fileObj ; /* Changes for yaffs2 support */ if (fileDesc->f_op->llseek != NULL) { fileObj->size = fileDesc->f_op->llseek (fileDesc, 0, SEEK_END) ; fileDesc->f_op->llseek (fileDesc, 0, SEEK_SET) ; } else { fileObj->size = default_llseek (fileDesc, 0, SEEK_END) ; default_llseek (fileDesc, 0, SEEK_SET) ; } } /* -------------------------------------------------------------------- * If the function call failed then free the object allocated before. * -------------------------------------------------------------------- */ if (DSP_FAILED (status)) { FREE_PTR (*fileHandlePtr) ; *fileHandlePtr = NULL ; } set_fs (fs) ; } else { status = DSP_EFILE ; SET_FAILURE_REASON ; } DBC_Ensure ( DSP_SUCCEEDED (status) || ( DSP_FAILED (status) && (fileHandlePtr != NULL) && (*fileHandlePtr == NULL))) ; TRC_1LEAVE ("KFILEDEF_Open", status) ; return status ; }