Detecting new file name after receiving kevent's NOTE_RENAME

Ivan Radovanovic radovanovic at gmail.com
Tue Nov 10 09:20:19 UTC 2015


On 11/10/15 09:14, Konstantin Belousov napisa:
> On Tue, Nov 10, 2015 at 08:54:13AM +0100, Ivan Radovanovic wrote:
>> What is the best practice for discovering new file name after receiving
>> kevent(2) NOTE_RENAME on its descriptor?
>>
>> At the moment I am storing fileno from dirent(5) structure together with
>> descriptor and name, and when I receive NOTE_RENAME I re-read directory
>> and use it (fileno) to discover new name, but this obviously requires
>> re-reading entire directory on each NOTE_RENAME.
> NOTE_RENAME means that the file backing the given file descriptor was
> renamed, not that some directory entry in the contained directory
> renamed. In particular, the new dirent for the file, for which you get
> the notification, may belong to some other directory.  As such, scanning
> the directory which contained the file before rename is useless.
>
>>
>> I am wondering is there some more clever way to get this new name
>> (kernel is obviously aware of it, otherwise it couldn't notify
>> descriptor about rename)?
> The most correct way is to use sysctl kern.proc.filedesc and look
> for the path of the given file descriptor. This is inefficient since
> kern.proc.filedesc returns information about all opened files for the
> process.
>
> If somebody cares about this, she should implement e.g. sysctl
> kern.proc.onefd which takes both pid and filedescriptor, to return
> single fileinfo structure for given file descriptor.
>

Thanks, kern.proc.filedesc is super-efficient compared to what I had in 
mind. I assume right way to use it would be through kinfo_getfile(3).


More information about the freebsd-hackers mailing list