Loading fs/ext4/inline.c +24 −0 Original line number Diff line number Diff line Loading @@ -747,6 +747,30 @@ int ext4_write_inline_data_end(struct inode *inode, loff_t pos, unsigned len, return copied; } struct buffer_head * ext4_journalled_write_inline_data(struct inode *inode, unsigned len, struct page *page) { int ret; void *kaddr; struct ext4_iloc iloc; ret = ext4_get_inode_loc(inode, &iloc); if (ret) { ext4_std_error(inode->i_sb, ret); return NULL; } down_write(&EXT4_I(inode)->xattr_sem); kaddr = kmap_atomic(page); ext4_write_inline_data(inode, &iloc, kaddr, 0, len); kunmap_atomic(kaddr); up_write(&EXT4_I(inode)->xattr_sem); return iloc.bh; } int ext4_destroy_inline_data(handle_t *handle, struct inode *inode) { Loading fs/ext4/inode.c +49 −20 Original line number Diff line number Diff line Loading @@ -1124,6 +1124,10 @@ static int ext4_journalled_write_end(struct file *file, BUG_ON(!ext4_handle_valid(handle)); if (ext4_has_inline_data(inode)) copied = ext4_write_inline_data_end(inode, pos, len, copied, page); else { if (copied < len) { if (!PageUptodate(page)) copied = 0; Loading @@ -1134,6 +1138,7 @@ static int ext4_journalled_write_end(struct file *file, to, &partial, write_end_fn); if (!partial) SetPageUptodate(page); } new_i_size = pos + copied; if (new_i_size > inode->i_size) i_size_write(inode, pos+copied); Loading Loading @@ -1911,15 +1916,29 @@ static int __ext4_journalled_writepage(struct page *page, { struct address_space *mapping = page->mapping; struct inode *inode = mapping->host; struct buffer_head *page_bufs; struct buffer_head *page_bufs = NULL; handle_t *handle = NULL; int ret = 0; int err; int ret = 0, err = 0; int inline_data = ext4_has_inline_data(inode); struct buffer_head *inode_bh = NULL; ClearPageChecked(page); if (inline_data) { BUG_ON(page->index != 0); BUG_ON(len > ext4_get_max_inline_size(inode)); inode_bh = ext4_journalled_write_inline_data(inode, len, page); if (inode_bh == NULL) goto out; } else { page_bufs = page_buffers(page); BUG_ON(!page_bufs); ext4_walk_page_buffers(handle, page_bufs, 0, len, NULL, bget_one); if (!page_bufs) { BUG(); goto out; } ext4_walk_page_buffers(handle, page_bufs, 0, len, NULL, bget_one); } /* As soon as we unlock the page, it can go away, but we have * references to buffers so we are safe */ unlock_page(page); Loading @@ -1932,11 +1951,18 @@ static int __ext4_journalled_writepage(struct page *page, BUG_ON(!ext4_handle_valid(handle)); if (inline_data) { ret = ext4_journal_get_write_access(handle, inode_bh); err = ext4_handle_dirty_metadata(handle, inode, inode_bh); } else { ret = ext4_walk_page_buffers(handle, page_bufs, 0, len, NULL, do_journal_get_write_access); err = ext4_walk_page_buffers(handle, page_bufs, 0, len, NULL, write_end_fn); } if (ret == 0) ret = err; EXT4_I(inode)->i_datasync_tid = handle->h_transaction->t_tid; Loading @@ -1944,9 +1970,12 @@ static int __ext4_journalled_writepage(struct page *page, if (!ret) ret = err; ext4_walk_page_buffers(handle, page_bufs, 0, len, NULL, bput_one); if (!ext4_has_inline_data(inode)) ext4_walk_page_buffers(handle, page_bufs, 0, len, NULL, bput_one); ext4_set_inode_state(inode, EXT4_STATE_JDATA); out: brelse(inode_bh); return ret; } Loading fs/ext4/xattr.h +12 −0 Original line number Diff line number Diff line Loading @@ -150,6 +150,10 @@ extern int ext4_write_inline_data_end(struct inode *inode, loff_t pos, unsigned len, unsigned copied, struct page *page); extern struct buffer_head * ext4_journalled_write_inline_data(struct inode *inode, unsigned len, struct page *page); # else /* CONFIG_EXT4_FS_XATTR */ static inline int Loading Loading @@ -288,6 +292,14 @@ static inline int ext4_write_inline_data_end(struct inode *inode, { return 0; } static inline struct buffer_head * ext4_journalled_write_inline_data(struct inode *inode, unsigned len, struct page *page) { return NULL; } # endif /* CONFIG_EXT4_FS_XATTR */ #ifdef CONFIG_EXT4_FS_SECURITY Loading Loading
fs/ext4/inline.c +24 −0 Original line number Diff line number Diff line Loading @@ -747,6 +747,30 @@ int ext4_write_inline_data_end(struct inode *inode, loff_t pos, unsigned len, return copied; } struct buffer_head * ext4_journalled_write_inline_data(struct inode *inode, unsigned len, struct page *page) { int ret; void *kaddr; struct ext4_iloc iloc; ret = ext4_get_inode_loc(inode, &iloc); if (ret) { ext4_std_error(inode->i_sb, ret); return NULL; } down_write(&EXT4_I(inode)->xattr_sem); kaddr = kmap_atomic(page); ext4_write_inline_data(inode, &iloc, kaddr, 0, len); kunmap_atomic(kaddr); up_write(&EXT4_I(inode)->xattr_sem); return iloc.bh; } int ext4_destroy_inline_data(handle_t *handle, struct inode *inode) { Loading
fs/ext4/inode.c +49 −20 Original line number Diff line number Diff line Loading @@ -1124,6 +1124,10 @@ static int ext4_journalled_write_end(struct file *file, BUG_ON(!ext4_handle_valid(handle)); if (ext4_has_inline_data(inode)) copied = ext4_write_inline_data_end(inode, pos, len, copied, page); else { if (copied < len) { if (!PageUptodate(page)) copied = 0; Loading @@ -1134,6 +1138,7 @@ static int ext4_journalled_write_end(struct file *file, to, &partial, write_end_fn); if (!partial) SetPageUptodate(page); } new_i_size = pos + copied; if (new_i_size > inode->i_size) i_size_write(inode, pos+copied); Loading Loading @@ -1911,15 +1916,29 @@ static int __ext4_journalled_writepage(struct page *page, { struct address_space *mapping = page->mapping; struct inode *inode = mapping->host; struct buffer_head *page_bufs; struct buffer_head *page_bufs = NULL; handle_t *handle = NULL; int ret = 0; int err; int ret = 0, err = 0; int inline_data = ext4_has_inline_data(inode); struct buffer_head *inode_bh = NULL; ClearPageChecked(page); if (inline_data) { BUG_ON(page->index != 0); BUG_ON(len > ext4_get_max_inline_size(inode)); inode_bh = ext4_journalled_write_inline_data(inode, len, page); if (inode_bh == NULL) goto out; } else { page_bufs = page_buffers(page); BUG_ON(!page_bufs); ext4_walk_page_buffers(handle, page_bufs, 0, len, NULL, bget_one); if (!page_bufs) { BUG(); goto out; } ext4_walk_page_buffers(handle, page_bufs, 0, len, NULL, bget_one); } /* As soon as we unlock the page, it can go away, but we have * references to buffers so we are safe */ unlock_page(page); Loading @@ -1932,11 +1951,18 @@ static int __ext4_journalled_writepage(struct page *page, BUG_ON(!ext4_handle_valid(handle)); if (inline_data) { ret = ext4_journal_get_write_access(handle, inode_bh); err = ext4_handle_dirty_metadata(handle, inode, inode_bh); } else { ret = ext4_walk_page_buffers(handle, page_bufs, 0, len, NULL, do_journal_get_write_access); err = ext4_walk_page_buffers(handle, page_bufs, 0, len, NULL, write_end_fn); } if (ret == 0) ret = err; EXT4_I(inode)->i_datasync_tid = handle->h_transaction->t_tid; Loading @@ -1944,9 +1970,12 @@ static int __ext4_journalled_writepage(struct page *page, if (!ret) ret = err; ext4_walk_page_buffers(handle, page_bufs, 0, len, NULL, bput_one); if (!ext4_has_inline_data(inode)) ext4_walk_page_buffers(handle, page_bufs, 0, len, NULL, bput_one); ext4_set_inode_state(inode, EXT4_STATE_JDATA); out: brelse(inode_bh); return ret; } Loading
fs/ext4/xattr.h +12 −0 Original line number Diff line number Diff line Loading @@ -150,6 +150,10 @@ extern int ext4_write_inline_data_end(struct inode *inode, loff_t pos, unsigned len, unsigned copied, struct page *page); extern struct buffer_head * ext4_journalled_write_inline_data(struct inode *inode, unsigned len, struct page *page); # else /* CONFIG_EXT4_FS_XATTR */ static inline int Loading Loading @@ -288,6 +292,14 @@ static inline int ext4_write_inline_data_end(struct inode *inode, { return 0; } static inline struct buffer_head * ext4_journalled_write_inline_data(struct inode *inode, unsigned len, struct page *page) { return NULL; } # endif /* CONFIG_EXT4_FS_XATTR */ #ifdef CONFIG_EXT4_FS_SECURITY Loading