2006-10-09 16:40:20

by Luca Tettamanti

[permalink] [raw]
Subject: [PATCH 2.6.19-git] Fix error handling in create_files()

Hello,
current code in create_files() detects an error iff the last
sysfs_add_file fails:

for (attr = grp->attrs; *attr && !error; attr++) {
error = sysfs_add_file(dir, *attr, SYSFS_KOBJ_ATTR);
}
if (error)
remove_files(dir,grp);

In order to do the proper cleanup upon failure 'error' must be checked on
every iteration.

Signed-Off-By: Luca Tettamanti <[email protected]>

---
fs/sysfs/group.c | 2 ++
1 file changed, 2 insertions(+)

diff --git a/fs/sysfs/group.c b/fs/sysfs/group.c
index 122145b..1c490d6 100644
--- a/fs/sysfs/group.c
+++ b/fs/sysfs/group.c
@@ -33,6 +33,8 @@ static int create_files(struct dentry *

for (attr = grp->attrs; *attr && !error; attr++) {
error = sysfs_add_file(dir, *attr, SYSFS_KOBJ_ATTR);
+ if (error)
+ break;
}
if (error)
remove_files(dir,grp);


Luca
--
Recursion n.:
See Recursion.


2006-10-09 16:48:43

by Greg KH

[permalink] [raw]
Subject: Re: [PATCH 2.6.19-git] Fix error handling in create_files()

On Mon, Oct 09, 2006 at 06:40:17PM +0200, Luca Tettamanti wrote:
> Hello,
> current code in create_files() detects an error iff the last
> sysfs_add_file fails:
>
> for (attr = grp->attrs; *attr && !error; attr++) {
> error = sysfs_add_file(dir, *attr, SYSFS_KOBJ_ATTR);
> }
> if (error)
> remove_files(dir,grp);
>
> In order to do the proper cleanup upon failure 'error' must be checked on
> every iteration.

But it is, look up there in the "!error" test, right?

thanks,

greg k-h

2006-10-09 17:04:04

by Luca Tettamanti

[permalink] [raw]
Subject: Re: [PATCH 2.6.19-git] Fix error handling in create_files()

Il Mon, Oct 09, 2006 at 09:48:20AM -0700, Greg KH ha scritto:
> On Mon, Oct 09, 2006 at 06:40:17PM +0200, Luca Tettamanti wrote:
> > Hello,
> > current code in create_files() detects an error iff the last
> > sysfs_add_file fails:
> >
> > for (attr = grp->attrs; *attr && !error; attr++) {
> > error = sysfs_add_file(dir, *attr, SYSFS_KOBJ_ATTR);
> > }
> > if (error)
> > remove_files(dir,grp);
> >
> > In order to do the proper cleanup upon failure 'error' must be checked on
> > every iteration.
>
> But it is, look up there in the "!error" test, right?

Ah, right. I totally missed it.

While we are at it: is it safe to always call sysfs_remove_group even if
the preceding sysfs_create_group failed?

(I'm looking at this warning:

arch/i386/kernel/cpu/mcheck/therm_throt.c: In function 'thermal_throttle_add_dev':
arch/i386/kernel/cpu/mcheck/therm_throt.c:115: warning: ignoring return value of
'sysfs_create_group', declared with attribute warn_unused_result
)

Luca
--
42

2006-10-09 17:21:31

by Cornelia Huck

[permalink] [raw]
Subject: Re: [PATCH 2.6.19-git] Fix error handling in create_files()

On Mon, 9 Oct 2006 19:03:57 +0200,
Luca Tettamanti <[email protected]> wrote:

> While we are at it: is it safe to always call sysfs_remove_group even if
> the preceding sysfs_create_group failed?

No, it will oops in remove_dir(). (See also the recent discussion in
"drivers/base: error handling fixes" - drivers/base/topology.c has
problems in that area as well...)

--
Cornelia Huck
Linux for zSeries Developer
Tel.: +49-7031-16-4837, Mail: [email protected]