rtems_filesystem_operations_table::lock_h/unlock_h questions

Sebastian Huber sebastian.huber at embedded-brains.de
Wed Dec 21 06:49:08 UTC 2016

On 20/12/16 19:45, Stella Laurenzo wrote:
> On Mon, Dec 19, 2016 at 10:21 PM, Sebastian Huber 
> <sebastian.huber at embedded-brains.de 
> <mailto:sebastian.huber at embedded-brains.de>> wrote:
>     On 19/12/16 22:37, Stella Laurenzo wrote:
>         Following up on this question on behalf of Radu, I can infer
>         the following "rules" for locking:
>           * External locking is applied only to operations which span
>             individual calls into the file system and must remain
>         consistent.
>             This seems to be done in only a handful of cases (which
>         make sense
>             but I can't attest to whether they are the only ones that
>         should
>             have external locking applied). These are all results of
>             calling rtems_filesystem_instance_lock():
>               o path evaluation in libcsupport/src/sup_fs_eval_path.c.
>         I have
>                 not audited the correctness of this code but it seems
>         to (be
>                 trying to) acquire locks as it traverses across each file
>                 system boundary.
>               o fchdir() while performing an access check that spans
>         two fs calls
>               o fchown() for similar reasons
>               o rtems_filesyste_location_free() when calling into the
>                 ops->freenod_h entry point.
>           * The filesystem access lock can be acquired recursively.
>           * Individual rtems_filesystem_operations_table entry points
>         should
>             guard their own internal state via locking as appropriate.
>         I inferred the last point from looking at other drivers and
>         the libio entry points, which make no effort to externally
>         acquire the filesystem lock unless if they need it for their
>         own consistency requirements. I'm left to conclude that the
>         RFS implementation is just missing internal locking and should
>         have it.
>         Does anyone have context on this issue that would indicate
>         otherwise?
>     The filesystem operations (rtems_filesystem_operations_table)
>     should use the file system instance lock and locking is done by
>     the filesystem layer via the lock_h/unlock_h operations. The
>     filesystem node operations (rtems_filesystem_file_handlers_r) are
>     not automatically locked by the filesystem layer, see for example
>     msdos_file_write() which obtains/releases the fs_info->vol_sema (=
>     one and only lock for a FAT filesystem instance in RTEMS).
> Thanks, this is helpful. We have patched the filesystem operations 
> themselves to internally lock because there seems to be cases this is 
> not happening at the callsites and was crashing us in the field. We 
> now have a test that can duplicate the crash and can back that local 
> patch out and try to find the missing lock at the filesystem layer and 
> propose a fix. I do believe that there are cases of a missing 
> lock_h/unlock_h call somewhere in the path traversal code, but we 
> haven't isolated it yet.

A missing lock_h/unlock_h in the filesystem layer would be a major bug. 
It would be nice if you can clarify this issue.

Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : sebastian.huber at embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.

More information about the users mailing list