simplefs_write: add journaling using jbd2

This commit is contained in:
Azat Khuzhin 2014-07-13 00:44:35 +04:00
parent dad5b1c50e
commit f8009d2223

View File

@ -359,19 +359,25 @@ ssize_t simplefs_write(struct file * filp, const char __user * buf, size_t len,
struct simplefs_inode *sfs_inode; struct simplefs_inode *sfs_inode;
struct buffer_head *bh; struct buffer_head *bh;
struct super_block *sb; struct super_block *sb;
struct simplefs_super_block *sfs_sb;
handle_t *handle;
char *buffer; char *buffer;
int retval; 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); retval = generic_write_checks(filp, ppos, &len, 0);
if (retval) { if (retval)
return retval; return retval;
}
inode = filp->f_path.dentry->d_inode; inode = filp->f_path.dentry->d_inode;
sfs_inode = SIMPLEFS_INODE(inode); sfs_inode = SIMPLEFS_INODE(inode);
sb = inode->i_sb;
bh = sb_bread(filp->f_path.dentry->d_inode->i_sb, bh = sb_bread(filp->f_path.dentry->d_inode->i_sb,
sfs_inode->data_block_number); 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 */ /* Move the pointer until the required byte offset */
buffer += *ppos; 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)) { if (copy_from_user(buffer, buf, len)) {
brelse(bh); brelse(bh);
printk(KERN_ERR printk(KERN_ERR
@ -394,6 +407,17 @@ ssize_t simplefs_write(struct file * filp, const char __user * buf, size_t len,
} }
*ppos += 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); mark_buffer_dirty(bh);
sync_dirty_buffer(bh); sync_dirty_buffer(bh);
brelse(bh); brelse(bh);