📄 journal.c
字号:
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 + -