Yes, on looking this, it turns out (to my surprise, actually) that
fop_create() is called on extant files (that is, when O_CREAT is set but
the file exists).  Unfortunately, there's not really an easy answer here;
it might be tempting to fire IN_CREATE on the VE_CREATE vnode event (rather
than the fop_create()), but this won't actually work because the VE_CREATE
vnode event fires on the new vnode, not on the directory (we need to
associate IN_CREATE with the directory to which the vnode is being added).
I can improve the situation somewhat by not firing IN_CREATE if we already
have a watch on the child (which means that we know that the file wasn't in
fact created), but this leads to the uncomfortable situation that two
different inotify consumers will see different event streams depending on
what they've already seen.  Beyond that, fixing this is going to require
some more invasive surgery; is this issue causing problems for you or is it
merely a curiosity?

        - Bryan


On Wed, Dec 10, 2014 at 10:58 AM, Youzhong Yang <[email protected]> wrote:

> Thanks Bryan. Indeed in the zone /opt/local/bin/touch is used.
>
> But I still see the issue:
>
> open(filename, O_WRONLY|O_NONBLOCK|O_CREAT|O_NOCTTY, 0666) is a file open
> operation and should result in no IN_CREATE event if the file exists
> (O_CREAT - Create the file if it does not exist).
>
> I used the following C program to test this file open behavior on Linux
> and SmartOS, as you can see, on SmartOS, it causes a IN_CREATE inotify
> event, while on Linux, it triggers nothing. This happens both in global
> zone and OS zone.
>
> I am confused.
>
> Thanks,
>
> --Youzhong
>
> -----------------------------------------------------------
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <fcntl.h>
> #include <stdio.h>
> #include <stdlib.h>
>
> int main(int argc, char *argv[])
> {
> int fd;
> char *filename;
>  if(argc > 1) {
> filename = argv[1];
> } else {
> printf("No filename specified!\n");
> exit(1);
> }
>  fd = open(filename, O_WRONLY|O_NONBLOCK|O_CREAT|O_NOCTTY, 0666);
> if(fd == -1) {
> perror("open");
> exit(1);
> }
> close(fd);
> return 0;
> }
>
>
> On Wed, Dec 10, 2014 at 1:05 PM, Bryan Cantrill <[email protected]>
> wrote:
>
>>
>> The touch differences can be explained by the touch(1) that you're using:
>>  in the global zone, you're using /usr/bin/touch, but in the non-global, I
>> imagine that you're using /opt/local/bin/touch.  These two implementations
>> differ, so not a huge surprise that their implementation details differ.
>>
>> As for FIONREAD: indeed, that seems screwed up -- it seems to be
>> returning the number of bytes instead of storing in in the specified
>> argument.  I'll get that fixed today...
>>
>>          - Bryan
>>
>>
>>
>> On Wed, Dec 10, 2014 at 8:00 AM, Youzhong Yang via smartos-discuss <
>> [email protected]> wrote:
>>
>>> Hello again,
>>>
>>> I downloaded smartos latest image (joyent_20141127T173954Z) and tested
>>> inotify using it.
>>>
>>> Two issues were observed:
>>>
>>> 1. ioctl(fd, FIONREAD, ...) does not work as expected. It does not
>>> return the number of bytes that are available to be read on an inotify
>>> instance.
>>>
>>> 2. In an OS zone, touching a file always generates an IN_CREATE event,
>>> even though the file already exists. This only happens in an OS zone, not
>>> in global zone.
>>>
>>> Attached is the test program I used for testing. Just compile and run
>>> it, then in another terminal window, 'touch /tmp/file' twice. Please look
>>> at the details at the end of this e-mail.
>>>
>>> Thanks,
>>>
>>> -Youzhong
>>>
>>> --- In global zone ---
>>> [root@batfs5999 /var/tmp]# ./inotify
>>> ioctl = 64, errno = 0, bufsize = 0
>>> got 48 bytes
>>>    :: mask 256
>>>    -> New file file created
>>>    :: mask 4
>>>    -> file ATTRIB
>>> ioctl = 32, errno = 0, bufsize = 0
>>> got 24 bytes
>>>    :: mask 4
>>>    -> file ATTRIB
>>>
>>> --- In OS zone ---
>>> [root@batfs5999-cifs0 /var/tmp]# ./inotify
>>> ioctl = 64, errno = 0, bufsize = 0
>>> got 48 bytes
>>>    :: mask 256
>>>    -> New file file created
>>>    :: mask 4
>>>    -> file ATTRIB
>>> ioctl = 64, errno = 0, bufsize = 0
>>> got 48 bytes
>>>    :: mask 256
>>>    -> New file file created
>>>    :: mask 4
>>>    -> file ATTRIB
>>>
>>> --- On Linux  ---
>>> % ./inotify
>>> ioctl = 0, errno = 0, bufsize = 32
>>> got 32 bytes
>>>    :: mask 256
>>>    -> New file file created
>>> ioctl = 0, errno = 0, bufsize = 32
>>> got 32 bytes
>>>    :: mask 4
>>>    -> file ATTRIB
>>> ioctl = 0, errno = 0, bufsize = 32
>>> got 32 bytes
>>>    :: mask 4
>>>    -> file ATTRIB
>>>
>>> *smartos-discuss* | Archives
>>> <https://www.listbox.com/member/archive/184463/=now>
>>> <https://www.listbox.com/member/archive/rss/184463/21493597-819305a5> |
>>> Modify
>>> <https://www.listbox.com/member/?&;>
>>> Your Subscription <http://www.listbox.com>
>>>
>>
>>
>



-------------------------------------------
smartos-discuss
Archives: https://www.listbox.com/member/archive/184463/=now
RSS Feed: https://www.listbox.com/member/archive/rss/184463/25769125-55cfbc00
Modify Your Subscription: 
https://www.listbox.com/member/?member_id=25769125&id_secret=25769125-7688e9fb
Powered by Listbox: http://www.listbox.com

Reply via email to