Skip to content

Commit dd7409d

Browse files
aescolarDashingR
authored andcommitted
Revert "fdtable: read, write, close: only execute methods if non-NULL"
This reverts commit a9a909c. PR zephyrproject-rtos#73978 introduced a regression. Unfortunately this PR cannot be reverted without reverting also Let's revert both PRs to stabilize main again towards the 3.7 release. For more details on the issue see zephyrproject-rtos#75205 Signed-off-by: Alberto Escolar Piedras <[email protected]>
1 parent 7acffba commit dd7409d

File tree

1 file changed

+39
-33
lines changed

1 file changed

+39
-33
lines changed

lib/os/fdtable.c

+39-33
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ int zvfs_alloc_fd(void *obj, const struct fd_op_vtable *vtable)
301301
return fd;
302302
}
303303

304-
static ssize_t zvfs_rw(int fd, void *buf, size_t sz, bool is_write)
304+
ssize_t zvfs_read(int fd, void *buf, size_t sz)
305305
{
306306
ssize_t res;
307307

@@ -310,57 +310,63 @@ static ssize_t zvfs_rw(int fd, void *buf, size_t sz, bool is_write)
310310
}
311311

312312
(void)k_mutex_lock(&fdtable[fd].lock, K_FOREVER);
313-
314-
if (is_write) {
315-
if (fdtable[fd].vtable->write_offset == NULL) {
316-
res = -1;
317-
errno = EIO;
318-
} else {
319-
res = fdtable[fd].vtable->write_offset(fdtable[fd].obj, buf, sz,
320-
fdtable[fd].offset);
321-
}
322-
} else {
323-
if (fdtable[fd].vtable->read == NULL) {
324-
res = -1;
325-
errno = EIO;
326-
} else {
327-
res = fdtable[fd].vtable->read_offset(fdtable[fd].obj, buf, sz,
328-
fdtable[fd].offset);
329-
}
330-
}
313+
res = fdtable[fd].vtable->read_offs(fdtable[fd].obj, buf, sz, fdtable[fd].offset);
331314
if (res > 0) {
332-
fdtable[fd].offset += res;
315+
switch (fdtable[fd].mode & ZVFS_MODE_IFMT) {
316+
case ZVFS_MODE_IFDIR:
317+
case ZVFS_MODE_IFBLK:
318+
case ZVFS_MODE_IFSHM:
319+
case ZVFS_MODE_IFREG:
320+
fdtable[fd].offset += res;
321+
break;
322+
default:
323+
break;
324+
}
333325
}
334-
335-
unlock:
336326
k_mutex_unlock(&fdtable[fd].lock);
337327

338328
return res;
339329
}
340330

341-
ssize_t zvfs_read(int fd, void *buf, size_t sz)
342-
{
343-
return zvfs_rw(fd, buf, sz, false);
344-
}
345-
346331
ssize_t zvfs_write(int fd, const void *buf, size_t sz)
347332
{
348-
return zvfs_rw(fd, (void *)buf, sz, true);
333+
ssize_t res;
334+
335+
if (_check_fd(fd) < 0) {
336+
return -1;
337+
}
338+
339+
(void)k_mutex_lock(&fdtable[fd].lock, K_FOREVER);
340+
res = fdtable[fd].vtable->write_offs(fdtable[fd].obj, buf, sz, fdtable[fd].offset);
341+
if (res > 0) {
342+
switch (fdtable[fd].mode & ZVFS_MODE_IFMT) {
343+
case ZVFS_MODE_IFDIR:
344+
case ZVFS_MODE_IFBLK:
345+
case ZVFS_MODE_IFSHM:
346+
case ZVFS_MODE_IFREG:
347+
fdtable[fd].offset += res;
348+
break;
349+
default:
350+
break;
351+
}
352+
}
353+
k_mutex_unlock(&fdtable[fd].lock);
354+
355+
return res;
349356
}
350357

351358
int zvfs_close(int fd)
352359
{
353-
int res = 0;
360+
int res;
354361

355362
if (_check_fd(fd) < 0) {
356363
return -1;
357364
}
358365

359366
(void)k_mutex_lock(&fdtable[fd].lock, K_FOREVER);
360-
if (fdtable[fd].vtable->close != NULL) {
361-
/* close() is optional - e.g. stdinout_fd_op_vtable */
362-
res = fdtable[fd].vtable->close(fdtable[fd].obj);
363-
}
367+
368+
res = fdtable[fd].vtable->close(fdtable[fd].obj);
369+
364370
k_mutex_unlock(&fdtable[fd].lock);
365371

366372
zvfs_free_fd(fd);

0 commit comments

Comments
 (0)