mirror of
https://github.com/psankar/simplefs.git
synced 2025-07-27 07:54:15 +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 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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user