From f8009d2223fb8acc068eed92c4ca8d3e159ad77b Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Sun, 13 Jul 2014 00:44:35 +0400 Subject: [PATCH] simplefs_write: add journaling using jbd2 --- simple.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/simple.c b/simple.c index 7b1e2a8..2c64d53 100644 --- a/simple.c +++ b/simple.c @@ -359,19 +359,25 @@ ssize_t simplefs_write(struct file * filp, const char __user * buf, size_t len, struct simplefs_inode *sfs_inode; struct buffer_head *bh; struct super_block *sb; + struct simplefs_super_block *sfs_sb; + handle_t *handle; char *buffer; int retval; + sb = filp->f_path.dentry->d_inode->i_sb; + sfs_sb = SIMPLEFS_SB(sb); + + handle = jbd2_journal_start(sfs_sb->journal, 1); + if (IS_ERR(handle)) + return PTR_ERR(handle); retval = generic_write_checks(filp, ppos, &len, 0); - if (retval) { + if (retval) return retval; - } inode = filp->f_path.dentry->d_inode; sfs_inode = SIMPLEFS_INODE(inode); - sb = inode->i_sb; bh = sb_bread(filp->f_path.dentry->d_inode->i_sb, sfs_inode->data_block_number); @@ -386,6 +392,13 @@ ssize_t simplefs_write(struct file * filp, const char __user * buf, size_t len, /* Move the pointer until the required byte offset */ buffer += *ppos; + retval = jbd2_journal_get_write_access(handle, bh); + if (WARN_ON(retval)) { + brelse(bh); + sfs_trace("Can't get write access for bh\n"); + return retval; + } + if (copy_from_user(buffer, buf, len)) { brelse(bh); printk(KERN_ERR @@ -394,6 +407,17 @@ ssize_t simplefs_write(struct file * filp, const char __user * buf, size_t len, } *ppos += len; + retval = jbd2_journal_dirty_metadata(handle, bh); + if (WARN_ON(retval)) { + brelse(bh); + return retval; + } + retval = jbd2_journal_stop(handle); + if (WARN_ON(retval)) { + brelse(bh); + return retval; + } + mark_buffer_dirty(bh); sync_dirty_buffer(bh); brelse(bh);