All of lore.kernel.org
 help / color / mirror / Atom feed
* [Buildroot] [PATCH] makedevs: unlink device nodes before they are created
@ 2016-11-05  0:14 Arnout Vandecappelle
  2016-11-05  0:47 ` Fabio Estevam
  2016-11-05  9:30 ` Yann E. MORIN
  0 siblings, 2 replies; 5+ messages in thread
From: Arnout Vandecappelle @ 2016-11-05  0:14 UTC (permalink / raw)
  To: buildroot

We use makedevs to create device nodes in the target rootfs. However,
this can be called several times, e.g. when building several filesystem
images or when rebuilding. When the script is called the second time,
the device node already exists so mknod() errors out.

This wasn't noticed before because fakeroot's mknod() wrapper
(incorrectly) does _not_ error out when the file exists already. Now
we switched from fakeroot to pseudo, the problem becomes apparent.

The simplest solution is to change makedevs to first remove the target
file before creating it. This is simpler than two alternative
approaches:

- Removing the target files before makedevs is called is difficult,
  because we would have to parse the device table file to find out
  which files have to be deleted.

- Silently skipping device creation if it exists already is also easy,
  but then we really should also check if the device numbers and mode
  are correct, and that is more complicated.

The other types don't have to be changed. The 'd' (directory) type is
already OK because it already only creates directories if they don't
exist yet. The 'f' (file mode) and 'r' (recursive) types only operate
on files and directories that exist already.

Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
Reported-by: Fabio Estevam <festevam@gmail.com>
---
 package/makedevs/makedevs.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/package/makedevs/makedevs.c b/package/makedevs/makedevs.c
index cacb144..d477292 100644
--- a/package/makedevs/makedevs.c
+++ b/package/makedevs/makedevs.c
@@ -622,6 +622,7 @@ int main(int argc, char **argv)
 				for (i = 0; i < count; i++) {
 					sprintf(full_name_inc, "%s%d", full_name, start + i);
 					rdev = makedev(major, minor + i * increment);
+					unlink(full_name_inc);
 					if (mknod(full_name_inc, mode, rdev) == -1) {
 						bb_perror_msg("line %d: Couldnt create node %s", linenum, full_name_inc);
 						ret = EXIT_FAILURE;
@@ -638,6 +639,7 @@ int main(int argc, char **argv)
 				free(full_name_inc);
 			} else {
 				rdev = makedev(major, minor);
+				unlink(full_name);
 				if (mknod(full_name, mode, rdev) == -1) {
 					bb_perror_msg("line %d: Couldnt create node %s", linenum, full_name);
 					ret = EXIT_FAILURE;
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Buildroot] [PATCH] makedevs: unlink device nodes before they are created
  2016-11-05  0:14 [Buildroot] [PATCH] makedevs: unlink device nodes before they are created Arnout Vandecappelle
@ 2016-11-05  0:47 ` Fabio Estevam
  2016-11-05  9:30 ` Yann E. MORIN
  1 sibling, 0 replies; 5+ messages in thread
From: Fabio Estevam @ 2016-11-05  0:47 UTC (permalink / raw)
  To: buildroot

Hi Arnout,

On Fri, Nov 4, 2016 at 10:14 PM, Arnout Vandecappelle (Essensium/Mind)
<arnout@mind.be> wrote:
> We use makedevs to create device nodes in the target rootfs. However,
> this can be called several times, e.g. when building several filesystem
> images or when rebuilding. When the script is called the second time,
> the device node already exists so mknod() errors out.
>
> This wasn't noticed before because fakeroot's mknod() wrapper
> (incorrectly) does _not_ error out when the file exists already. Now
> we switched from fakeroot to pseudo, the problem becomes apparent.
>
> The simplest solution is to change makedevs to first remove the target
> file before creating it. This is simpler than two alternative
> approaches:
>
> - Removing the target files before makedevs is called is difficult,
>   because we would have to parse the device table file to find out
>   which files have to be deleted.
>
> - Silently skipping device creation if it exists already is also easy,
>   but then we really should also check if the device numbers and mode
>   are correct, and that is more complicated.
>
> The other types don't have to be changed. The 'd' (directory) type is
> already OK because it already only creates directories if they don't
> exist yet. The 'f' (file mode) and 'r' (recursive) types only operate
> on files and directories that exist already.
>
> Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
> Reported-by: Fabio Estevam <festevam@gmail.com>

This fixes the warp7_defconfig build error, thanks!

Tested-by: Fabio Estevam <festevam@gmail.com>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Buildroot] [PATCH] makedevs: unlink device nodes before they are created
  2016-11-05  0:14 [Buildroot] [PATCH] makedevs: unlink device nodes before they are created Arnout Vandecappelle
  2016-11-05  0:47 ` Fabio Estevam
@ 2016-11-05  9:30 ` Yann E. MORIN
  2016-11-05 11:05   ` Arnout Vandecappelle
  1 sibling, 1 reply; 5+ messages in thread
From: Yann E. MORIN @ 2016-11-05  9:30 UTC (permalink / raw)
  To: buildroot

Arnout, All,

On 2016-11-05 01:14 +0100, Arnout Vandecappelle (Essensium/Mind) spake thusly:
> We use makedevs to create device nodes in the target rootfs. However,
> this can be called several times, e.g. when building several filesystem
> images or when rebuilding. When the script is called the second time,
> the device node already exists so mknod() errors out.
> 
> This wasn't noticed before because fakeroot's mknod() wrapper
> (incorrectly) does _not_ error out when the file exists already. Now
> we switched from fakeroot to pseudo, the problem becomes apparent.
> 
> The simplest solution is to change makedevs to first remove the target
> file before creating it. This is simpler than two alternative
> approaches:
> 
> - Removing the target files before makedevs is called is difficult,
>   because we would have to parse the device table file to find out
>   which files have to be deleted.
> 
> - Silently skipping device creation if it exists already is also easy,
>   but then we really should also check if the device numbers and mode
>   are correct, and that is more complicated.
> 
> The other types don't have to be changed. The 'd' (directory) type is
> already OK because it already only creates directories if they don't
> exist yet. The 'f' (file mode) and 'r' (recursive) types only operate
> on files and directories that exist already.
> 
> Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
> Reported-by: Fabio Estevam <festevam@gmail.com>

NAK: we really do not want that files exist in the target in case they
are configured as device nodes in a dev-table. This should not happen.

That it works now is just an ill side-effect of fakeroot being lenient.
That it breaks with pseudo is good.

The fix is far from trivial, though, but we should handle the situation
via pseudo, and understand why it does not reload its DB.

If we can't fix our use of pseudo, then we should revertt to using
fakeroot for this release cycle.

Regards,
Yann E. MORIN.

> ---
>  package/makedevs/makedevs.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/package/makedevs/makedevs.c b/package/makedevs/makedevs.c
> index cacb144..d477292 100644
> --- a/package/makedevs/makedevs.c
> +++ b/package/makedevs/makedevs.c
> @@ -622,6 +622,7 @@ int main(int argc, char **argv)
>  				for (i = 0; i < count; i++) {
>  					sprintf(full_name_inc, "%s%d", full_name, start + i);
>  					rdev = makedev(major, minor + i * increment);
> +					unlink(full_name_inc);
>  					if (mknod(full_name_inc, mode, rdev) == -1) {
>  						bb_perror_msg("line %d: Couldnt create node %s", linenum, full_name_inc);
>  						ret = EXIT_FAILURE;
> @@ -638,6 +639,7 @@ int main(int argc, char **argv)
>  				free(full_name_inc);
>  			} else {
>  				rdev = makedev(major, minor);
> +				unlink(full_name);
>  				if (mknod(full_name, mode, rdev) == -1) {
>  					bb_perror_msg("line %d: Couldnt create node %s", linenum, full_name);
>  					ret = EXIT_FAILURE;
> -- 
> 2.9.3
> 
> _______________________________________________
> buildroot mailing list
> buildroot at busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Buildroot] [PATCH] makedevs: unlink device nodes before they are created
  2016-11-05  9:30 ` Yann E. MORIN
@ 2016-11-05 11:05   ` Arnout Vandecappelle
  2016-11-05 11:21     ` Yann E. MORIN
  0 siblings, 1 reply; 5+ messages in thread
From: Arnout Vandecappelle @ 2016-11-05 11:05 UTC (permalink / raw)
  To: buildroot



On 05-11-16 10:30, Yann E. MORIN wrote:
> Arnout, All,
> 
> On 2016-11-05 01:14 +0100, Arnout Vandecappelle (Essensium/Mind) spake thusly:
>> We use makedevs to create device nodes in the target rootfs. However,
>> this can be called several times, e.g. when building several filesystem
>> images or when rebuilding. When the script is called the second time,
>> the device node already exists so mknod() errors out.
>>
>> This wasn't noticed before because fakeroot's mknod() wrapper
>> (incorrectly) does _not_ error out when the file exists already. Now
>> we switched from fakeroot to pseudo, the problem becomes apparent.
>>
>> The simplest solution is to change makedevs to first remove the target
>> file before creating it. This is simpler than two alternative
>> approaches:
>>
>> - Removing the target files before makedevs is called is difficult,
>>   because we would have to parse the device table file to find out
>>   which files have to be deleted.
>>
>> - Silently skipping device creation if it exists already is also easy,
>>   but then we really should also check if the device numbers and mode
>>   are correct, and that is more complicated.
>>
>> The other types don't have to be changed. The 'd' (directory) type is
>> already OK because it already only creates directories if they don't
>> exist yet. The 'f' (file mode) and 'r' (recursive) types only operate
>> on files and directories that exist already.
>>
>> Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
>> Reported-by: Fabio Estevam <festevam@gmail.com>
> 
> NAK: we really do not want that files exist in the target in case they
> are configured as device nodes in a dev-table. This should not happen.

 So what you are saying is: we should instead go for the second alternative I
mentioned in the commit log, i.e. check if the existing node is the right type?


> That it works now is just an ill side-effect of fakeroot being lenient.
> That it breaks with pseudo is good.

 So you do agree that something needs to be fixed? I.e., if we would run it
under sudo instead of fakeroot/pseudo, we would see the same issue, right?


> The fix is far from trivial, though, but we should handle the situation
> via pseudo, and understand why it does not reload its DB.

 pseudo reloading its DB has nothing to do with it AFAICS. BTW can you describe
what the problem is with pseudo reloading its DB?


 Regards,
 Arnout


> 
> If we can't fix our use of pseudo, then we should revertt to using
> fakeroot for this release cycle.
> 
> Regards,
> Yann E. MORIN.
> 
>> ---
>>  package/makedevs/makedevs.c | 2 ++
>>  1 file changed, 2 insertions(+)
>>
>> diff --git a/package/makedevs/makedevs.c b/package/makedevs/makedevs.c
>> index cacb144..d477292 100644
>> --- a/package/makedevs/makedevs.c
>> +++ b/package/makedevs/makedevs.c
>> @@ -622,6 +622,7 @@ int main(int argc, char **argv)
>>  				for (i = 0; i < count; i++) {
>>  					sprintf(full_name_inc, "%s%d", full_name, start + i);
>>  					rdev = makedev(major, minor + i * increment);
>> +					unlink(full_name_inc);
>>  					if (mknod(full_name_inc, mode, rdev) == -1) {
>>  						bb_perror_msg("line %d: Couldnt create node %s", linenum, full_name_inc);
>>  						ret = EXIT_FAILURE;
>> @@ -638,6 +639,7 @@ int main(int argc, char **argv)
>>  				free(full_name_inc);
>>  			} else {
>>  				rdev = makedev(major, minor);
>> +				unlink(full_name);
>>  				if (mknod(full_name, mode, rdev) == -1) {
>>  					bb_perror_msg("line %d: Couldnt create node %s", linenum, full_name);
>>  					ret = EXIT_FAILURE;
>> -- 
>> 2.9.3
>>
>> _______________________________________________
>> buildroot mailing list
>> buildroot at busybox.net
>> http://lists.busybox.net/mailman/listinfo/buildroot
> 

-- 
Arnout Vandecappelle                          arnout at mind be
Senior Embedded Software Architect            +32-16-286500
Essensium/Mind                                http://www.mind.be
G.Geenslaan 9, 3001 Leuven, Belgium           BE 872 984 063 RPR Leuven
LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle
GPG fingerprint:  7493 020B C7E3 8618 8DEC 222C 82EB F404 F9AC 0DDF

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Buildroot] [PATCH] makedevs: unlink device nodes before they are created
  2016-11-05 11:05   ` Arnout Vandecappelle
@ 2016-11-05 11:21     ` Yann E. MORIN
  0 siblings, 0 replies; 5+ messages in thread
From: Yann E. MORIN @ 2016-11-05 11:21 UTC (permalink / raw)
  To: buildroot

Arnout, All,

On 2016-11-05 12:05 +0100, Arnout Vandecappelle spake thusly:
> On 05-11-16 10:30, Yann E. MORIN wrote:
> > On 2016-11-05 01:14 +0100, Arnout Vandecappelle (Essensium/Mind) spake thusly:
> >> We use makedevs to create device nodes in the target rootfs. However,
> >> this can be called several times, e.g. when building several filesystem
> >> images or when rebuilding. When the script is called the second time,
> >> the device node already exists so mknod() errors out.
> >>
> >> This wasn't noticed before because fakeroot's mknod() wrapper
> >> (incorrectly) does _not_ error out when the file exists already. Now
> >> we switched from fakeroot to pseudo, the problem becomes apparent.
> >>
> >> The simplest solution is to change makedevs to first remove the target
> >> file before creating it. This is simpler than two alternative
> >> approaches:
> >>
> >> - Removing the target files before makedevs is called is difficult,
> >>   because we would have to parse the device table file to find out
> >>   which files have to be deleted.
> >>
> >> - Silently skipping device creation if it exists already is also easy,
> >>   but then we really should also check if the device numbers and mode
> >>   are correct, and that is more complicated.
> >>
> >> The other types don't have to be changed. The 'd' (directory) type is
> >> already OK because it already only creates directories if they don't
> >> exist yet. The 'f' (file mode) and 'r' (recursive) types only operate
> >> on files and directories that exist already.
> >>
> >> Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
> >> Reported-by: Fabio Estevam <festevam@gmail.com>
> > 
> > NAK: we really do not want that files exist in the target in case they
> > are configured as device nodes in a dev-table. This should not happen.
> 
>  So what you are saying is: we should instead go for the second alternative I
> mentioned in the commit log, i.e. check if the existing node is the right type?

Yes, that would be acceptable, and correct.

> > That it works now is just an ill side-effect of fakeroot being lenient.
> > That it breaks with pseudo is good.
> 
>  So you do agree that something needs to be fixed? I.e., if we would run it
> under sudo instead of fakeroot/pseudo, we would see the same issue, right?

Yup:

    # mkdir foo c 5 1
    # mkdir foo c 5 1
    mknod: foo: File exists
    # echo $?
    1

> > The fix is far from trivial, though, but we should handle the situation
> > via pseudo, and understand why it does not reload its DB.
> 
>  pseudo reloading its DB has nothing to do with it AFAICS. BTW can you describe
> what the problem is with pseudo reloading its DB?

Forget it, I re-ran a few tests now, and it does work.

Regards,
Yann E. MORIN.

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2016-11-05 11:21 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-11-05  0:14 [Buildroot] [PATCH] makedevs: unlink device nodes before they are created Arnout Vandecappelle
2016-11-05  0:47 ` Fabio Estevam
2016-11-05  9:30 ` Yann E. MORIN
2016-11-05 11:05   ` Arnout Vandecappelle
2016-11-05 11:21     ` Yann E. MORIN

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.