fs: Run the default action of FIONBIO/FIOCLEX/FIONCLEX in success path

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
This commit is contained in:
Xiang Xiao 2022-08-30 13:46:46 +08:00 committed by archer
parent 4df8b16060
commit 9726be616a
3 changed files with 28 additions and 38 deletions

View File

@ -757,16 +757,9 @@ static int pty_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
case FIONBIO: case FIONBIO:
{ {
ret = file_ioctl(&dev->pd_src, cmd, arg); ret = file_ioctl(&dev->pd_src, cmd, arg);
if (ret >= 0 || ret == -ENOTTY)
{
ret = file_ioctl(&dev->pd_sink, cmd, arg);
}
/* Let the default handler set O_NONBLOCK flags for us. */
if (ret >= 0) if (ret >= 0)
{ {
ret = -ENOTTY; ret = file_ioctl(&dev->pd_sink, cmd, arg);
} }
} }
break; break;

View File

@ -67,45 +67,43 @@ int file_vioctl(FAR struct file *filep, int req, va_list ap)
ret = inode->u.i_ops->ioctl(filep, req, arg); ret = inode->u.i_ops->ioctl(filep, req, arg);
} }
/* Check for File system IOCTL commands that can be implemented via
* fcntl()
*/
if (ret != -ENOTTY)
{
return ret;
}
switch (req) switch (req)
{ {
case FIONBIO: case FIONBIO:
{ if (ret == OK || ret == -ENOTTY)
FAR int *nonblock = (FAR int *)(uintptr_t)arg; {
if (nonblock && *nonblock) FAR int *nonblock = (FAR int *)(uintptr_t)arg;
{ if (nonblock && *nonblock)
filep->f_oflags |= O_NONBLOCK; {
} filep->f_oflags |= O_NONBLOCK;
else }
{ else
filep->f_oflags &= ~O_NONBLOCK; {
} filep->f_oflags &= ~O_NONBLOCK;
}
ret = OK; ret = OK;
} }
break; break;
case FIOCLEX: case FIOCLEX:
filep->f_oflags |= O_CLOEXEC; if (ret == OK || ret == -ENOTTY)
ret = OK; {
filep->f_oflags |= O_CLOEXEC;
ret = OK;
}
break; break;
case FIONCLEX: case FIONCLEX:
filep->f_oflags &= ~O_CLOEXEC; if (ret == OK || ret == -ENOTTY)
ret = OK; {
filep->f_oflags &= ~O_CLOEXEC;
ret = OK;
}
break; break;
case FIOC_FILEPATH: case FIOC_FILEPATH:
if (!INODE_IS_MOUNTPT(inode)) if (ret == -ENOTTY && !INODE_IS_MOUNTPT(inode))
{ {
ret = inode_getpath(inode, (FAR char *)(uintptr_t)arg); ret = inode_getpath(inode, (FAR char *)(uintptr_t)arg);
} }
@ -113,7 +111,8 @@ int file_vioctl(FAR struct file *filep, int req, va_list ap)
#ifndef CONFIG_DISABLE_MOUNTPOINT #ifndef CONFIG_DISABLE_MOUNTPOINT
case BIOC_BLKSSZGET: case BIOC_BLKSSZGET:
if (inode->u.i_ops != NULL && inode->u.i_ops->ioctl != NULL) if (ret == -ENOTTY && inode->u.i_ops != NULL &&
inode->u.i_ops->ioctl != NULL)
{ {
struct geometry geo; struct geometry geo;
ret = inode->u.i_ops->ioctl(filep, BIOC_GEOMETRY, ret = inode->u.i_ops->ioctl(filep, BIOC_GEOMETRY,

View File

@ -1516,7 +1516,7 @@ static int netdev_rt_ioctl(FAR struct socket *psock, int cmd,
static int netdev_file_ioctl(FAR struct socket *psock, int cmd, static int netdev_file_ioctl(FAR struct socket *psock, int cmd,
unsigned long arg) unsigned long arg)
{ {
int ret; int ret = OK;
switch (cmd) switch (cmd)
{ {
@ -1545,8 +1545,6 @@ static int netdev_file_ioctl(FAR struct socket *psock, int cmd,
{ {
conn->s_flags &= ~_SF_NONBLOCK; conn->s_flags &= ~_SF_NONBLOCK;
} }
ret = -ENOTTY; /* let file_vioctl update f_oflags */
} }
else else
{ {