mirror of
https://github.com/psankar/simplefs.git
synced 2025-07-26 23:44:08 +02:00
simplefs_write: add journaling using jbd2
This commit is contained in:
parent
dad5b1c50e
commit
f8009d2223
30
simple.c
30
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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user