카테고리 없음

[File system] Read/Write

크크다스 2017. 3. 29. 19:55
반응형
Kernel에서 FS의 File을 직접 Handling하는 Code




#include "include/linux/fs.h"
// fs/read_write.c

mm_segment_t    gSavedKernFS;
struct file*    gFileKernFS;
loff_t                gPosKernFS;

struct file* kernFS_open(char* pFilename, int readOnly)
{
    if(! pFilename) return NULL;

    // struct timeval tv;
    // do_gettimeofday(&tv);

    // pFilename = "/tmp/test_file";
    gSavedKernFS = get_fs();
    set_fs(KERNEL_DS);

    if(readOnly) {
        gFileKernFS = filp_open(pFilename, O_RDONLY, 0644);
    } else {
        gFileKernFS = filp_open(pFilename, O_APPEND | O_RDWR | O_CREAT, 0644);
    }
    if(IS_ERR(gFileKernFS))
    {
        printk("%s[%d] kernFS_open(%s) fail\n", __func__, __LINE__, pFilename);
        goto fail_rollback;
    }
    gPosKernFS = 0;

    return gFileKernFS;

fail_rollback:
    set_fs(gSavedKernFS);
    return NULL;
}

int kernFS_close()
{
    if(gFileKernFS) {
        filp_close(gFileKernFS, NULL);
        gFileKernFS = NULL;
    }

    set_fs(gSavedKernFS);

    memset(&gSavedKernFS, 0x00, sizeog(gSavedKernFS));
    gPosKernFS = 0;

    return 0;
}

// ssize_t vfs_write(struct file *file, const char __user *p, size_t count, loff_t *pos)
ssize_t kernFS_write(char* pBuff, size_t count)
{
    if(! gFileKernFS) return -1;
    if(! pBuff) return -1;
    if(count < 1) return -1;
   
    gPosKernFS = gFileKernFS->f_pos;

    return vfs_write(gFileKernFS, pBuff, count, &gPosKernFS);
}

// ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
ssize_t kernFS_read(char* pBuff, size_t buffLen)
{
    if(! pBuff) return -1;
    if(! gFileKernFS) return -1;

    return vfs_read(gFileKernFS, pBuff, buffLen, &gPosKernFS);
}


반응형