Author: jkim
Date: Sat Feb 20 00:19:21 2010
New Revision: 204105
URL: http://svn.freebsd.org/changeset/base/204105

Log:
  Return partially filled buffer for non-blocking read(2)
  in non-immediate mode.
  
  PR:           kern/143855

Modified:
  head/sys/net/bpf.c

Modified: head/sys/net/bpf.c
==============================================================================
--- head/sys/net/bpf.c  Sat Feb 20 00:16:44 2010        (r204104)
+++ head/sys/net/bpf.c  Sat Feb 20 00:19:21 2010        (r204105)
@@ -664,8 +664,9 @@ static      int
 bpfread(struct cdev *dev, struct uio *uio, int ioflag)
 {
        struct bpf_d *d;
-       int timed_out;
        int error;
+       int non_block;
+       int timed_out;
 
        error = devfs_get_cdevpriv((void **)&d);
        if (error != 0)
@@ -678,6 +679,8 @@ bpfread(struct cdev *dev, struct uio *ui
        if (uio->uio_resid != d->bd_bufsize)
                return (EINVAL);
 
+       non_block = ((ioflag & O_NONBLOCK) != 0);
+
        BPFD_LOCK(d);
        d->bd_pid = curthread->td_proc->p_pid;
        if (d->bd_bufmode != BPF_BUFMODE_BUFFER) {
@@ -694,14 +697,20 @@ bpfread(struct cdev *dev, struct uio *ui
         * have arrived to fill the store buffer.
         */
        while (d->bd_hbuf == NULL) {
-               if ((d->bd_immediate || timed_out) && d->bd_slen != 0) {
+               if (d->bd_slen != 0) {
                        /*
                         * A packet(s) either arrived since the previous
                         * read or arrived while we were asleep.
-                        * Rotate the buffers and return what's here.
                         */
-                       ROTATE_BUFFERS(d);
-                       break;
+                       if (d->bd_immediate || non_block || timed_out) {
+                               /*
+                                * Rotate the buffers and return what's here
+                                * if we are in immediate mode, non-blocking
+                                * flag is set, or this descriptor timed out.
+                                */
+                               ROTATE_BUFFERS(d);
+                               break;
+                       }
                }
 
                /*
@@ -715,7 +724,7 @@ bpfread(struct cdev *dev, struct uio *ui
                        return (ENXIO);
                }
 
-               if (ioflag & O_NONBLOCK) {
+               if (non_block) {
                        BPFD_UNLOCK(d);
                        return (EWOULDBLOCK);
                }
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to