[PATCH v2 003/113] treewide: add errno_set helper for returning positive error code in errno
Ahmad Fatoum
a.fatoum at pengutronix.de
Mon Mar 4 10:58:48 PST 2024
We have this sequence at multiple places: Check a return value for being
below zero and if so, turn it positive and store into errno.
Instead of opencoding it everywhere, add a helper to encapsulate this.
Signed-off-by: Ahmad Fatoum <a.fatoum at pengutronix.de>
---
fs/fs.c | 112 ++++++++++++------------------------------------
include/errno.h | 7 +++
lib/libfile.c | 15 +++----
lib/parameter.c | 22 ++++------
4 files changed, 48 insertions(+), 108 deletions(-)
diff --git a/fs/fs.c b/fs/fs.c
index 68e7873e9c54..4b64f6fcf1df 100644
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -365,10 +365,8 @@ int ftruncate(int fd, loff_t length)
return 0;
ret = fsdev_truncate(&f->fsdev->dev, f, length);
- if (ret) {
- errno = -ret;
- return ret;
- }
+ if (ret)
+ return errno_set(ret);
f->size = length;
f->f_inode->i_size = f->size;
@@ -391,9 +389,8 @@ int ioctl(int fd, int request, void *buf)
ret = fsdrv->ioctl(&f->fsdev->dev, f, request, buf);
else
ret = -ENOSYS;
- if (ret)
- errno = -ret;
- return ret;
+
+ return errno_set(ret);
}
static ssize_t __read(FILE *f, void *buf, size_t count)
@@ -419,9 +416,7 @@ static ssize_t __read(FILE *f, void *buf, size_t count)
ret = fsdrv->read(&f->fsdev->dev, f, buf, count);
out:
- if (ret < 0)
- errno = -ret;
- return ret;
+ return errno_set(ret);
}
ssize_t pread(int fd, void *buf, size_t count, loff_t offset)
@@ -490,9 +485,7 @@ static ssize_t __write(FILE *f, const void *buf, size_t count)
}
ret = fsdrv->write(&f->fsdev->dev, f, buf, count);
out:
- if (ret < 0)
- errno = -ret;
- return ret;
+ return errno_set(ret);
}
ssize_t pwrite(int fd, const void *buf, size_t count, loff_t offset)
@@ -544,10 +537,7 @@ int flush(int fd)
else
ret = 0;
- if (ret)
- errno = -ret;
-
- return ret;
+ return errno_set(ret);
}
loff_t lseek(int fd, loff_t offset, int whence)
@@ -597,8 +587,7 @@ loff_t lseek(int fd, loff_t offset, int whence)
return pos;
out:
- if (ret)
- errno = -ret;
+ errno_set(ret);
return -1;
}
@@ -629,10 +618,7 @@ int erase(int fd, loff_t count, loff_t offset)
else
ret = -ENOSYS;
- if (ret)
- errno = -ret;
-
- return ret;
+ return errno_set(ret);
}
EXPORT_SYMBOL(erase);
@@ -659,10 +645,7 @@ int protect(int fd, size_t count, loff_t offset, int prot)
else
ret = -ENOSYS;
- if (ret)
- errno = -ret;
-
- return ret;
+ return errno_set(ret);
}
EXPORT_SYMBOL(protect);
@@ -689,10 +672,7 @@ int discard_range(int fd, loff_t count, loff_t offset)
else
ret = -ENOSYS;
- if (ret)
- errno = -ret;
-
- return ret;
+ return errno_set(ret);
}
int protect_file(const char *file, int prot)
@@ -730,9 +710,7 @@ void *memmap(int fd, int flags)
else
ret = -EINVAL;
- if (ret)
- errno = -ret;
-
+ errno_set(ret);
return retp;
}
EXPORT_SYMBOL(memmap);
@@ -756,10 +734,7 @@ int close(int fd)
put_file(f);
- if (ret)
- errno = -ret;
-
- return ret;
+ return errno_set(ret);
}
EXPORT_SYMBOL(close);
@@ -2464,10 +2439,7 @@ int mkdir (const char *pathname, mode_t mode)
dput(dentry);
path_put(&path);
out:
- if (error)
- errno = -error;
-
- return error;
+ return errno_set(error);
}
EXPORT_SYMBOL(mkdir);
@@ -2519,10 +2491,7 @@ int rmdir (const char *pathname)
path_put(&path);
putname(name);
- if (error)
- errno = -error;
-
- return error;
+ return errno_set(error);
}
EXPORT_SYMBOL(rmdir);
@@ -2676,10 +2645,7 @@ int open(const char *pathname, int flags, ...)
out:
put_file(f);
out1:
-
- if (error)
- errno = -error;
- return error;
+ return errno_set(error);
}
EXPORT_SYMBOL(open);
@@ -2717,9 +2683,7 @@ int unlink(const char *pathname)
out_put:
path_put(&path);
out:
- if (ret)
- errno = -ret;
- return ret;
+ return errno_set(ret);
}
EXPORT_SYMBOL(unlink);
@@ -2746,10 +2710,7 @@ int symlink(const char *pathname, const char *newpath)
error = vfs_symlink(path.dentry->d_inode, dentry, pathname);
out:
- if (error)
- errno = -error;
-
- return error;
+ return errno_set(error);
}
EXPORT_SYMBOL(symlink);
@@ -2819,7 +2780,7 @@ DIR *opendir(const char *pathname)
out_put:
path_put(&path);
out:
- errno = -ret;
+ errno_set(ret);
return NULL;
}
@@ -2827,10 +2788,8 @@ EXPORT_SYMBOL(opendir);
int closedir(DIR *dir)
{
- if (!dir) {
- errno = EBADF;
- return -EBADF;
- }
+ if (!dir)
+ return errno_set(-EBADF);
release_dir(dir);
@@ -2876,10 +2835,7 @@ int readlink(const char *pathname, char *buf, size_t bufsiz)
out_put:
path_put(&path);
out:
- if (ret)
- errno = -ret;
-
- return ret;
+ return errno_set(ret);
}
EXPORT_SYMBOL(readlink);
@@ -2909,10 +2865,7 @@ static int stat_filename(const char *filename, struct stat *s, unsigned int flag
out_put:
path_put(&path);
out:
- if (ret)
- errno = -ret;
-
- return ret;
+ return errno_set(ret);
}
int stat(const char *filename, struct stat *s)
@@ -3000,9 +2953,7 @@ char *canonicalize_path(const char *pathname)
res = dpath(path.dentry, d_root);
out:
- if (ret)
- errno = -ret;
-
+ errno_set(ret);
return res;
}
@@ -3036,10 +2987,7 @@ int chdir(const char *pathname)
ret = 0;
out:
- if (ret)
- errno = -ret;
-
- return ret;
+ return errno_set(ret);
}
EXPORT_SYMBOL(chdir);
@@ -3234,9 +3182,7 @@ int mount(const char *device, const char *fsname, const char *pathname,
out:
path_put(&path);
- errno = -ret;
-
- return ret;
+ return errno_set(ret);
}
EXPORT_SYMBOL(mount);
@@ -3273,10 +3219,8 @@ int umount(const char *pathname)
}
}
- if (!fsdev) {
- errno = EFAULT;
- return -EFAULT;
- }
+ if (!fsdev)
+ return errno_set(-EFAULT);
return fsdev_umount(fsdev);
}
diff --git a/include/errno.h b/include/errno.h
index 6ec7af4d7e9f..12e526a0d7ed 100644
--- a/include/errno.h
+++ b/include/errno.h
@@ -10,4 +10,11 @@ extern int errno;
void perror(const char *s);
const char *strerror(int errnum);
+static inline int errno_set(int err)
+{
+ if (err < 0)
+ errno = -err;
+ return err;
+}
+
#endif /* __ERRNO_H */
diff --git a/lib/libfile.c b/lib/libfile.c
index 72a2fc79c721..185c7af721b5 100644
--- a/lib/libfile.c
+++ b/lib/libfile.c
@@ -33,10 +33,8 @@ int pwrite_full(int fd, const void *buf, size_t size, loff_t offset)
while (size) {
now = pwrite(fd, buf, size, offset);
- if (now == 0) {
- errno = ENOSPC;
- return -errno;
- }
+ if (now == 0)
+ return errno_set(-ENOSPC);
if (now < 0)
return now;
size -= now;
@@ -61,10 +59,8 @@ int write_full(int fd, const void *buf, size_t size)
while (size) {
now = write(fd, buf, size);
- if (now == 0) {
- errno = ENOSPC;
- return -errno;
- }
+ if (now == 0)
+ return errno_set(-ENOSPC);
if (now < 0)
return now;
size -= now;
@@ -240,8 +236,7 @@ int read_file_2(const char *filename, size_t *size, void **outbuf,
/* ensure wchar_t nul termination */
buf = calloc(ALIGN(read_size, 2) + 2, 1);
if (!buf) {
- ret = -ENOMEM;
- errno = ENOMEM;
+ ret = errno_set(-ENOMEM);
goto err_out;
}
diff --git a/lib/parameter.c b/lib/parameter.c
index dc80f3f85828..c587d10eabcc 100644
--- a/lib/parameter.c
+++ b/lib/parameter.c
@@ -90,28 +90,22 @@ int dev_set_param(struct device *dev, const char *name, const char *val)
struct param_d *param;
int ret;
- if (!dev) {
- errno = ENODEV;
- return -ENODEV;
- }
+ if (!dev)
+ return errno_set(-ENODEV);
param = get_param_by_name(dev, name);
- if (!param) {
- errno = EINVAL;
- return -EINVAL;
- }
+ if (!param)
+ return errno_set(-EINVAL);
- if (param->flags & PARAM_FLAG_RO) {
- errno = EACCES;
- return -EACCES;
- }
+ if (param->flags & PARAM_FLAG_RO)
+ return errno_set(-EACCES);
ret = param->set(dev, param, val);
if (ret)
- errno = -ret;
+ return errno_set(ret);
- return ret;
+ return 0;
}
/**
--
2.39.2
More information about the barebox
mailing list