You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'for-f2fs-3.11' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs
Pull f2fs updates from Jaegeuk Kim:
"This patch-set includes the following major enhancement patches:
- remount_fs callback function
- restore parent inode number to enhance the fsync performance
- xattr security labels
- reduce the number of redundant lock/unlock data pages
- avoid frequent write_inode calls
The other minor bug fixes are as follows.
- endian conversion bugs
- various bugs in the roll-forward recovery routine"
* tag 'for-f2fs-3.11' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs: (56 commits)
f2fs: fix to recover i_size from roll-forward
f2fs: remove the unused argument "sbi" of func destroy_fsync_dnodes()
f2fs: remove reusing any prefree segments
f2fs: code cleanup and simplify in func {find/add}_gc_inode
f2fs: optimize the init_dirty_segmap function
f2fs: fix an endian conversion bug detected by sparse
f2fs: fix crc endian conversion
f2fs: add remount_fs callback support
f2fs: recover wrong pino after checkpoint during fsync
f2fs: optimize do_write_data_page()
f2fs: make locate_dirty_segment() as static
f2fs: remove unnecessary parameter "offset" from __add_sum_entry()
f2fs: avoid freqeunt write_inode calls
f2fs: optimise the truncate_data_blocks_range() range
f2fs: use the F2FS specific flags in f2fs_ioctl()
f2fs: sync dir->i_size with its block allocation
f2fs: fix i_blocks translation on various types of files
f2fs: set sb->s_fs_info before calling parse_options()
f2fs: support xattr security labels
f2fs: fix iget/iput of dir during recovery
...
This commit is contained in:
+19
-15
@@ -408,10 +408,13 @@ int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int mode)
|
||||
level = get_node_path(index, offset, noffset);
|
||||
|
||||
nids[0] = dn->inode->i_ino;
|
||||
npage[0] = get_node_page(sbi, nids[0]);
|
||||
if (IS_ERR(npage[0]))
|
||||
return PTR_ERR(npage[0]);
|
||||
npage[0] = dn->inode_page;
|
||||
|
||||
if (!npage[0]) {
|
||||
npage[0] = get_node_page(sbi, nids[0]);
|
||||
if (IS_ERR(npage[0]))
|
||||
return PTR_ERR(npage[0]);
|
||||
}
|
||||
parent = npage[0];
|
||||
if (level != 0)
|
||||
nids[1] = get_nid(parent, offset[0], true);
|
||||
@@ -430,7 +433,7 @@ int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int mode)
|
||||
}
|
||||
|
||||
dn->nid = nids[i];
|
||||
npage[i] = new_node_page(dn, noffset[i]);
|
||||
npage[i] = new_node_page(dn, noffset[i], NULL);
|
||||
if (IS_ERR(npage[i])) {
|
||||
alloc_nid_failed(sbi, nids[i]);
|
||||
err = PTR_ERR(npage[i]);
|
||||
@@ -803,22 +806,19 @@ int remove_inode_page(struct inode *inode)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int new_inode_page(struct inode *inode, const struct qstr *name)
|
||||
struct page *new_inode_page(struct inode *inode, const struct qstr *name)
|
||||
{
|
||||
struct page *page;
|
||||
struct dnode_of_data dn;
|
||||
|
||||
/* allocate inode page for new inode */
|
||||
set_new_dnode(&dn, inode, NULL, NULL, inode->i_ino);
|
||||
page = new_node_page(&dn, 0);
|
||||
init_dent_inode(name, page);
|
||||
if (IS_ERR(page))
|
||||
return PTR_ERR(page);
|
||||
f2fs_put_page(page, 1);
|
||||
return 0;
|
||||
|
||||
/* caller should f2fs_put_page(page, 1); */
|
||||
return new_node_page(&dn, 0, NULL);
|
||||
}
|
||||
|
||||
struct page *new_node_page(struct dnode_of_data *dn, unsigned int ofs)
|
||||
struct page *new_node_page(struct dnode_of_data *dn,
|
||||
unsigned int ofs, struct page *ipage)
|
||||
{
|
||||
struct f2fs_sb_info *sbi = F2FS_SB(dn->inode->i_sb);
|
||||
struct address_space *mapping = sbi->node_inode->i_mapping;
|
||||
@@ -851,7 +851,10 @@ struct page *new_node_page(struct dnode_of_data *dn, unsigned int ofs)
|
||||
set_cold_node(dn->inode, page);
|
||||
|
||||
dn->node_page = page;
|
||||
sync_inode_page(dn);
|
||||
if (ipage)
|
||||
update_inode(dn->inode, ipage);
|
||||
else
|
||||
sync_inode_page(dn);
|
||||
set_page_dirty(page);
|
||||
if (ofs == 0)
|
||||
inc_valid_inode_count(sbi);
|
||||
@@ -1493,9 +1496,10 @@ int recover_inode_page(struct f2fs_sb_info *sbi, struct page *page)
|
||||
new_ni = old_ni;
|
||||
new_ni.ino = ino;
|
||||
|
||||
if (!inc_valid_node_count(sbi, NULL, 1))
|
||||
WARN_ON(1);
|
||||
set_node_addr(sbi, &new_ni, NEW_ADDR);
|
||||
inc_valid_inode_count(sbi);
|
||||
|
||||
f2fs_put_page(ipage, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user