Re: Patch, forward release() return values to the close() call

From: David Brown (dave@codewhore.org)
Date: Fri Mar 22 2002 - 08:51:43 EST


On Fri, Mar 22, 2002 at 08:58:02AM +0100, Axel Kittenberger wrote:
> > Forgive me if I'm not completely understanding this, but isn't release()
> > only called when the refcount of the file structure drops to zero? e.g.:
> >
> > [18]Note that release isn't invoked every time a process calls close.
> > Whenever a file structure is shared (for example, after a fork or a
> > dup), release won't be invoked until all copies are closed. If you need
> > to flush pending data when any copy is closed, you should implement the
> > flush method.
>
> Oh that might be, however in my case the device is exclusivly locked, so it
> doesn't matter that much, since there can be only one writer.
>
> To explain what it actually is, it's a driver to program a LCA chip, an
> userspace opens the device, writes the program for the LCA, and closes the
> device. The driver itself can not understand the file format transmitted
> trough it, and has so no chance to know where the supposed end of stream is
> until the userspace closes the device. At close() it let's the LCA go, and
> looks if it's starting up, if so it has accpeted it's program, if not the
> file was not a valid image or the LCA might be damaged, and this error
> condition should be signaled.
>
> Programming a LCA simply works then from the shell like in example this:
> $> cp my-lca-image /dev/lca || echo "LCA failure :("
>
> Where cp fails if the lca has not accepted it's image.
>
> flush() can also be called in middle of stream, and is not a good indication
> for an end of stream.

This is me talking prior to having coffee, but Chapter 3 of the
Rubini/Corbet book says:

  The flush operation is invoked when a process closes its copy of a file
  descriptor for a device; it should execute (and wait for) any outstanding
  operations on the device. This must not be confused with the fsync operation
  requested by user programs. Currently, flush is used only in the network file
  system (NFS) code. If flush is NULL, it is simply not invoked.

I guess it doesn't specifically say it's not called in midstream, but
it reads as if flush() is called on /only/ close(). I may test this
today, just for fun.

>
> > > Your driver is buggy, if it thinks it can fail f_op->release.
>
> If this is would be really (always) true, wouldn't it at least be better to
> have the release() prototype with a void return value?

That wasn't me, that was Jeff. :)

- Dave
  dave@codewhore.org



-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sat Mar 23 2002 - 22:00:27 EST