コード例 #1
0
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;
}
コード例 #2
0
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;
}
コード例 #3
0
ファイル: OsalKfile.c プロジェクト: andreimironenko/syslink
/*
 * ======== 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;
}
コード例 #4
0
ファイル: OsalKfile.c プロジェクト: andreimironenko/syslink
/*
 * ======== 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;
}
コード例 #5
0
ファイル: kfiledef.c プロジェクト: zp8001/STUDY_4.0.3
/** ============================================================================
 *  @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 ;
}
コード例 #6
0
ファイル: kfiledef.c プロジェクト: zp8001/STUDY_4.0.3
/** ============================================================================
 *  @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 ;
}