From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from out5-smtp.messagingengine.com ([66.111.4.29]:58673 "EHLO out5-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752464AbcJJPpc (ORCPT ); Mon, 10 Oct 2016 11:45:32 -0400 From: Nikolaus Rath To: Amir Goldstein Cc: fuse-devel@lists.sourceforge.net, linux-fsdevel , Miklos Szeredi Subject: Re: [fuse-devel] Difference between invalidating and deleting dentry References: <87h98mxhlk.fsf@vostro.rath.org> Date: Mon, 10 Oct 2016 08:45:30 -0700 In-Reply-To: (Amir Goldstein's message of "Mon, 10 Oct 2016 11:16:25 +0300") Message-ID: <87a8ecqkbp.fsf@vostro.rath.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Sender: linux-fsdevel-owner@vger.kernel.org List-ID: Hi Amir, On Oct 10 2016, Amir Goldstein wrote: > Hi Nikolaus, > > On Sun, Oct 9, 2016 at 7:37 AM, Nikolaus Rath wrote: >> Hello, >> >> I just added an example to FUSE that illustrates use of the >> fuse_lowlevel_notify_inval_entry() function. However, when writing it I >> realized that I don't actually fully understand how this function >> differs from fuse_lowlevel_notify_delete(). Could someone shed some >> light on this? >> >> Currently, the FUSE documentation says: >> >> fuse_lowlevel_notify_inval_entry: >> Notify to invalidate parent attributes and the dentry matching >> parent/name >> >> fuse_lowlevel_notify_delete: >> Notify to invalidate parent attributes and delete the dentry matching >> parent/name if the dentry's inode number matches child (otherwise it >> will invalidate the matching dentry). >> >> >> But what exactly is the difference between deleting and invalidating a >> dentry? > > That is the difference: > > /* > * d_drop() unhashes the entry from the parent dentry hashes, so that it = won't > * be found through a VFS lookup any more. Note that this is different fr= om > * deleting the dentry - d_delete will try to mark the dentry negative if > * possible, giving a successful _negative_ lookup, while d_drop will > * just make the cache lookup fail. > */ Alright, so at this point I thought I understood the difference and got ready to update the documentation, but then you got me very confused: > But since fuse_lowlevel_notify_delete does among other things: > d_invalidate->...d_drop() > d_delete() > > You may still ask yourself what is the purpose of d_delete() after d_drop= (), > because there is no cache entry to make negative... So, in other words, FUSE's notify_delete will *not* store a negative dentry, but will just drop the dentry? >> In each case, isn't the resulting behavior the same, in that the >> next time someone tries to access this (parent_inode,entry_name) >> combination a lookup() request will be send to the FUSE process? > > You are right about the next lookup behavior being the same, but there > are other things that d_delete() does which d_invalidate does not, which > are important, like calling fsnotify_nameremove() and update the cached > inode and dentry that are referenced by open files. Hmm. So when should one use notify_delete() and when notify_inval_entry()? I understand there is a difference, but I'm uncertain about the practical consequences... Thanks! -Nikolaus --=20 GPG encrypted emails preferred. Key id: 0xD113FCAC3C4E599F Fingerprint: ED31 791B 2C5C 1613 AF38 8B8A D113 FCAC 3C4E 599F =C2=BBTime flies like an arrow, fruit flies like a Banana.=C2= =AB