Thanks for the suggestion Steve; I took a look before posting and didn't find anything there. However, I did stumble across this:
http://www.issociate.de/board/post/507535/devfs_Gpio_and_interrupt.html
This person was having the same problem and added a read() just before the poll() to fix it. It worked for me as well. Here's the new code:

#include <stdio.h>       /* For printf() */
#include <string.h>      /* For strerror() */
#include <unistd.h>      /* For read(), close() */
#include <fcntl.h>       /* For open() */
#include <errno.h>       /* For errno */
#include <sys/poll.h>    /* For poll() */

#define ERREXIT(str) {printf("err %s, %s\n", str, strerror(errno)); return -1;}

int main(int argc, char** argv)
{
  struct pollfd xfds[1];
  const char *fn;
  char buf[4];
  int rc;
  int fd;
     
  /* export */
  fn = "/sys/class/gpio/export";
  fd = open(fn, O_WRONLY); if(fd < 0)  ERREXIT("open export")
  rc = write(fd, "14", 3); if(rc != 3) ERREXIT("write export")
  close(fd);

  /* direction */
  fn = "/sys/class/gpio/gpio14/direction";
  fd = open(fn, O_RDWR);  if(fd < 0)  ERREXIT("open direction")
  rc = write(fd, "in", 3);if(rc != 3) ERREXIT("write direction")
  close(fd);

  /* edge */
  fn = "/sys/class/gpio/gpio14/edge";
  fd = open(fn, O_RDWR);        if(fd < 0)  ERREXIT("open edge")
  rc = write(fd, "falling", 8); if(rc != 8) ERREXIT("write edge")
  rc = lseek(fd, 0, SEEK_SET);  if(rc < 0)  ERREXIT("lseek edge")
  rc = read(fd, buf, 10);       if(rc <= 0) ERREXIT("read edge")
  buf[rc] = '\0';
  printf("read gpio14/edge:%s", buf);
  close(fd);
 
  /* open the 'value' file */
  fn = "/sys/class/gpio/gpio14/value";
  fd = open(fn, O_RDWR);  if(fd < 0)  ERREXIT("open value")
 
  // Must do a read() before the poll()...
  rc = read(fd, buf, 2);       if (rc != 2) ERREXIT("read value") 

  // poll()
  xfds[0].fd       = fd;
  xfds[0].events   = POLLPRI | POLLERR;
  xfds[0].revents  = 0;
  printf("Waiting for interrupt..\n");
  rc = poll(xfds, 1, 10000); if(rc == -1) ERREXIT("poll value")
  printf("poll rc=%d, revents=0x%x\n", rc, xfds[0].revents);

  /* get value */
  rc = lseek(fd, 0, SEEK_SET); if (rc < 0)  ERREXIT("lseek value")
  rc = read(fd, buf, 2);       if (rc < 0) ERREXIT("read value")
  close(fd);
  buf[rc] = '\0';
  printf("read rc=%d, val=%s\n", rc, buf);

  /* unexport */
  fn = "/sys/class/gpio/unexport";
  fd = open(fn, O_WRONLY); if(fd < 0)  ERREXIT("open unexport")
  rc = write(fd, "14", 3); if(rc != 3) ERREXIT("write unexport")
  close(fd);
 
  return 0;
}

Running this gives:
root@overo:~# ./irquser
read gpio14/edge:falling
Waiting for interrupt..
<pause; user presses GPIO14 button at this point...>
poll rc=1, revents=0xa
read rc=2, val=0

root@overo:~#

On 2011-11-18 11:39 AM, Steve Sakoman wrote:
Since this uses the generic OMAP gpio driver support you might have a
better chance of getting a good answer by sending this to the
linux-omap mailing list too!

Steve