[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