Skip to content

Commit

Permalink
f2fs: Sync F2FS to Jaegeuk's linux-3.4 branch
Browse files Browse the repository at this point in the history
This commit updates F2FS with latest commits applied on:
https://kernel.googlesource.com/pub/scm/linux/kernel/git/jaegeuk/f2fs/+/linux-3.4

It's synched up to the following commit:
521e57c  f2fs: support 3.4 by Jaegeuk Kim
  • Loading branch information
Christopher83 committed Jan 31, 2015
1 parent 8293293 commit 94ea5c5
Show file tree
Hide file tree
Showing 19 changed files with 323 additions and 208 deletions.
18 changes: 9 additions & 9 deletions fs/f2fs/checkpoint.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
#include <trace/events/f2fs.h>

static struct kmem_cache *ino_entry_slab;
static struct kmem_cache *inode_entry_slab;
struct kmem_cache *inode_entry_slab;

/*
* We guarantee no failure on the returned page.
Expand Down Expand Up @@ -674,7 +674,7 @@ int get_valid_checkpoint(struct f2fs_sb_info *sbi)
return -EINVAL;
}

static int __add_dirty_inode(struct inode *inode, struct dir_inode_entry *new)
static int __add_dirty_inode(struct inode *inode, struct inode_entry *new)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);

Expand All @@ -691,7 +691,7 @@ static int __add_dirty_inode(struct inode *inode, struct dir_inode_entry *new)
void update_dirty_page(struct inode *inode, struct page *page)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
struct dir_inode_entry *new;
struct inode_entry *new;
int ret = 0;

if (!S_ISDIR(inode->i_mode) && !S_ISREG(inode->i_mode))
Expand Down Expand Up @@ -721,7 +721,7 @@ void update_dirty_page(struct inode *inode, struct page *page)
void add_dirty_dir_inode(struct inode *inode)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
struct dir_inode_entry *new =
struct inode_entry *new =
f2fs_kmem_cache_alloc(inode_entry_slab, GFP_NOFS);
int ret = 0;

Expand All @@ -739,7 +739,7 @@ void add_dirty_dir_inode(struct inode *inode)
void remove_dirty_dir_inode(struct inode *inode)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
struct dir_inode_entry *entry;
struct inode_entry *entry;

if (!S_ISDIR(inode->i_mode))
return;
Expand Down Expand Up @@ -769,7 +769,7 @@ void remove_dirty_dir_inode(struct inode *inode)
void sync_dirty_dir_inodes(struct f2fs_sb_info *sbi)
{
struct list_head *head;
struct dir_inode_entry *entry;
struct inode_entry *entry;
struct inode *inode;
retry:
if (unlikely(f2fs_cp_error(sbi)))
Expand All @@ -782,7 +782,7 @@ void sync_dirty_dir_inodes(struct f2fs_sb_info *sbi)
spin_unlock(&sbi->dir_inode_lock);
return;
}
entry = list_entry(head->next, struct dir_inode_entry, list);
entry = list_entry(head->next, struct inode_entry, list);
inode = igrab(entry->inode);
spin_unlock(&sbi->dir_inode_lock);
if (inode) {
Expand Down Expand Up @@ -1108,8 +1108,8 @@ int __init create_checkpoint_caches(void)
sizeof(struct ino_entry));
if (!ino_entry_slab)
return -ENOMEM;
inode_entry_slab = f2fs_kmem_cache_create("f2fs_dirty_dir_entry",
sizeof(struct dir_inode_entry));
inode_entry_slab = f2fs_kmem_cache_create("f2fs_inode_entry",
sizeof(struct inode_entry));
if (!inode_entry_slab) {
kmem_cache_destroy(ino_entry_slab);
return -ENOMEM;
Expand Down
54 changes: 23 additions & 31 deletions fs/f2fs/data.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,11 +96,9 @@ static void __submit_merged_bio(struct f2fs_bio_info *io)
return;

if (is_read_io(fio->rw))
trace_f2fs_submit_read_bio(io->sbi->sb, fio->rw,
fio->type, io->bio);
trace_f2fs_submit_read_bio(io->sbi->sb, fio, io->bio);
else
trace_f2fs_submit_write_bio(io->sbi->sb, fio->rw,
fio->type, io->bio);
trace_f2fs_submit_write_bio(io->sbi->sb, fio, io->bio);

submit_bio(fio->rw, io->bio);
io->bio = NULL;
Expand Down Expand Up @@ -137,7 +135,7 @@ int f2fs_submit_page_bio(struct f2fs_sb_info *sbi, struct page *page,
{
struct bio *bio;

trace_f2fs_submit_page_bio(page, fio->blk_addr, fio->rw);
trace_f2fs_submit_page_bio(page, fio);
f2fs_trace_ios(page, fio, 0);

/* Allocate a new bio */
Expand Down Expand Up @@ -190,7 +188,7 @@ void f2fs_submit_page_mbio(struct f2fs_sb_info *sbi, struct page *page,
f2fs_trace_ios(page, fio, 0);

up_write(&io->io_rwsem);
trace_f2fs_submit_page_mbio(page, fio->rw, fio->type, fio->blk_addr);
trace_f2fs_submit_page_mbio(page, fio);
}

/*
Expand All @@ -199,7 +197,7 @@ void f2fs_submit_page_mbio(struct f2fs_sb_info *sbi, struct page *page,
* ->node_page
* update block addresses in the node page
*/
static void __set_data_blkaddr(struct dnode_of_data *dn, block_t new_addr)
static void __set_data_blkaddr(struct dnode_of_data *dn)
{
struct f2fs_node *rn;
__le32 *addr_array;
Expand All @@ -212,7 +210,7 @@ static void __set_data_blkaddr(struct dnode_of_data *dn, block_t new_addr)

/* Get physical address of data block */
addr_array = blkaddr_in_node(rn);
addr_array[ofs_in_node] = cpu_to_le32(new_addr);
addr_array[ofs_in_node] = cpu_to_le32(dn->data_blkaddr);
set_page_dirty(node_page);
}

Expand All @@ -227,8 +225,8 @@ int reserve_new_block(struct dnode_of_data *dn)

trace_f2fs_reserve_new_block(dn->inode, dn->nid, dn->ofs_in_node);

__set_data_blkaddr(dn, NEW_ADDR);
dn->data_blkaddr = NEW_ADDR;
__set_data_blkaddr(dn);
mark_inode_dirty(dn->inode);
sync_inode_page(dn);
return 0;
Expand Down Expand Up @@ -293,23 +291,24 @@ static int check_extent_cache(struct inode *inode, pgoff_t pgofs,
return 0;
}

void update_extent_cache(block_t blk_addr, struct dnode_of_data *dn)
void update_extent_cache(struct dnode_of_data *dn)
{
struct f2fs_inode_info *fi = F2FS_I(dn->inode);
pgoff_t fofs, start_fofs, end_fofs;
block_t start_blkaddr, end_blkaddr;
int need_update = true;

f2fs_bug_on(F2FS_I_SB(dn->inode), blk_addr == NEW_ADDR);
fofs = start_bidx_of_node(ofs_of_node(dn->node_page), fi) +
dn->ofs_in_node;
f2fs_bug_on(F2FS_I_SB(dn->inode), dn->data_blkaddr == NEW_ADDR);

/* Update the page address in the parent node */
__set_data_blkaddr(dn, blk_addr);
__set_data_blkaddr(dn);

if (is_inode_flag_set(fi, FI_NO_EXTENT))
return;

fofs = start_bidx_of_node(ofs_of_node(dn->node_page), fi) +
dn->ofs_in_node;

write_lock(&fi->ext.ext_lock);

start_fofs = fi->ext.fofs;
Expand All @@ -323,24 +322,24 @@ void update_extent_cache(block_t blk_addr, struct dnode_of_data *dn)

/* Initial extent */
if (fi->ext.len == 0) {
if (blk_addr != NULL_ADDR) {
if (dn->data_blkaddr != NULL_ADDR) {
fi->ext.fofs = fofs;
fi->ext.blk_addr = blk_addr;
fi->ext.blk_addr = dn->data_blkaddr;
fi->ext.len = 1;
}
goto end_update;
}

/* Front merge */
if (fofs == start_fofs - 1 && blk_addr == start_blkaddr - 1) {
if (fofs == start_fofs - 1 && dn->data_blkaddr == start_blkaddr - 1) {
fi->ext.fofs--;
fi->ext.blk_addr--;
fi->ext.len++;
goto end_update;
}

/* Back merge */
if (fofs == end_fofs + 1 && blk_addr == end_blkaddr + 1) {
if (fofs == end_fofs + 1 && dn->data_blkaddr == end_blkaddr + 1) {
fi->ext.len++;
goto end_update;
}
Expand Down Expand Up @@ -564,38 +563,32 @@ static int __allocate_data_block(struct dnode_of_data *dn)
struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
struct f2fs_inode_info *fi = F2FS_I(dn->inode);
struct f2fs_summary sum;
block_t new_blkaddr;
struct node_info ni;
int seg = CURSEG_WARM_DATA;
pgoff_t fofs;
int type;

if (unlikely(is_inode_flag_set(F2FS_I(dn->inode), FI_NO_ALLOC)))
return -EPERM;
if (unlikely(!inc_valid_block_count(sbi, dn->inode, 1)))
return -ENOSPC;

__set_data_blkaddr(dn, NEW_ADDR);
dn->data_blkaddr = NEW_ADDR;

get_node_info(sbi, dn->nid, &ni);
set_summary(&sum, dn->nid, dn->ofs_in_node, ni.version);

type = CURSEG_WARM_DATA;
if (dn->ofs_in_node == 0 && dn->inode_page == dn->node_page)
seg = CURSEG_DIRECT_IO;

allocate_data_block(sbi, NULL, NULL_ADDR, &new_blkaddr, &sum, type);
allocate_data_block(sbi, NULL, NULL_ADDR, &dn->data_blkaddr, &sum, seg);

/* direct IO doesn't use extent cache to maximize the performance */
set_inode_flag(F2FS_I(dn->inode), FI_NO_EXTENT);
update_extent_cache(new_blkaddr, dn);
clear_inode_flag(F2FS_I(dn->inode), FI_NO_EXTENT);
__set_data_blkaddr(dn);

/* update i_size */
fofs = start_bidx_of_node(ofs_of_node(dn->node_page), fi) +
dn->ofs_in_node;
if (i_size_read(dn->inode) < ((fofs + 1) << PAGE_CACHE_SHIFT))
i_size_write(dn->inode, ((fofs + 1) << PAGE_CACHE_SHIFT));

dn->data_blkaddr = new_blkaddr;
return 0;
}

Expand Down Expand Up @@ -786,7 +779,7 @@ int do_write_data_page(struct page *page, struct f2fs_io_info *fio)
set_inode_flag(F2FS_I(inode), FI_UPDATE_WRITE);
} else {
write_data_page(page, &dn, fio);
update_extent_cache(fio->blk_addr, &dn);
update_extent_cache(&dn);
set_inode_flag(F2FS_I(inode), FI_APPEND_WRITE);
}
out_writepage:
Expand Down Expand Up @@ -844,7 +837,6 @@ static int f2fs_write_data_page(struct page *page,
/* we should bypass data pages to proceed the kworkder jobs */
if (unlikely(f2fs_cp_error(sbi))) {
SetPageError(page);
unlock_page(page);
goto out;
}

Expand Down
49 changes: 34 additions & 15 deletions fs/f2fs/debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,9 @@ static void update_general_status(struct f2fs_sb_info *sbi)
si->node_pages = NODE_MAPPING(sbi)->nrpages;
si->meta_pages = META_MAPPING(sbi)->nrpages;
si->nats = NM_I(sbi)->nat_cnt;
si->sits = SIT_I(sbi)->dirty_sentries;
si->dirty_nats = NM_I(sbi)->dirty_nat_cnt;
si->sits = MAIN_SEGS(sbi);
si->dirty_sits = SIT_I(sbi)->dirty_sentries;
si->fnids = NM_I(sbi)->fcnt;
si->bg_gc = sbi->bg_gc;
si->util_free = (int)(free_user_blocks(sbi) >> sbi->log_blocks_per_seg)
Expand Down Expand Up @@ -161,20 +163,32 @@ static void update_mem_info(struct f2fs_sb_info *sbi)
si->base_mem += sizeof(struct f2fs_nm_info);
si->base_mem += __bitmap_size(sbi, NAT_BITMAP);

get_cache:
si->cache_mem = 0;

/* build gc */
si->base_mem += sizeof(struct f2fs_gc_kthread);
if (sbi->gc_thread)
si->cache_mem += sizeof(struct f2fs_gc_kthread);

/* build merge flush thread */
if (SM_I(sbi)->cmd_control_info)
si->cache_mem += sizeof(struct flush_cmd_control);

get_cache:
/* free nids */
si->cache_mem = NM_I(sbi)->fcnt;
si->cache_mem += NM_I(sbi)->nat_cnt;
npages = NODE_MAPPING(sbi)->nrpages;
si->cache_mem += npages << PAGE_CACHE_SHIFT;
npages = META_MAPPING(sbi)->nrpages;
si->cache_mem += npages << PAGE_CACHE_SHIFT;
si->cache_mem += sbi->n_dirty_dirs * sizeof(struct dir_inode_entry);
si->cache_mem += NM_I(sbi)->fcnt * sizeof(struct free_nid);
si->cache_mem += NM_I(sbi)->nat_cnt * sizeof(struct nat_entry);
si->cache_mem += NM_I(sbi)->dirty_nat_cnt *
sizeof(struct nat_entry_set);
si->cache_mem += si->inmem_pages * sizeof(struct inmem_pages);
si->cache_mem += sbi->n_dirty_dirs * sizeof(struct inode_entry);
for (i = 0; i <= UPDATE_INO; i++)
si->cache_mem += sbi->im[i].ino_num * sizeof(struct ino_entry);

si->page_mem = 0;
npages = NODE_MAPPING(sbi)->nrpages;
si->page_mem += npages << PAGE_CACHE_SHIFT;
npages = META_MAPPING(sbi)->nrpages;
si->page_mem += npages << PAGE_CACHE_SHIFT;
}

static int stat_show(struct seq_file *s, void *v)
Expand Down Expand Up @@ -260,8 +274,8 @@ static int stat_show(struct seq_file *s, void *v)
si->ndirty_dent, si->ndirty_dirs);
seq_printf(s, " - meta: %4d in %4d\n",
si->ndirty_meta, si->meta_pages);
seq_printf(s, " - NATs: %9d\n - SITs: %9d\n",
si->nats, si->sits);
seq_printf(s, " - NATs: %9d/%9d\n - SITs: %9d/%9d\n",
si->dirty_nats, si->nats, si->dirty_sits, si->sits);
seq_printf(s, " - free_nids: %9d\n",
si->fnids);
seq_puts(s, "\nDistribution of User Blocks:");
Expand Down Expand Up @@ -292,9 +306,14 @@ static int stat_show(struct seq_file *s, void *v)

/* memory footprint */
update_mem_info(si->sbi);
seq_printf(s, "\nMemory: %u KB = static: %u + cached: %u\n",
(si->base_mem + si->cache_mem) >> 10,
si->base_mem >> 10, si->cache_mem >> 10);
seq_printf(s, "\nMemory: %u KB\n",
(si->base_mem + si->cache_mem + si->page_mem) >> 10);
seq_printf(s, " - static: %u KB\n",
si->base_mem >> 10);
seq_printf(s, " - cached: %u KB\n",
si->cache_mem >> 10);
seq_printf(s, " - paged : %u KB\n",
si->page_mem >> 10);
}
mutex_unlock(&f2fs_stat_mutex);
return 0;
Expand Down
Loading

0 comments on commit 94ea5c5

Please sign in to comment.