All of lore.kernel.org
 help / color / mirror / Atom feed
From: Amir Goldstein <amir73il@gmail.com>
To: Dan Carpenter <dan.carpenter@oracle.com>
Cc: linux-fsdevel <linux-fsdevel@vger.kernel.org>, Jan Kara <jack@suse.cz>
Subject: Re: [bug report] fsnotify: pass dir and inode arguments to fsnotify()
Date: Thu, 30 Jul 2020 14:55:11 +0300	[thread overview]
Message-ID: <CAOQ4uxgEG9PNtdoMXw52_C4oaUQpi2DVx34_QEHeV195e3kYdg@mail.gmail.com> (raw)
In-Reply-To: <20200730111339.GA54272@mwanda>

On Thu, Jul 30, 2020 at 2:13 PM <dan.carpenter@oracle.com> wrote:
>
> Hello Amir Goldstein,
>
> This is a semi-automatic email about new static checker warnings.
>
> The patch 40a100d3adc1: "fsnotify: pass dir and inode arguments to
> fsnotify()" from Jul 22, 2020, leads to the following Smatch
> complaint:

That's an odd report, because...

>
>     fs/notify/fsnotify.c:460 fsnotify()
>     warn: variable dereferenced before check 'inode' (see line 449)
>
> fs/notify/fsnotify.c
>    448          }
>    449          sb = inode->i_sb;
>                      ^^^^^^^^^^^
> New dreference.

First of all, two lines above we have
if (!inode) inode = dir;

This function does not assert (inode || dir), but must it??
This is even documented:

 * @inode:      optional inode associated with event -
 *              either @dir or @inode must be non-NULL.

Second,
The line above was indeed added by:
40a100d3adc1: "fsnotify: pass dir and inode arguments to fsnotify()"

However...

>
>    450
>    451          /*
>    452           * Optimization: srcu_read_lock() has a memory barrier which can
>    453           * be expensive.  It protects walking the *_fsnotify_marks lists.
>    454           * However, if we do not walk the lists, we do not have to do
>    455           * SRCU because we have no references to any objects and do not
>    456           * need SRCU to keep them "alive".
>    457           */
>    458          if (!sb->s_fsnotify_marks &&
>    459              (!mnt || !mnt->mnt_fsnotify_marks) &&
>    460              (!inode || !inode->i_fsnotify_marks) &&
>                      ^^^^^^
> Check too late.  Presumably this check can be removed?

But this line was only added later by:
9b93f33105f5 fsnotify: send event with parent/name info to
sb/mount/non-dir marks

So, yes, the check could be removed.
It is a leftover from a previous revision, but even though it is a leftover
I kind of like the code better this way.

In principle, an event on sb/mnt that is not associated with any inode
(for example
FS_UNMOUNT) could be added in the future.
And then we will have to fix documentation and the inode dereference above.

In any case, thank you for the report, but I don't see a reason to make any
changes right now.

Thanks,
Amir.

  reply	other threads:[~2020-07-30 11:55 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-30 11:13 [bug report] fsnotify: pass dir and inode arguments to fsnotify() dan.carpenter
2020-07-30 11:55 ` Amir Goldstein [this message]
2020-07-30 19:25   ` Jan Kara

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAOQ4uxgEG9PNtdoMXw52_C4oaUQpi2DVx34_QEHeV195e3kYdg@mail.gmail.com \
    --to=amir73il@gmail.com \
    --cc=dan.carpenter@oracle.com \
    --cc=jack@suse.cz \
    --cc=linux-fsdevel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.