VFS: fix select again
Change-Id: Ia5e26cdbfe38e3fb293dd57269a76b15c1fe236b
This commit is contained in:
parent
cb87646dac
commit
06e2adbeaa
2 changed files with 11 additions and 4 deletions
|
@ -190,10 +190,14 @@ int notouch /* check only */
|
||||||
int r = OK;
|
int r = OK;
|
||||||
|
|
||||||
/* Reads start at the beginning; writes append to pipes */
|
/* Reads start at the beginning; writes append to pipes */
|
||||||
if (rw_flag == READING)
|
if (notouch) /* In this case we don't actually care whether data transfer
|
||||||
|
* would succeed. See POSIX 1003.1-2008 */
|
||||||
pos = 0;
|
pos = 0;
|
||||||
else
|
else if (rw_flag == READING)
|
||||||
|
pos = 0;
|
||||||
|
else {
|
||||||
pos = vp->v_size;
|
pos = vp->v_size;
|
||||||
|
}
|
||||||
|
|
||||||
/* If reading, check for empty pipe. */
|
/* If reading, check for empty pipe. */
|
||||||
if (rw_flag == READING) {
|
if (rw_flag == READING) {
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "fs.h"
|
#include "fs.h"
|
||||||
|
#include <sys/fcntl.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <sys/select.h>
|
#include <sys/select.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
@ -452,7 +453,8 @@ static int select_request_pipe(struct filp *f, int *ops, int block)
|
||||||
|
|
||||||
if ((*ops & (SEL_RD|SEL_ERR))) {
|
if ((*ops & (SEL_RD|SEL_ERR))) {
|
||||||
/* Check if we can read 1 byte */
|
/* Check if we can read 1 byte */
|
||||||
err = pipe_check(f->filp_vno, READING, f->filp_flags, 1, 1 /* Check only */);
|
err = pipe_check(f->filp_vno, READING, f->filp_flags & ~O_NONBLOCK, 1,
|
||||||
|
1 /* Check only */);
|
||||||
|
|
||||||
if (err != SUSPEND)
|
if (err != SUSPEND)
|
||||||
r |= SEL_RD;
|
r |= SEL_RD;
|
||||||
|
@ -468,7 +470,8 @@ static int select_request_pipe(struct filp *f, int *ops, int block)
|
||||||
|
|
||||||
if ((*ops & (SEL_WR|SEL_ERR))) {
|
if ((*ops & (SEL_WR|SEL_ERR))) {
|
||||||
/* Check if we can write 1 byte */
|
/* Check if we can write 1 byte */
|
||||||
err = pipe_check(f->filp_vno, WRITING, f->filp_flags, 1, 1 /* Check only */);
|
err = pipe_check(f->filp_vno, WRITING, f->filp_flags & ~O_NONBLOCK, 1,
|
||||||
|
1 /* Check only */);
|
||||||
|
|
||||||
if (err != SUSPEND)
|
if (err != SUSPEND)
|
||||||
r |= SEL_WR;
|
r |= SEL_WR;
|
||||||
|
|
Loading…
Reference in a new issue