Bug#272683: dnotify doesn't work correctly on sparc64 with 32 bit programs

Sjoerd Simons sjoerd@spring.luon.net (Sjoerd Simons), 272683@bugs.debian.org
Sat, 22 Jan 2005 19:37:18 +0100


--liOOAslEiF7prFVr
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

reassign 272683 kernel-image-2.6.8-sparc
retittle 272683 dnotify doesn't work correctly on sparc64 with 32 bit programs
thanks,

Hi,

  It seems that dnotify doesn't work correctly on sparc64 for 32 bit programs.
  Causing filemonitoring libraries/programs like fam and gamin to fail

  Attached is a little testprogram, which is just the example given in the 
  kernel source with some extra debug info.

  When compiled as a 32bit program and changing something in the current
  dir (which is being watched):
    $ ./test
    Opened current dir as fd: 3
    Got event on fd=0

  Which is incorrect as it should have indicated that something changed at fd
  3.. When compiled as a 64bit program it works fine:
    $ ./test64
    Opened current dir as fd: 3
    Got event on fd=3

  Sjoerd
-- 
"Our vision is to speed up time, eventually eliminating it."
		-- Alex Schure

--liOOAslEiF7prFVr
Content-Type: text/x-csrc; charset=us-ascii
Content-Disposition: attachment; filename="test.c"

#define _GNU_SOURCE  /* needed to get the defines */
#include <fcntl.h>   /* in glibc 2.2 this has the needed
                  values defined */
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
   
static volatile int event_fd;
   
static void handler(int sig, siginfo_t *si, void *data) {
  event_fd = si->si_fd;
}
   
int main(void) {
  struct sigaction act;
  int fd;
      
  act.sa_sigaction = handler;
  sigemptyset(&act.sa_mask);
  act.sa_flags = SA_SIGINFO;
  sigaction(SIGRTMIN + 1, &act, NULL);
      
  fd = open(".", O_RDONLY);
  printf("Opened current dir as fd: %d\n", fd);
  fcntl(fd, F_SETSIG, SIGRTMIN + 1);
  fcntl(fd, F_NOTIFY, DN_MODIFY|DN_CREATE|DN_MULTISHOT);
  /* we will now be notified if any of the files
         in "." is modified or new files are created */
  while (1) {
    pause();
    printf("Got event on fd=%d\n", event_fd);
  }
}





--liOOAslEiF7prFVr--