Commit 2a80fd0e authored by Adrian Hunter's avatar Adrian Hunter Committed by PvsNarasimha
Browse files

libperf: Add preadn()

mainline inclusion
from mainline-v5.19-rc1
commit 618ee783
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/IAU6ZD

Reference: https://github.com/torvalds/linux/commit/618ee7838e409513635320ca9c4c8d52c44f2dd0



--------------------------------

commit 618ee783 upstream

Add preadn() to provide pread() and readn() semantics.

Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/r/ab8918a4-7ac8-a37e-2e2c-28438c422d87@intel.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarTauqirAzam <mdtauqir.azamkausar@amd.com>
Signed-off-by: default avatarPvsNarasimha <PVS.NarasimhaRao@amd.com>
parent 41ceb2b4
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -9,4 +9,6 @@ extern unsigned int page_size;
ssize_t readn(int fd, void *buf, size_t n);
ssize_t writen(int fd, const void *buf, size_t n);

ssize_t preadn(int fd, void *buf, size_t n, off_t offs);

#endif /* __LIBPERF_INTERNAL_CPUMAP_H */
+20 −0
Original line number Diff line number Diff line
@@ -38,6 +38,26 @@ ssize_t readn(int fd, void *buf, size_t n)
	return ion(true, fd, buf, n);
}

ssize_t preadn(int fd, void *buf, size_t n, off_t offs)
{
	size_t left = n;

	while (left) {
		ssize_t ret = pread(fd, buf, left, offs);

		if (ret < 0 && errno == EINTR)
			continue;
		if (ret <= 0)
			return ret;

		left -= ret;
		buf  += ret;
		offs += ret;
	}

	return n;
}

/*
 * Write exactly 'n' bytes or return an error.
 */