On Tue, Aug 27, 2019 at 06:27:35PM +0100, Al Viro wrote:
> Most of them are actually pure bollocks - "it can never happen, but if it
> does,
> let's return -EWHATEVER to feel better". Some are crap like -EINTR, which is
> also bollocks - for one thing, process might've been closing files precisely
> because it's been hit by SIGKILL. For another, it's a destructor. It won't
> be retried by the caller - there's nothing called for that object afterwards.
> What you don't do in it won't be done at all.
>
> And some are "commit on final close" kind of thing, both with the hardware
> errors and parsing errors.
FWIW, here's the picture for fs/*: 6 instances.
afs_release():
calls vfs_fsync() if file had been opened for write, tries to pass
the return value to caller. Job for ->flush(), AFAICS.
coda_psdev_release():
returns -1 in situation impossible after successful ->open().
Can't happen without memory corruption.
configfs_release_bin_file():
discussed upthread
dlm device_close():
returns -ENOENT if dlm_find_lockspace_local(proc->lockspace) fails.
No idea if that can happen.
reiserfs_file_release():
tries to return an error if it can't free preallocated blocks.
xfs_release():
similar to the previous case.
In kernel/*: ftrace_graph_release() might return -ENOMEM. No idea whether it's
actually possible.
In net/*: none
In sound/*: 4 instances.
snd_pcm_oss_release():
if (snd_BUG_ON(!substream))
return -ENXIO;
IOW, whine in impossible case.
snd_pcm_release():
ditto.
sq_release():
if (file->f_mode & FMODE_WRITE) {
if (write_sq.busy)
rc = sq_fsync();
subsequently returns rc; sq_fsync() can return an error, both on timeout
and in case of interrupted wait.
snd_hwdep_release():
passes the return value of hwdep ->release() method; two of those
can return an error. snd_asihpi_hpi_release() is, AFAICS, impossible,
unless you manage to flip this module_param(enable_hpi_hwdep, bool,
0644);
off after opening a file. And snd_usX2Y_hwdep_pcm_release() calls
usX2Y_pcms_busy_check() and passes its return value out. No idea
whether that can be triggered.
In other words, the real mess is hidden in drivers/*...