* [PATCH 2/2] f2fs: use list_for_each_entry{_safe} for simplyfying code
@ 2014-03-29 3:33 Chao Yu
2014-03-31 10:07 ` Gu Zheng
0 siblings, 1 reply; 4+ messages in thread
From: Chao Yu @ 2014-03-29 3:33 UTC (permalink / raw)
To: ???; +Cc: linux-fsdevel, linux-kernel, linux-f2fs-devel
This patch use list_for_each_entry{_safe} instead of list_for_each{_safe} for
simplfying code.
Signed-off-by: Chao Yu <chao2.yu@samsung.com>
---
fs/f2fs/checkpoint.c | 37 ++++++++++++++-----------------------
fs/f2fs/node.c | 16 ++++++----------
fs/f2fs/recovery.c | 6 ++----
fs/f2fs/segment.c | 6 ++----
4 files changed, 24 insertions(+), 41 deletions(-)
diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
index d877f46..4aa521a 100644
--- a/fs/f2fs/checkpoint.c
+++ b/fs/f2fs/checkpoint.c
@@ -308,16 +308,15 @@ void release_orphan_inode(struct f2fs_sb_info *sbi)
void add_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
{
- struct list_head *head, *this;
- struct orphan_inode_entry *new = NULL, *orphan = NULL;
+ struct list_head *head;
+ struct orphan_inode_entry *new, *orphan;
new = f2fs_kmem_cache_alloc(orphan_entry_slab, GFP_ATOMIC);
new->ino = ino;
spin_lock(&sbi->orphan_inode_lock);
head = &sbi->orphan_inode_list;
- list_for_each(this, head) {
- orphan = list_entry(this, struct orphan_inode_entry, list);
+ list_for_each_entry(orphan, head, list) {
if (orphan->ino == ino) {
spin_unlock(&sbi->orphan_inode_lock);
kmem_cache_free(orphan_entry_slab, new);
@@ -326,14 +325,10 @@ void add_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
if (orphan->ino > ino)
break;
- orphan = NULL;
}
- /* add new_oentry into list which is sorted by inode number */
- if (orphan)
- list_add(&new->list, this->prev);
- else
- list_add_tail(&new->list, head);
+ /* add new orphan entry into list which is sorted by inode number */
+ list_add_tail(&new->list, &orphan->list);
spin_unlock(&sbi->orphan_inode_lock);
}
@@ -561,14 +556,12 @@ static int __add_dirty_inode(struct inode *inode, struct dir_inode_entry *new)
{
struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
struct list_head *head = &sbi->dir_inode_list;
- struct list_head *this;
+ struct dir_inode_entry *entry;
- list_for_each(this, head) {
- struct dir_inode_entry *entry;
- entry = list_entry(this, struct dir_inode_entry, list);
+ list_for_each_entry(entry, head, list)
if (unlikely(entry->inode == inode))
return -EEXIST;
- }
+
list_add_tail(&new->list, head);
stat_inc_dirty_dir(sbi);
return 0;
@@ -618,7 +611,8 @@ void add_dirty_dir_inode(struct inode *inode)
void remove_dirty_dir_inode(struct inode *inode)
{
struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
- struct list_head *this, *head;
+ struct list_head *head;
+ struct dir_inode_entry *entry;
if (!S_ISDIR(inode->i_mode))
return;
@@ -630,9 +624,7 @@ void remove_dirty_dir_inode(struct inode *inode)
}
head = &sbi->dir_inode_list;
- list_for_each(this, head) {
- struct dir_inode_entry *entry;
- entry = list_entry(this, struct dir_inode_entry, list);
+ list_for_each_entry(entry, head, list) {
if (entry->inode == inode) {
list_del(&entry->list);
stat_dec_dirty_dir(sbi);
@@ -654,15 +646,14 @@ done:
struct inode *check_dirty_dir_inode(struct f2fs_sb_info *sbi, nid_t ino)
{
- struct list_head *this, *head;
+ struct list_head *head;
struct inode *inode = NULL;
+ struct dir_inode_entry *entry;
spin_lock(&sbi->dir_inode_lock);
head = &sbi->dir_inode_list;
- list_for_each(this, head) {
- struct dir_inode_entry *entry;
- entry = list_entry(this, struct dir_inode_entry, list);
+ list_for_each_entry(entry, head, list) {
if (entry->inode->i_ino == ino) {
inode = entry->inode;
break;
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
index 0021056..afda3d3 100644
--- a/fs/f2fs/node.c
+++ b/fs/f2fs/node.c
@@ -1452,7 +1452,6 @@ bool alloc_nid(struct f2fs_sb_info *sbi, nid_t *nid)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
struct free_nid *i = NULL;
- struct list_head *this;
retry:
if (unlikely(sbi->total_valid_node_count + 1 >= nm_i->max_nid))
return false;
@@ -1462,11 +1461,9 @@ retry:
/* We should not use stale free nids created by build_free_nids */
if (nm_i->fcnt && !on_build_free_nids(nm_i)) {
f2fs_bug_on(list_empty(&nm_i->free_nid_list));
- list_for_each(this, &nm_i->free_nid_list) {
- i = list_entry(this, struct free_nid, list);
+ list_for_each_entry(i, &nm_i->free_nid_list, list)
if (i->state == NID_NEW)
break;
- }
f2fs_bug_on(i->state != NID_NEW);
*nid = i->nid;
@@ -1781,7 +1778,7 @@ void flush_nat_entries(struct f2fs_sb_info *sbi)
struct f2fs_nm_info *nm_i = NM_I(sbi);
struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
struct f2fs_summary_block *sum = curseg->sum_blk;
- struct list_head *cur, *n;
+ struct nat_entry *ne, *cur;
struct page *page = NULL;
struct f2fs_nat_block *nat_blk = NULL;
nid_t start_nid = 0, end_nid = 0;
@@ -1793,18 +1790,17 @@ void flush_nat_entries(struct f2fs_sb_info *sbi)
mutex_lock(&curseg->curseg_mutex);
/* 1) flush dirty nat caches */
- list_for_each_safe(cur, n, &nm_i->dirty_nat_entries) {
- struct nat_entry *ne;
+ list_for_each_entry_safe(ne, cur, &nm_i->dirty_nat_entries, list) {
nid_t nid;
struct f2fs_nat_entry raw_ne;
int offset = -1;
block_t new_blkaddr;
- ne = list_entry(cur, struct nat_entry, list);
- nid = nat_get_nid(ne);
-
if (nat_get_blkaddr(ne) == NEW_ADDR)
continue;
+
+ nid = nat_get_nid(ne);
+
if (flushed)
goto to_nat_page;
diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c
index bbef4ed..b1ae89f 100644
--- a/fs/f2fs/recovery.c
+++ b/fs/f2fs/recovery.c
@@ -27,14 +27,12 @@ bool space_for_roll_forward(struct f2fs_sb_info *sbi)
static struct fsync_inode_entry *get_fsync_inode(struct list_head *head,
nid_t ino)
{
- struct list_head *this;
struct fsync_inode_entry *entry;
- list_for_each(this, head) {
- entry = list_entry(this, struct fsync_inode_entry, list);
+ list_for_each_entry(entry, head, list)
if (entry->inode->i_ino == ino)
return entry;
- }
+
return NULL;
}
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
index 570ab9a..cb49e63 100644
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -340,8 +340,7 @@ static void set_prefree_as_free_segments(struct f2fs_sb_info *sbi)
void clear_prefree_segments(struct f2fs_sb_info *sbi)
{
struct list_head *head = &(SM_I(sbi)->discard_list);
- struct list_head *this, *next;
- struct discard_entry *entry;
+ struct discard_entry *entry, *this;
struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
unsigned long *prefree_map = dirty_i->dirty_segmap[PRE];
unsigned int total_segs = TOTAL_SEGS(sbi);
@@ -370,8 +369,7 @@ void clear_prefree_segments(struct f2fs_sb_info *sbi)
mutex_unlock(&dirty_i->seglist_lock);
/* send small discards */
- list_for_each_safe(this, next, head) {
- entry = list_entry(this, struct discard_entry, list);
+ list_for_each_entry_safe(entry, this, head, list) {
f2fs_issue_discard(sbi, entry->blkaddr, entry->len);
list_del(&entry->list);
SM_I(sbi)->nr_discards -= entry->len;
--
1.7.9.5
------------------------------------------------------------------------------
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 2/2] f2fs: use list_for_each_entry{_safe} for simplyfying code
2014-03-29 3:33 [PATCH 2/2] f2fs: use list_for_each_entry{_safe} for simplyfying code Chao Yu
@ 2014-03-31 10:07 ` Gu Zheng
2014-04-01 1:45 ` Chao Yu
0 siblings, 1 reply; 4+ messages in thread
From: Gu Zheng @ 2014-03-31 10:07 UTC (permalink / raw)
To: Chao Yu; +Cc: linux-fsdevel, linux-kernel, linux-f2fs-devel
Hi Yu,
On 03/29/2014 11:33 AM, Chao Yu wrote:
> This patch use list_for_each_entry{_safe} instead of list_for_each{_safe} for
> simplfying code.
>
> Signed-off-by: Chao Yu <chao2.yu@samsung.com>
> ---
> fs/f2fs/checkpoint.c | 37 ++++++++++++++-----------------------
> fs/f2fs/node.c | 16 ++++++----------
> fs/f2fs/recovery.c | 6 ++----
> fs/f2fs/segment.c | 6 ++----
> 4 files changed, 24 insertions(+), 41 deletions(-)
>
> diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
> index d877f46..4aa521a 100644
> --- a/fs/f2fs/checkpoint.c
> +++ b/fs/f2fs/checkpoint.c
> @@ -308,16 +308,15 @@ void release_orphan_inode(struct f2fs_sb_info *sbi)
>
> void add_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
> {
> - struct list_head *head, *this;
> - struct orphan_inode_entry *new = NULL, *orphan = NULL;
> + struct list_head *head;
> + struct orphan_inode_entry *new, *orphan;
>
> new = f2fs_kmem_cache_alloc(orphan_entry_slab, GFP_ATOMIC);
> new->ino = ino;
>
> spin_lock(&sbi->orphan_inode_lock);
> head = &sbi->orphan_inode_list;
> - list_for_each(this, head) {
> - orphan = list_entry(this, struct orphan_inode_entry, list);
> + list_for_each_entry(orphan, head, list) {
> if (orphan->ino == ino) {
> spin_unlock(&sbi->orphan_inode_lock);
> kmem_cache_free(orphan_entry_slab, new);
> @@ -326,14 +325,10 @@ void add_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
>
> if (orphan->ino > ino)
> break;
> - orphan = NULL;
> }
>
> - /* add new_oentry into list which is sorted by inode number */
> - if (orphan)
> - list_add(&new->list, this->prev);
> - else
> - list_add_tail(&new->list, head);
> + /* add new orphan entry into list which is sorted by inode number */
> + list_add_tail(&new->list, &orphan->list);
It seems that the logic can not be changed here, otherwise the orphan list will not be in order if
the new ino is bigger than all the in-list ones.
E.g.
ino:5
1-->2-->3-->4
==>
1-->2-->3-->5-->4
Regards,
Gu
> spin_unlock(&sbi->orphan_inode_lock);
> }
>
> @@ -561,14 +556,12 @@ static int __add_dirty_inode(struct inode *inode, struct dir_inode_entry *new)
> {
> struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
> struct list_head *head = &sbi->dir_inode_list;
> - struct list_head *this;
> + struct dir_inode_entry *entry;
>
> - list_for_each(this, head) {
> - struct dir_inode_entry *entry;
> - entry = list_entry(this, struct dir_inode_entry, list);
> + list_for_each_entry(entry, head, list)
> if (unlikely(entry->inode == inode))
> return -EEXIST;
> - }
> +
> list_add_tail(&new->list, head);
> stat_inc_dirty_dir(sbi);
> return 0;
> @@ -618,7 +611,8 @@ void add_dirty_dir_inode(struct inode *inode)
> void remove_dirty_dir_inode(struct inode *inode)
> {
> struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
> - struct list_head *this, *head;
> + struct list_head *head;
> + struct dir_inode_entry *entry;
>
> if (!S_ISDIR(inode->i_mode))
> return;
> @@ -630,9 +624,7 @@ void remove_dirty_dir_inode(struct inode *inode)
> }
>
> head = &sbi->dir_inode_list;
> - list_for_each(this, head) {
> - struct dir_inode_entry *entry;
> - entry = list_entry(this, struct dir_inode_entry, list);
> + list_for_each_entry(entry, head, list) {
> if (entry->inode == inode) {
> list_del(&entry->list);
> stat_dec_dirty_dir(sbi);
> @@ -654,15 +646,14 @@ done:
> struct inode *check_dirty_dir_inode(struct f2fs_sb_info *sbi, nid_t ino)
> {
>
> - struct list_head *this, *head;
> + struct list_head *head;
> struct inode *inode = NULL;
> + struct dir_inode_entry *entry;
>
> spin_lock(&sbi->dir_inode_lock);
>
> head = &sbi->dir_inode_list;
> - list_for_each(this, head) {
> - struct dir_inode_entry *entry;
> - entry = list_entry(this, struct dir_inode_entry, list);
> + list_for_each_entry(entry, head, list) {
> if (entry->inode->i_ino == ino) {
> inode = entry->inode;
> break;
> diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
> index 0021056..afda3d3 100644
> --- a/fs/f2fs/node.c
> +++ b/fs/f2fs/node.c
> @@ -1452,7 +1452,6 @@ bool alloc_nid(struct f2fs_sb_info *sbi, nid_t *nid)
> {
> struct f2fs_nm_info *nm_i = NM_I(sbi);
> struct free_nid *i = NULL;
> - struct list_head *this;
> retry:
> if (unlikely(sbi->total_valid_node_count + 1 >= nm_i->max_nid))
> return false;
> @@ -1462,11 +1461,9 @@ retry:
> /* We should not use stale free nids created by build_free_nids */
> if (nm_i->fcnt && !on_build_free_nids(nm_i)) {
> f2fs_bug_on(list_empty(&nm_i->free_nid_list));
> - list_for_each(this, &nm_i->free_nid_list) {
> - i = list_entry(this, struct free_nid, list);
> + list_for_each_entry(i, &nm_i->free_nid_list, list)
> if (i->state == NID_NEW)
> break;
> - }
>
> f2fs_bug_on(i->state != NID_NEW);
> *nid = i->nid;
> @@ -1781,7 +1778,7 @@ void flush_nat_entries(struct f2fs_sb_info *sbi)
> struct f2fs_nm_info *nm_i = NM_I(sbi);
> struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
> struct f2fs_summary_block *sum = curseg->sum_blk;
> - struct list_head *cur, *n;
> + struct nat_entry *ne, *cur;
> struct page *page = NULL;
> struct f2fs_nat_block *nat_blk = NULL;
> nid_t start_nid = 0, end_nid = 0;
> @@ -1793,18 +1790,17 @@ void flush_nat_entries(struct f2fs_sb_info *sbi)
> mutex_lock(&curseg->curseg_mutex);
>
> /* 1) flush dirty nat caches */
> - list_for_each_safe(cur, n, &nm_i->dirty_nat_entries) {
> - struct nat_entry *ne;
> + list_for_each_entry_safe(ne, cur, &nm_i->dirty_nat_entries, list) {
> nid_t nid;
> struct f2fs_nat_entry raw_ne;
> int offset = -1;
> block_t new_blkaddr;
>
> - ne = list_entry(cur, struct nat_entry, list);
> - nid = nat_get_nid(ne);
> -
> if (nat_get_blkaddr(ne) == NEW_ADDR)
> continue;
> +
> + nid = nat_get_nid(ne);
> +
> if (flushed)
> goto to_nat_page;
>
> diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c
> index bbef4ed..b1ae89f 100644
> --- a/fs/f2fs/recovery.c
> +++ b/fs/f2fs/recovery.c
> @@ -27,14 +27,12 @@ bool space_for_roll_forward(struct f2fs_sb_info *sbi)
> static struct fsync_inode_entry *get_fsync_inode(struct list_head *head,
> nid_t ino)
> {
> - struct list_head *this;
> struct fsync_inode_entry *entry;
>
> - list_for_each(this, head) {
> - entry = list_entry(this, struct fsync_inode_entry, list);
> + list_for_each_entry(entry, head, list)
> if (entry->inode->i_ino == ino)
> return entry;
> - }
> +
> return NULL;
> }
>
> diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
> index 570ab9a..cb49e63 100644
> --- a/fs/f2fs/segment.c
> +++ b/fs/f2fs/segment.c
> @@ -340,8 +340,7 @@ static void set_prefree_as_free_segments(struct f2fs_sb_info *sbi)
> void clear_prefree_segments(struct f2fs_sb_info *sbi)
> {
> struct list_head *head = &(SM_I(sbi)->discard_list);
> - struct list_head *this, *next;
> - struct discard_entry *entry;
> + struct discard_entry *entry, *this;
> struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
> unsigned long *prefree_map = dirty_i->dirty_segmap[PRE];
> unsigned int total_segs = TOTAL_SEGS(sbi);
> @@ -370,8 +369,7 @@ void clear_prefree_segments(struct f2fs_sb_info *sbi)
> mutex_unlock(&dirty_i->seglist_lock);
>
> /* send small discards */
> - list_for_each_safe(this, next, head) {
> - entry = list_entry(this, struct discard_entry, list);
> + list_for_each_entry_safe(entry, this, head, list) {
> f2fs_issue_discard(sbi, entry->blkaddr, entry->len);
> list_del(&entry->list);
> SM_I(sbi)->nr_discards -= entry->len;
------------------------------------------------------------------------------
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 2/2] f2fs: use list_for_each_entry{_safe} for simplyfying code
2014-03-31 10:07 ` Gu Zheng
@ 2014-04-01 1:45 ` Chao Yu
2014-04-01 2:15 ` Gu Zheng
0 siblings, 1 reply; 4+ messages in thread
From: Chao Yu @ 2014-04-01 1:45 UTC (permalink / raw)
To: 'Gu Zheng'; +Cc: linux-fsdevel, linux-kernel, linux-f2fs-devel
Hi Gu,
> -----Original Message-----
> From: Gu Zheng [mailto:guz.fnst@cn.fujitsu.com]
> Sent: Monday, March 31, 2014 6:07 PM
> To: Chao Yu
> Cc: ???; linux-f2fs-devel@lists.sourceforge.net; linux-fsdevel@vger.kernel.org;
> linux-kernel@vger.kernel.org
> Subject: Re: [f2fs-dev] [PATCH 2/2] f2fs: use list_for_each_entry{_safe} for simplyfying code
>
> Hi Yu,
> On 03/29/2014 11:33 AM, Chao Yu wrote:
>
> > This patch use list_for_each_entry{_safe} instead of list_for_each{_safe} for
> > simplfying code.
> >
> > Signed-off-by: Chao Yu <chao2.yu@samsung.com>
> > ---
> > fs/f2fs/checkpoint.c | 37 ++++++++++++++-----------------------
> > fs/f2fs/node.c | 16 ++++++----------
> > fs/f2fs/recovery.c | 6 ++----
> > fs/f2fs/segment.c | 6 ++----
> > 4 files changed, 24 insertions(+), 41 deletions(-)
> >
> > diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
> > index d877f46..4aa521a 100644
> > --- a/fs/f2fs/checkpoint.c
> > +++ b/fs/f2fs/checkpoint.c
> > @@ -308,16 +308,15 @@ void release_orphan_inode(struct f2fs_sb_info *sbi)
> >
> > void add_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
> > {
> > - struct list_head *head, *this;
> > - struct orphan_inode_entry *new = NULL, *orphan = NULL;
> > + struct list_head *head;
> > + struct orphan_inode_entry *new, *orphan;
> >
> > new = f2fs_kmem_cache_alloc(orphan_entry_slab, GFP_ATOMIC);
> > new->ino = ino;
> >
> > spin_lock(&sbi->orphan_inode_lock);
> > head = &sbi->orphan_inode_list;
> > - list_for_each(this, head) {
> > - orphan = list_entry(this, struct orphan_inode_entry, list);
> > + list_for_each_entry(orphan, head, list) {
> > if (orphan->ino == ino) {
> > spin_unlock(&sbi->orphan_inode_lock);
> > kmem_cache_free(orphan_entry_slab, new);
> > @@ -326,14 +325,10 @@ void add_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
> >
> > if (orphan->ino > ino)
> > break;
> > - orphan = NULL;
> > }
> >
> > - /* add new_oentry into list which is sorted by inode number */
> > - if (orphan)
> > - list_add(&new->list, this->prev);
> > - else
> > - list_add_tail(&new->list, head);
> > + /* add new orphan entry into list which is sorted by inode number */
> > + list_add_tail(&new->list, &orphan->list);
>
> It seems that the logic can not be changed here, otherwise the orphan list will not be in order
> if
> the new ino is bigger than all the in-list ones.
> E.g.
> ino:5
> 1-->2-->3-->4
> ==>
> 1-->2-->3-->5-->4
As I checked, if new ino is bigger than all, it will break from list_for_each_entry because
&orphan->list is pointing to head. So list_add_tail can add the new entry before head to make
this list in order.
Thanks.
>
> Regards,
> Gu
>
[snip]
------------------------------------------------------------------------------
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 2/2] f2fs: use list_for_each_entry{_safe} for simplyfying code
2014-04-01 1:45 ` Chao Yu
@ 2014-04-01 2:15 ` Gu Zheng
0 siblings, 0 replies; 4+ messages in thread
From: Gu Zheng @ 2014-04-01 2:15 UTC (permalink / raw)
To: Chao Yu; +Cc: linux-fsdevel, linux-kernel, linux-f2fs-devel
Hi Yu,
On 04/01/2014 09:45 AM, Chao Yu wrote:
> Hi Gu,
>
>> -----Original Message-----
>> From: Gu Zheng [mailto:guz.fnst@cn.fujitsu.com]
>> Sent: Monday, March 31, 2014 6:07 PM
>> To: Chao Yu
>> Cc: ???; linux-f2fs-devel@lists.sourceforge.net; linux-fsdevel@vger.kernel.org;
>> linux-kernel@vger.kernel.org
>> Subject: Re: [f2fs-dev] [PATCH 2/2] f2fs: use list_for_each_entry{_safe} for simplyfying code
>>
>> Hi Yu,
>> On 03/29/2014 11:33 AM, Chao Yu wrote:
>>
>>> This patch use list_for_each_entry{_safe} instead of list_for_each{_safe} for
>>> simplfying code.
>>>
>>> Signed-off-by: Chao Yu <chao2.yu@samsung.com>
>>> ---
>>> fs/f2fs/checkpoint.c | 37 ++++++++++++++-----------------------
>>> fs/f2fs/node.c | 16 ++++++----------
>>> fs/f2fs/recovery.c | 6 ++----
>>> fs/f2fs/segment.c | 6 ++----
>>> 4 files changed, 24 insertions(+), 41 deletions(-)
>>>
>>> diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
>>> index d877f46..4aa521a 100644
>>> --- a/fs/f2fs/checkpoint.c
>>> +++ b/fs/f2fs/checkpoint.c
>>> @@ -308,16 +308,15 @@ void release_orphan_inode(struct f2fs_sb_info *sbi)
>>>
>>> void add_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
>>> {
>>> - struct list_head *head, *this;
>>> - struct orphan_inode_entry *new = NULL, *orphan = NULL;
>>> + struct list_head *head;
>>> + struct orphan_inode_entry *new, *orphan;
>>>
>>> new = f2fs_kmem_cache_alloc(orphan_entry_slab, GFP_ATOMIC);
>>> new->ino = ino;
>>>
>>> spin_lock(&sbi->orphan_inode_lock);
>>> head = &sbi->orphan_inode_list;
>>> - list_for_each(this, head) {
>>> - orphan = list_entry(this, struct orphan_inode_entry, list);
>>> + list_for_each_entry(orphan, head, list) {
>>> if (orphan->ino == ino) {
>>> spin_unlock(&sbi->orphan_inode_lock);
>>> kmem_cache_free(orphan_entry_slab, new);
>>> @@ -326,14 +325,10 @@ void add_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
>>>
>>> if (orphan->ino > ino)
>>> break;
>>> - orphan = NULL;
>>> }
>>>
>>> - /* add new_oentry into list which is sorted by inode number */
>>> - if (orphan)
>>> - list_add(&new->list, this->prev);
>>> - else
>>> - list_add_tail(&new->list, head);
>>> + /* add new orphan entry into list which is sorted by inode number */
>>> + list_add_tail(&new->list, &orphan->list);
>>
>> It seems that the logic can not be changed here, otherwise the orphan list will not be in order
>> if
>> the new ino is bigger than all the in-list ones.
>> E.g.
>> ino:5
>> 1-->2-->3-->4
>> ==>
>> 1-->2-->3-->5-->4
>
> As I checked, if new ino is bigger than all, it will break from list_for_each_entry because
> &orphan->list is pointing to head. So list_add_tail can add the new entry before head to make
> this list in order.
Oh...Yes, you are right.
Thanks for correcting me.
Regards,
Gu
>
> Thanks.
>
>>
>> Regards,
>> Gu
>>
>
> [snip]
>
>
------------------------------------------------------------------------------
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2014-04-01 2:25 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-03-29 3:33 [PATCH 2/2] f2fs: use list_for_each_entry{_safe} for simplyfying code Chao Yu
2014-03-31 10:07 ` Gu Zheng
2014-04-01 1:45 ` Chao Yu
2014-04-01 2:15 ` Gu Zheng
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).