⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 journal.c

📁 嵌入式系统设计与实验教材二源码linux内核移植与编译
💻 C
📖 第 1 页 / 共 5 页
字号:
        char record[292];        struct dentry *root;        __u32 uid, gid, lmode;        int error;        ENTRY;        if ( presto_no_journal(fset) ) {                EXIT;                return 0;        }        root = fset->fset_mtpt;        uid = cpu_to_le32(dentry->d_inode->i_uid);        gid = cpu_to_le32(dentry->d_inode->i_gid);        lmode = cpu_to_le32(mode);         BUFF_ALLOC(buffer, NULL);        path = presto_path(dentry, root, buffer, PAGE_SIZE);        pathlen = cpu_to_le32(MYPATHLEN(buffer, path));        size =  sizeof(__u32) * current->ngroups +                 sizeof(struct journal_prefix) + 3 * sizeof(*tgt_dir_ver) +                sizeof(lmode) + sizeof(uid) + sizeof(gid) + sizeof(pathlen) +                sizeof(struct journal_suffix);        if ( size > sizeof(record) ) {                printk("PRESTO: BUFFER OVERFLOW in %s!\n", __FUNCTION__);        }        rec->is_kml = 1;        rec->size = size + size_round(le32_to_cpu(pathlen));        logrecord = journal_log_prefix(record, opcode, rec);        logrecord = logit(logrecord, tgt_dir_ver, sizeof(*tgt_dir_ver));        logrecord = log_version(logrecord, dentry->d_parent);        logrecord = logit(logrecord, new_file_ver, sizeof(*new_file_ver));        logrecord = logit(logrecord, &lmode, sizeof(lmode));        logrecord = logit(logrecord, &uid, sizeof(uid));        logrecord = logit(logrecord, &gid, sizeof(gid));        logrecord = logit(logrecord, &pathlen, sizeof(pathlen));        logrecord = journal_log_suffix(logrecord, record, fset, dentry, rec);        error = presto_log(fset, rec, record, size,                           path, size_round(le32_to_cpu(pathlen)),                           NULL, 0, NULL, 0);        BUFF_FREE(buffer);        EXIT;        return error;}int presto_journal_symlink(struct rec_info *rec, struct presto_file_set *fset, struct dentry *dentry,                           const char *target,                           struct presto_version *tgt_dir_ver,                           struct presto_version *new_link_ver){        int opcode = PRESTO_OP_SYMLINK;        char *buffer;        char *path;        __u32 pathlen;        int size;        char *logrecord;        char record[292];        __u32 targetlen = cpu_to_le32(strlen(target));        struct dentry *root;        __u32 uid, gid;        int error;        ENTRY;        if ( presto_no_journal(fset) ) {                EXIT;                return 0;        }        root = fset->fset_mtpt;        uid = cpu_to_le32(dentry->d_inode->i_uid);        gid = cpu_to_le32(dentry->d_inode->i_gid);        BUFF_ALLOC(buffer, NULL);        path = presto_path(dentry, root, buffer, PAGE_SIZE);        pathlen = cpu_to_le32(MYPATHLEN(buffer, path));        size =  sizeof(__u32) * current->ngroups +                 sizeof(struct journal_prefix) + 3 * sizeof(*tgt_dir_ver) +                sizeof(uid) + sizeof(gid) + sizeof(pathlen) +                sizeof(targetlen) + sizeof(struct journal_suffix);        if ( size > sizeof(record) ) {                printk("PRESTO: BUFFER OVERFLOW in %s!\n", __FUNCTION__);        }        rec->is_kml = 1;        rec->size = size + size_round(le32_to_cpu(pathlen)) +                size_round(le32_to_cpu(targetlen));        logrecord = journal_log_prefix(record, opcode, rec);        logrecord = logit(logrecord, tgt_dir_ver, sizeof(*tgt_dir_ver));        logrecord = log_version(logrecord, dentry->d_parent);        logrecord = logit(logrecord, new_link_ver, sizeof(*new_link_ver));        logrecord = logit(logrecord, &uid, sizeof(uid));        logrecord = logit(logrecord, &gid, sizeof(gid));        logrecord = logit(logrecord, &pathlen, sizeof(pathlen));        logrecord = logit(logrecord, &targetlen, sizeof(targetlen));        logrecord = journal_log_suffix(logrecord, record, fset, dentry, rec);        error = presto_log(fset, rec, record, size,                           path, size_round(le32_to_cpu(pathlen)),                           target, size_round(le32_to_cpu(targetlen)),                           NULL, 0);        BUFF_FREE(buffer);        EXIT;        return error;}int presto_journal_mkdir(struct rec_info *rec, struct presto_file_set *fset, struct dentry *dentry,                         struct presto_version *tgt_dir_ver,                         struct presto_version *new_dir_ver, int mode){        int opcode = PRESTO_OP_MKDIR;        char *buffer;        char *path;        __u32 pathlen;        int size;        char *logrecord;        char record[292];        struct dentry *root;        __u32 uid, gid, lmode;        int error;        ENTRY;        if ( presto_no_journal(fset) ) {                EXIT;                return 0;        }        root = fset->fset_mtpt;        uid = cpu_to_le32(dentry->d_inode->i_uid);        gid = cpu_to_le32(dentry->d_inode->i_gid);        lmode = cpu_to_le32(mode);        BUFF_ALLOC(buffer, NULL);        path = presto_path(dentry, root, buffer, PAGE_SIZE);        pathlen = cpu_to_le32(MYPATHLEN(buffer, path));        size = sizeof(__u32) * current->ngroups +                 sizeof(struct journal_prefix) + 3 * sizeof(*tgt_dir_ver) +                sizeof(lmode) + sizeof(uid) + sizeof(gid) + sizeof(pathlen) +                sizeof(struct journal_suffix);        if ( size > sizeof(record) ) {                printk("PRESTO: BUFFER OVERFLOW in %s!\n", __FUNCTION__);        }        rec->is_kml = 1;        rec->size = size + size_round(le32_to_cpu(pathlen));        logrecord = journal_log_prefix(record, opcode, rec);        logrecord = logit(logrecord, tgt_dir_ver, sizeof(*tgt_dir_ver));        logrecord = log_version(logrecord, dentry->d_parent);        logrecord = logit(logrecord, new_dir_ver, sizeof(*new_dir_ver));        logrecord = logit(logrecord, &lmode, sizeof(lmode));        logrecord = logit(logrecord, &uid, sizeof(uid));        logrecord = logit(logrecord, &gid, sizeof(gid));        logrecord = logit(logrecord, &pathlen, sizeof(pathlen));        logrecord = journal_log_suffix(logrecord, record, fset, dentry, rec);        error = presto_log(fset, rec, record, size,                           path, size_round(le32_to_cpu(pathlen)),                           NULL, 0, NULL, 0);        BUFF_FREE(buffer);        EXIT;        return error;}intpresto_journal_rmdir(struct rec_info *rec, struct presto_file_set *fset,                     struct dentry *dir, struct presto_version *tgt_dir_ver,                     struct presto_version *old_dir_ver, int len,                     const char *name){        int opcode = PRESTO_OP_RMDIR;        char *buffer;        char *path;        __u32 pathlen, llen;        int size;        char *logrecord;        char record[292];        struct dentry *root;        int error;        ENTRY;        if ( presto_no_journal(fset) ) {                EXIT;                return 0;        }        root = fset->fset_mtpt;        llen = cpu_to_le32(len);        BUFF_ALLOC(buffer, NULL);        path = presto_path(dir, root, buffer, PAGE_SIZE);        pathlen = cpu_to_le32(MYPATHLEN(buffer, path));        size =  sizeof(__u32) * current->ngroups +                 sizeof(struct journal_prefix) + 3 * sizeof(*tgt_dir_ver) +                sizeof(pathlen) + sizeof(llen) + sizeof(struct journal_suffix);        if ( size > sizeof(record) ) {                printk("PRESTO: BUFFER OVERFLOW in %s!\n", __FUNCTION__);        }        CDEBUG(D_JOURNAL, "path: %s (%d), name: %s (%d), size %d\n",               path, pathlen, name, len, size);        rec->is_kml = 1;        rec->size = size + size_round(le32_to_cpu(pathlen)) +                 size_round(len);        logrecord = journal_log_prefix(record, opcode, rec);        logrecord = logit(logrecord, tgt_dir_ver, sizeof(*tgt_dir_ver));        logrecord = log_version(logrecord, dir);        logrecord = logit(logrecord, old_dir_ver, sizeof(*old_dir_ver));        logrecord = logit(logrecord, &pathlen, sizeof(pathlen));        logrecord = logit(logrecord, &llen, sizeof(llen));        logrecord = journal_log_suffix(logrecord, record, fset, dir, rec);        error = presto_log(fset, rec, record, size,                           path, size_round(le32_to_cpu(pathlen)),                           name, size_round(len),                           NULL, 0);        BUFF_FREE(buffer);        EXIT;        return error;}intpresto_journal_mknod(struct rec_info *rec, struct presto_file_set *fset,                     struct dentry *dentry, struct presto_version *tgt_dir_ver,                     struct presto_version *new_node_ver, int mode,                     int dmajor, int dminor ){        int opcode = PRESTO_OP_MKNOD;        char *buffer;        char *path;        __u32 pathlen;        int size;        char *logrecord;        char record[292];        struct dentry *root;        __u32 uid, gid, lmode, lmajor, lminor;        int error;        ENTRY;        if ( presto_no_journal(fset) ) {                EXIT;                return 0;        }        root = fset->fset_mtpt;        uid = cpu_to_le32(dentry->d_inode->i_uid);        gid = cpu_to_le32(dentry->d_inode->i_gid);        lmode = cpu_to_le32(mode);        lmajor = cpu_to_le32(dmajor);        lminor = cpu_to_le32(dminor);        BUFF_ALLOC(buffer, NULL);        path = presto_path(dentry, root, buffer, PAGE_SIZE);        pathlen = cpu_to_le32(MYPATHLEN(buffer, path));        size = sizeof(__u32) * current->ngroups +                 sizeof(struct journal_prefix) + 3 * sizeof(*tgt_dir_ver) +                sizeof(lmode) + sizeof(uid) + sizeof(gid) + sizeof(lmajor) +                sizeof(lminor) + sizeof(pathlen) +                sizeof(struct journal_suffix);        if ( size > sizeof(record) ) {                printk("PRESTO: BUFFER OVERFLOW in %s!\n", __FUNCTION__);        }        rec->is_kml = 1;        rec->size = size + size_round(le32_to_cpu(pathlen));        logrecord = journal_log_prefix(record, opcode, rec);        logrecord = logit(logrecord, tgt_dir_ver, sizeof(*tgt_dir_ver));        logrecord = log_version(logrecord, dentry->d_parent);        logrecord = logit(logrecord, new_node_ver, sizeof(*new_node_ver));        logrecord = logit(logrecord, &lmode, sizeof(lmode));        logrecord = logit(logrecord, &uid, sizeof(uid));        logrecord = logit(logrecord, &gid, sizeof(gid));        logrecord = logit(logrecord, &lmajor, sizeof(lmajor));        logrecord = logit(logrecord, &lminor, sizeof(lminor));        logrecord = logit(logrecord, &pathlen, sizeof(pathlen));        logrecord = journal_log_suffix(logrecord, record, fset, dentry, rec);        error = presto_log(fset, rec, record, size,                           path, size_round(le32_to_cpu(pathlen)),                           NULL, 0, NULL, 0);        BUFF_FREE(buffer);        EXIT;        return error;}intpresto_journal_link(struct rec_info *rec, struct presto_file_set *fset,                    struct dentry *src, struct dentry *tgt,                    struct presto_version *tgt_dir_ver,                    struct presto_version *new_link_ver){        int opcode = PRESTO_OP_LINK;        char *buffer, *srcbuffer;        char *path, *srcpath;        __u32 pathlen, srcpathlen;        int size;        char *logrecord;        char record[292];        struct dentry *root;        int error;        ENTRY;        if ( presto_no_journal(fset) ) {                EXIT;                return 0;        }        root = fset->fset_mtpt;        BUFF_ALLOC(srcbuffer, NULL);        srcpath = presto_path(src, root, srcbuffer, PAGE_SIZE);        srcpathlen = cpu_to_le32(MYPATHLEN(srcbuffer, srcpath));        BUFF_ALLOC(buffer, srcbuffer);        path = presto_path(tgt, root, buffer, PAGE_SIZE);        pathlen = cpu_to_le32(MYPATHLEN(buffer, path));        size =  sizeof(__u32) * current->ngroups +                 sizeof(struct journal_prefix) + 3 * sizeof(*tgt_dir_ver) +                sizeof(srcpathlen) + sizeof(pathlen) +                sizeof(struct journal_suffix);        if ( size > sizeof(record) ) {                printk("PRESTO: BUFFER OVERFLOW in %s!\n", __FUNCTION__);        }        rec->is_kml = 1;        rec->size = size + size_round(le32_to_cpu(pathlen)) +                 size_round(le32_to_cpu(srcpathlen));        logrecord = journal_log_prefix(record, opcode, rec);        logrecord = logit(logrecord, tgt_dir_ver, sizeof(*tgt_dir_ver));        logrecord = log_version(logrecord, tgt->d_parent);        logrecord = logit(logrecord, new_link_ver, sizeof(*new_link_ver));        logrecord = logit(logrecord, &srcpathlen, sizeof(srcpathlen));        logrecord = logit(logrecord, &pathlen, sizeof(pathlen));        logrecord = journal_log_suffix(logrecord, record, fset, tgt, rec);        error = presto_log(fset, rec, record, size,                           srcpath, size_round(le32_to_cpu(srcpathlen)),                           path, size_round(le32_to_cpu(pathlen)),                           NULL, 0);        BUFF_FREE(srcbuffer);        BUFF_FREE(buffer);        EXIT;        return error;}int presto_journal_rename(struct rec_info *rec, struct presto_file_set *fset, struct dentry *src,                          struct dentry *tgt,                          struct presto_version *src_dir_ver,                          struct presto_version *tgt_dir_ver){        int opcode = PRESTO_OP_RENAME;        char *buffer, *srcbuffer;        char *path, *srcpath;        __u32 pathlen, srcpathlen;        int size;        char *logrecord;        char record[292];        struct dentry *root;        int error;        ENTRY;        if ( presto_no_journal(fset) ) {                EXIT;                return 0;        }        root = fset->fset_mtpt;        BUFF_ALLOC(srcbuffer, NULL);        srcpath = presto_path(src, root, srcbuffer, PAGE_SIZE);        srcpathlen = cpu_to_le32(MYPATHLEN(srcbuffer, srcpath));        BUFF_ALLOC(buffer, srcbuffer);        path = presto_path(tgt, root, buffer, PAGE_SIZE);        pathlen = cpu_to_le32(MYPATHLEN(buffer, path));        size =  sizeof(__u32) * current->ngroups + 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -