2013-03-17 08:27:34

by Namjae Jeon

[permalink] [raw]
Subject: [PATCH 5/5] f2fs: avoid BUG_ON from check_nid_range and update return path in do_read_inode

From: Namjae Jeon <[email protected]>

In function check_nid_range, there is no need to trigger BUG_ON and make kernel stop.
Instead it could just check and indicate the inode number to be EINVAL.
Update the return path in do_read_inode to use the return from check_nid_range.

Signed-off-by: Namjae Jeon <[email protected]>
Signed-off-by: Amit Sahrawat <[email protected]>
---
fs/f2fs/f2fs.h | 6 ++++--
fs/f2fs/inode.c | 6 +++++-
2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index be7ae70..1dae921 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -515,9 +515,11 @@ static inline void mutex_unlock_op(struct f2fs_sb_info *sbi, enum lock_type t)
/*
* Check whether the given nid is within node id range.
*/
-static inline void check_nid_range(struct f2fs_sb_info *sbi, nid_t nid)
+static inline int check_nid_range(struct f2fs_sb_info *sbi, nid_t nid)
{
- BUG_ON((nid >= NM_I(sbi)->max_nid));
+ if (nid >= NM_I(sbi)->max_nid)
+ return -EINVAL;
+ return 0;
}

#define F2FS_DEFAULT_ALLOCATED_BLOCKS 1
diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c
index ddae412..6d82020 100644
--- a/fs/f2fs/inode.c
+++ b/fs/f2fs/inode.c
@@ -44,7 +44,11 @@ static int do_read_inode(struct inode *inode)
struct f2fs_inode *ri;

/* Check if ino is within scope */
- check_nid_range(sbi, inode->i_ino);
+ if (check_nid_range(sbi, inode->i_ino)) {
+ f2fs_msg(inode->i_sb, KERN_ERR, "bad inode number: %lu",
+ (unsigned long) inode->i_ino);
+ return -EINVAL;
+ }

node_page = get_node_page(sbi, inode->i_ino);
if (IS_ERR(node_page))
--
1.7.9.5


2013-03-18 02:20:20

by Jaegeuk Kim

[permalink] [raw]
Subject: Re: [PATCH 5/5] f2fs: avoid BUG_ON from check_nid_range and update return path in do_read_inode

2013-03-17 (일), 17:27 +0900, Namjae Jeon:
> From: Namjae Jeon <[email protected]>
>
> In function check_nid_range, there is no need to trigger BUG_ON and make kernel stop.
> Instead it could just check and indicate the inode number to be EINVAL.
> Update the return path in do_read_inode to use the return from check_nid_range.
>
> Signed-off-by: Namjae Jeon <[email protected]>
> Signed-off-by: Amit Sahrawat <[email protected]>
> ---
> fs/f2fs/f2fs.h | 6 ++++--
> fs/f2fs/inode.c | 6 +++++-
> 2 files changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> index be7ae70..1dae921 100644
> --- a/fs/f2fs/f2fs.h
> +++ b/fs/f2fs/f2fs.h
> @@ -515,9 +515,11 @@ static inline void mutex_unlock_op(struct f2fs_sb_info *sbi, enum lock_type t)
> /*
> * Check whether the given nid is within node id range.
> */
> -static inline void check_nid_range(struct f2fs_sb_info *sbi, nid_t nid)
> +static inline int check_nid_range(struct f2fs_sb_info *sbi, nid_t nid)
> {
> - BUG_ON((nid >= NM_I(sbi)->max_nid));
> + if (nid >= NM_I(sbi)->max_nid)
> + return -EINVAL;
> + return 0;

At this moment, I'd like to apply this patch and remain BUG_ON together
since we should find real bugs in f2fs.
How do you think?

> }
>
> #define F2FS_DEFAULT_ALLOCATED_BLOCKS 1
> diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c
> index ddae412..6d82020 100644
> --- a/fs/f2fs/inode.c
> +++ b/fs/f2fs/inode.c
> @@ -44,7 +44,11 @@ static int do_read_inode(struct inode *inode)
> struct f2fs_inode *ri;
>
> /* Check if ino is within scope */
> - check_nid_range(sbi, inode->i_ino);
> + if (check_nid_range(sbi, inode->i_ino)) {
> + f2fs_msg(inode->i_sb, KERN_ERR, "bad inode number: %lu",
> + (unsigned long) inode->i_ino);
> + return -EINVAL;
> + }
>
> node_page = get_node_page(sbi, inode->i_ino);
> if (IS_ERR(node_page))

--
Jaegeuk Kim
Samsung


Attachments:
signature.asc (836.00 B)
This is a digitally signed message part

2013-03-18 05:23:39

by Namjae Jeon

[permalink] [raw]
Subject: Re: [PATCH 5/5] f2fs: avoid BUG_ON from check_nid_range and update return path in do_read_inode

2013/3/18, Jaegeuk Kim <[email protected]>:
> 2013-03-17 (일), 17:27 +0900, Namjae Jeon:
>> From: Namjae Jeon <[email protected]>
>>
>> In function check_nid_range, there is no need to trigger BUG_ON and make
>> kernel stop.
>> Instead it could just check and indicate the inode number to be EINVAL.
>> Update the return path in do_read_inode to use the return from
>> check_nid_range.
>>
>> Signed-off-by: Namjae Jeon <[email protected]>
>> Signed-off-by: Amit Sahrawat <[email protected]>
>> ---
>> fs/f2fs/f2fs.h | 6 ++++--
>> fs/f2fs/inode.c | 6 +++++-
>> 2 files changed, 9 insertions(+), 3 deletions(-)
>>
>> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
>> index be7ae70..1dae921 100644
>> --- a/fs/f2fs/f2fs.h
>> +++ b/fs/f2fs/f2fs.h
>> @@ -515,9 +515,11 @@ static inline void mutex_unlock_op(struct
>> f2fs_sb_info *sbi, enum lock_type t)
>> /*
>> * Check whether the given nid is within node id range.
>> */
>> -static inline void check_nid_range(struct f2fs_sb_info *sbi, nid_t nid)
>> +static inline int check_nid_range(struct f2fs_sb_info *sbi, nid_t nid)
>> {
>> - BUG_ON((nid >= NM_I(sbi)->max_nid));
>> + if (nid >= NM_I(sbi)->max_nid)
>> + return -EINVAL;
>> + return 0;
>
Hi Jaegeuk.
> At this moment, I'd like to apply this patch and remain BUG_ON together
> since we should find real bugs in f2fs.
> How do you think?
Instead of BUG_ON, we can make use of WARN_ON as that can also solve
our purpose of finding the real bugs with the same information (back
trace) and will also keep system running.

Thanks :)
>
>> }
>>
>> #define F2FS_DEFAULT_ALLOCATED_BLOCKS 1
>> diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c
>> index ddae412..6d82020 100644
>> --- a/fs/f2fs/inode.c
>> +++ b/fs/f2fs/inode.c
>> @@ -44,7 +44,11 @@ static int do_read_inode(struct inode *inode)
>> struct f2fs_inode *ri;
>>
>> /* Check if ino is within scope */
>> - check_nid_range(sbi, inode->i_ino);
>> + if (check_nid_range(sbi, inode->i_ino)) {
>> + f2fs_msg(inode->i_sb, KERN_ERR, "bad inode number: %lu",
>> + (unsigned long) inode->i_ino);
>> + return -EINVAL;
>> + }
>>
>> node_page = get_node_page(sbi, inode->i_ino);
>> if (IS_ERR(node_page))
>
> --
> Jaegeuk Kim
> Samsung
>

2013-03-18 05:41:06

by Jaegeuk Kim

[permalink] [raw]
Subject: Re: [PATCH 5/5] f2fs: avoid BUG_ON from check_nid_range and update return path in do_read_inode

2013-03-18 (월), 14:23 +0900, Namjae Jeon:
> 2013/3/18, Jaegeuk Kim <[email protected]>:
> > 2013-03-17 (일), 17:27 +0900, Namjae Jeon:
> >> From: Namjae Jeon <[email protected]>
> >>
> >> In function check_nid_range, there is no need to trigger BUG_ON and make
> >> kernel stop.
> >> Instead it could just check and indicate the inode number to be EINVAL.
> >> Update the return path in do_read_inode to use the return from
> >> check_nid_range.
> >>
> >> Signed-off-by: Namjae Jeon <[email protected]>
> >> Signed-off-by: Amit Sahrawat <[email protected]>
> >> ---
> >> fs/f2fs/f2fs.h | 6 ++++--
> >> fs/f2fs/inode.c | 6 +++++-
> >> 2 files changed, 9 insertions(+), 3 deletions(-)
> >>
> >> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> >> index be7ae70..1dae921 100644
> >> --- a/fs/f2fs/f2fs.h
> >> +++ b/fs/f2fs/f2fs.h
> >> @@ -515,9 +515,11 @@ static inline void mutex_unlock_op(struct
> >> f2fs_sb_info *sbi, enum lock_type t)
> >> /*
> >> * Check whether the given nid is within node id range.
> >> */
> >> -static inline void check_nid_range(struct f2fs_sb_info *sbi, nid_t nid)
> >> +static inline int check_nid_range(struct f2fs_sb_info *sbi, nid_t nid)
> >> {
> >> - BUG_ON((nid >= NM_I(sbi)->max_nid));
> >> + if (nid >= NM_I(sbi)->max_nid)
> >> + return -EINVAL;
> >> + return 0;
> >
> Hi Jaegeuk.
> > At this moment, I'd like to apply this patch and remain BUG_ON together
> > since we should find real bugs in f2fs.
> > How do you think?
> Instead of BUG_ON, we can make use of WARN_ON as that can also solve
> our purpose of finding the real bugs with the same information (back
> trace) and will also keep system running.
>

Got it~!
Thanks,

> Thanks :)
> >
> >> }
> >>
> >> #define F2FS_DEFAULT_ALLOCATED_BLOCKS 1
> >> diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c
> >> index ddae412..6d82020 100644
> >> --- a/fs/f2fs/inode.c
> >> +++ b/fs/f2fs/inode.c
> >> @@ -44,7 +44,11 @@ static int do_read_inode(struct inode *inode)
> >> struct f2fs_inode *ri;
> >>
> >> /* Check if ino is within scope */
> >> - check_nid_range(sbi, inode->i_ino);
> >> + if (check_nid_range(sbi, inode->i_ino)) {
> >> + f2fs_msg(inode->i_sb, KERN_ERR, "bad inode number: %lu",
> >> + (unsigned long) inode->i_ino);
> >> + return -EINVAL;
> >> + }
> >>
> >> node_page = get_node_page(sbi, inode->i_ino);
> >> if (IS_ERR(node_page))
> >
> > --
> > Jaegeuk Kim
> > Samsung
> >
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/

--
Jaegeuk Kim
Samsung


Attachments:
signature.asc (836.00 B)
This is a digitally signed message part