From 79912bbbff1e5e841fa4c5bb698fc9dac27e4ec8 Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Wed, 24 Mar 2021 12:44:24 +0900 Subject: [PATCH 01/16] ARM: tizen_bcm2711_defconfig: Enable USB_PRINTER config Enable USB_PRINTER config to suppot USB printer device. Change-Id: Ic63797d93520e4bc50175c53c7e7328b55a0f724 Signed-off-by: Chanwoo Choi --- arch/arm/configs/tizen_bcm2711_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm/configs/tizen_bcm2711_defconfig b/arch/arm/configs/tizen_bcm2711_defconfig index 6e15072..d289dcc 100644 --- a/arch/arm/configs/tizen_bcm2711_defconfig +++ b/arch/arm/configs/tizen_bcm2711_defconfig @@ -357,6 +357,7 @@ CONFIG_USB_ANNOUNCE_NEW_DEVICES=y CONFIG_USB_XHCI_HCD=y CONFIG_USB_XHCI_PLATFORM=y CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=y CONFIG_USB_STORAGE=y CONFIG_USB_UAS=y CONFIG_USB_DWC2=y -- 2.7.4 From 16e7ccc97cea65fe98f25d008d0425563f93806c Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Wed, 24 Mar 2021 12:45:52 +0900 Subject: [PATCH 02/16] ARM64: tizen_bcm2711_defconfig: Enable USB_PRINTER config Enable USB_PRINTER config to suppot USB printer device. Change-Id: I2068a283928c8f3c85d5f31b25a13300cdc52783 Signed-off-by: Chanwoo Choi --- arch/arm64/configs/tizen_bcm2711_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/configs/tizen_bcm2711_defconfig b/arch/arm64/configs/tizen_bcm2711_defconfig index b53d3e3..2cdf050 100644 --- a/arch/arm64/configs/tizen_bcm2711_defconfig +++ b/arch/arm64/configs/tizen_bcm2711_defconfig @@ -346,6 +346,7 @@ CONFIG_USB_ANNOUNCE_NEW_DEVICES=y CONFIG_USB_XHCI_HCD=y CONFIG_USB_XHCI_PLATFORM=y CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=y CONFIG_USB_STORAGE=y CONFIG_USB_UAS=y CONFIG_USB_DWC2=y -- 2.7.4 From 231582f4b460b8a94ea77a93f58a450f1d9e114f Mon Sep 17 00:00:00 2001 From: Hoegeun Kwon Date: Tue, 30 Mar 2021 11:04:39 +0900 Subject: [PATCH 03/16] packaging: Change the kernel version of the spec file Change the kernel version to 5.10.25 Change-Id: Ibe698990fefa9e336212788089d7e2503726da88 Signed-off-by: Hoegeun Kwon --- packaging/linux-rpi4.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/linux-rpi4.spec b/packaging/linux-rpi4.spec index 9bb4c15..8a42ec1 100644 --- a/packaging/linux-rpi4.spec +++ b/packaging/linux-rpi4.spec @@ -12,7 +12,7 @@ Name: rpi4-linux-kernel Summary: The Linux Kernel for Raspberry Pi4 -Version: 5.4.50 +Version: 5.10.25 Release: 0 License: GPL-2.0 ExclusiveArch: %{arm} aarch64 -- 2.7.4 From 411b0d1264699f41a9877d7c219efd7167c5e07a Mon Sep 17 00:00:00 2001 From: Hoegeun Kwon Date: Thu, 1 Apr 2021 14:25:00 +0900 Subject: [PATCH 04/16] ARM: tizen_bcm2711_defconfig: Enable ARM_MODULE_PLTS config Fixes the problem of not loading kernel modules Change-Id: I3eeed53c510610b69e2ab8b6ddc09a5680fb54c9 Signed-off-by: Hoegeun Kwon Signed-off-by: Seung-Woo Kim --- arch/arm/configs/tizen_bcm2711_defconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/arch/arm/configs/tizen_bcm2711_defconfig b/arch/arm/configs/tizen_bcm2711_defconfig index d289dcc..cdd87318 100644 --- a/arch/arm/configs/tizen_bcm2711_defconfig +++ b/arch/arm/configs/tizen_bcm2711_defconfig @@ -34,7 +34,6 @@ CONFIG_ARM_LPAE=y # CONFIG_CACHE_L2X0 is not set CONFIG_SMP=y CONFIG_HIGHMEM=y -# CONFIG_ARM_MODULE_PLTS is not set CONFIG_UACCESS_WITH_MEMCPY=y # CONFIG_ATAGS is not set CONFIG_CMDLINE="console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait" -- 2.7.4 From db906a57d2688f51243967da3bb69da506c4808e Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C5=81ukasz=20Stelmach?= Date: Fri, 12 Feb 2021 18:41:09 +0100 Subject: [PATCH 05/16] logger: accept untagged log entries MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Add support for writing untagged log messages to /dev/log_* nodes. The logger shall accept untagget messages after setting the tag and the priority with appropriate ioctl() commands for particular file descriptors. Change-Id: I02bd7bfd843eaf316692413a48747009c42756f6 Signed-off-by: Łukasz Stelmach --- drivers/staging/android/logger.c | 364 +++++++++++++++++++++++++++++++++++---- drivers/staging/android/logger.h | 2 + 2 files changed, 331 insertions(+), 35 deletions(-) diff --git a/drivers/staging/android/logger.c b/drivers/staging/android/logger.c index 405160c..fb1c952 100644 --- a/drivers/staging/android/logger.c +++ b/drivers/staging/android/logger.c @@ -29,9 +29,10 @@ #include #include #include -#include "logger.h" +#include +#include -#include +#include "logger.h" /** * struct logger_log - represents a specific log, such as 'main' or 'radio' @@ -64,6 +65,27 @@ struct logger_log { static LIST_HEAD(log_list); /** + * struct log_writer - a logging device open for writing + * @log: The associated log + * @list: The associated entry in @logger_log's list + * @b_off: The current position in @buf + * @tag: A tag to be attached to messages + * @prio: Default message priority value + * @buff: Temporary space to assemble messages. + */ +struct logger_writer { + struct logger_log *log; + struct task_struct *owner; + struct task_struct *b_owner; + struct logger_entry b_header; + size_t b_off; + size_t tag_len; + char *tag; + int prio; + char *buffer; +}; + +/** * struct logger_reader - a logging device open for reading * @log: The associated log * @list: The associated entry in @logger_log's list @@ -104,12 +126,15 @@ static size_t logger_offset(struct logger_log *log, size_t n) */ static inline struct logger_log *file_get_log(struct file *file) { + struct logger_writer *writer = file->private_data; + if (file->f_mode & FMODE_READ) { struct logger_reader *reader = file->private_data; return reader->log; } - return file->private_data; + + return writer->log; } /* @@ -409,6 +434,125 @@ static void fix_up_readers(struct logger_log *log, size_t len) reader->r_off = get_next_entry(log, reader->r_off, len); } +static char *strnrchr(const char *s, size_t count, int c) +{ + const char *last = NULL; + if (!count) + return NULL; + do { + if (*s == (char)c) + last = s; + } while (--count && *s++); + return (char *)last; +} + +static struct file *replace_file(struct files_struct *files, + struct file *oldf, + struct file *newf) +{ + struct file *file = NULL; + struct fdtable *fdt; + unsigned int i; + + spin_lock(&files->file_lock); + fdt = files_fdtable(files); + for (i = 0; i < fdt->max_fds && file != oldf; i++) { + if (fdt->fd[i] == oldf) { + file = xchg(&fdt->fd[i], newf); + } + } + spin_unlock(&files->file_lock); + + if (file) + filp_close(file, files); + + return file; +} + +static struct file *make_new_file(struct file *file) +{ + struct logger_writer *writer = file->private_data; + struct logger_writer *nwriter; + struct file *nfile; + char *pbuf, *p; + + pbuf = kzalloc(PATH_MAX, GFP_KERNEL); + if (!pbuf) { + return ERR_PTR(-ENOMEM); + } + + p = file_path(file, pbuf, PATH_MAX); + if (!p) { + kfree(pbuf); + return ERR_PTR(-EFAULT); + } + + nfile = filp_open(p, O_WRONLY, 0); + kfree(pbuf); + if (!nfile) { + return ERR_PTR(-EFAULT); + } + + nwriter = nfile->private_data; + nwriter->prio = writer->prio; + nwriter->tag = kstrdup(writer->tag, GFP_KERNEL); + nwriter->tag_len = writer->tag_len; + + if (!replace_file(current->files, file, nfile)) { + filp_close(nfile, current->files); + return ERR_PTR(-EFAULT); + } + + return nfile; +} + +static void write_log_data(struct logger_log *log, + struct logger_entry *header, + struct logger_writer *writer, + size_t chunk_len) +{ + size_t len, w_off; + + /* header */ + len = min(sizeof(struct logger_entry), log->size - log->w_off); + memcpy(log->buffer + log->w_off, header, len); + memcpy(log->buffer, (char *)header + len, sizeof(struct logger_entry) - len); + w_off = logger_offset(log, log->w_off + sizeof(struct logger_entry)); + + /* priority */ + log->buffer[w_off] = (unsigned char)writer->prio; + w_off = logger_offset(log, w_off + 1); + + /* tag */ + len = min_t(size_t, writer->tag_len + 1, log->size - w_off); + memcpy(log->buffer + w_off, writer->tag, len); + memcpy(log->buffer, writer->tag + len, writer->tag_len + 1 - len); + w_off = logger_offset(log, w_off + writer->tag_len + 1); + + /* message */ + len = min(chunk_len, log->size - w_off); + memcpy(log->buffer + w_off, writer->buffer, chunk_len); + memcpy(log->buffer, writer->buffer + len, chunk_len - len); + log->w_off = logger_offset(log, w_off + chunk_len); +} + +static void flush_thread_data(struct file* file) +{ + struct logger_writer *writer = file->private_data; + struct logger_log *log = file_get_log(file); + size_t len, w_off, chunk_len = 0; + + chunk_len = writer->b_off + 1; + writer->b_header.len = chunk_len + writer->tag_len + 2; + + fix_up_readers(log, sizeof(struct logger_entry) + writer->b_header.len); + + write_log_data(log, &writer->b_header, writer, chunk_len); + + writer->b_off = 0; + writer->buffer[0] = '\0'; +} + /* * logger_write_iter - our write method, implementing support for write(), * writev(), and aio_write(). Writes are our fast path, and we try to optimize @@ -416,10 +560,16 @@ static void fix_up_readers(struct logger_log *log, size_t len) */ static ssize_t logger_write_iter(struct kiocb *iocb, struct iov_iter *from) { - struct logger_log *log = file_get_log(iocb->ki_filp); + struct file *file = iocb->ki_filp; + struct logger_writer *writer = file->private_data; + struct logger_log *log = file_get_log(file); struct logger_entry header; struct timespec64 now; size_t len, count, w_off; + bool from_stdio = false; + + if (writer->tag && writer->prio >= 2) + from_stdio = true; count = min_t(size_t, iov_iter_count(from), LOGGER_ENTRY_MAX_PAYLOAD); @@ -439,46 +589,120 @@ static ssize_t logger_write_iter(struct kiocb *iocb, struct iov_iter *from) mutex_lock(&log->mutex); - /* - * Fix up any readers, pulling them forward to the first readable - * entry after (what will be) the new write offset. We do this now - * because if we partially fail, we can end up with clobbered log - * entries that encroach on readable buffer. - */ - fix_up_readers(log, sizeof(struct logger_entry) + header.len); + /* Prepend messages from STDOUT and STDERR with a tag and prio */ + if (from_stdio) { + char *p; + size_t chunk_len = 0; + size_t max_payload = LOGGER_ENTRY_MAX_PAYLOAD - writer->tag_len - 2; - len = min(sizeof(header), log->size - log->w_off); - memcpy(log->buffer + log->w_off, &header, len); - memcpy(log->buffer, (char *)&header + len, sizeof(header) - len); + if (writer->owner != current->group_leader) { + struct file *nfile; - /* Work with a copy until we are ready to commit the whole entry */ - w_off = logger_offset(log, log->w_off + sizeof(struct logger_entry)); + nfile = make_new_file(file); + if (IS_ERR(nfile)) { + mutex_unlock(&log->mutex); + return PTR_ERR(nfile); + } + + file = nfile; + writer = file->private_data; + } + + /* Allocate STDIO line buffer */ + if (!writer->buffer) { + writer->buffer = kzalloc(LOGGER_ENTRY_MAX_PAYLOAD, GFP_KERNEL); + writer->b_off = 0; + + if (!writer->buffer) { + mutex_unlock(&log->mutex); + return -ENOMEM; + } + } + + /* flush message from a different thread */ + if (writer->b_owner != current && writer->b_off) + flush_thread_data(file); + + count = min_t(size_t, iov_iter_count(from), max_payload - 1); + + do { + + if (copy_from_iter(writer->buffer + writer->b_off, count, from) != count) { + mutex_unlock(&log->mutex); + return -EFAULT; + } - len = min(count, log->size - w_off); + /* TODO: replace NULL characters with new lines */ + p = strnrchr(writer->buffer + writer->b_off, count, '\n'); + if (p) { + *p++ = '\0'; + chunk_len = p - writer->buffer; + } else { + writer->buffer[count++] = '\0'; + chunk_len = count; + } + + header.len = chunk_len + writer->tag_len + 2; + fix_up_readers(log, sizeof(struct logger_entry) + header.len); + + write_log_data(log, &header, writer, chunk_len); + + /* move the remaining part of the message */ + memmove(writer->buffer, p, writer->b_off + count - chunk_len); + + /* new b_off points where the rimainder of the string ends */ + writer->b_off = writer->b_off + count - chunk_len; + writer->buffer[writer->b_off] = '\0'; + + } while ((count = min_t(size_t, iov_iter_count(from), max_payload - 1))); + + /* save for remaining unfinished line */ + writer->b_header = header; + writer->b_owner = current; + } else { - if (copy_from_iter(log->buffer + w_off, len, from) != len) { /* - * Note that by not updating log->w_off, this abandons the - * portion of the new entry that *was* successfully - * copied, just above. This is intentional to avoid - * message corruption from missing fragments. + * Fix up any readers, pulling them forward to the first readable + * entry after (what will be) the new write offset. We do this now + * because if we partially fail, we can end up with clobbered log + * entries that encroach on readable buffer. */ - mutex_unlock(&log->mutex); - return -EFAULT; - } + fix_up_readers(log, sizeof(struct logger_entry) + header.len); - if (copy_from_iter(log->buffer, count - len, from) != count - len) { - mutex_unlock(&log->mutex); - return -EFAULT; + len = min(sizeof(header), log->size - log->w_off); + memcpy(log->buffer + log->w_off, &header, len); + memcpy(log->buffer, (char *)&header + len, sizeof(header) - len); + + /* Work with a copy until we are ready to commit the whole entry */ + w_off = logger_offset(log, log->w_off + sizeof(struct logger_entry)); + + len = min(count, log->size - w_off); + + if (copy_from_iter(log->buffer + w_off, len, from) != len) { + /* + * Note that by not updating log->w_off, this abandons the + * portion of the new entry that *was* successfully + * copied, just above. This is intentional to avoid + * message corruption from missing fragments. + */ + mutex_unlock(&log->mutex); + return -EFAULT; + } + + if (copy_from_iter(log->buffer, count - len, from) != count - len) { + mutex_unlock(&log->mutex); + return -EFAULT; + } + + log->w_off = logger_offset(log, w_off + count); } - log->w_off = logger_offset(log, w_off + count); mutex_unlock(&log->mutex); /* wake up any blocked readers */ wake_up_interruptible(&log->wq); - return len; + return count; } static struct logger_log *get_log_from_minor(int minor) @@ -530,7 +754,16 @@ static int logger_open(struct inode *inode, struct file *file) file->private_data = reader; } else { - file->private_data = log; + struct logger_writer *writer; + + writer = kzalloc(sizeof(struct logger_writer), GFP_KERNEL); + if (!writer) + return -ENOMEM; + + writer->log = log; + writer->owner = current->group_leader; + + file->private_data = writer; } return 0; @@ -552,6 +785,12 @@ static int logger_release(struct inode *ignored, struct file *file) mutex_unlock(&log->mutex); kfree(reader); + } else { + struct logger_writer *writer = file->private_data; + + kfree(writer->tag); + kfree(writer->buffer); + kfree(writer); } return 0; @@ -606,10 +845,53 @@ static long logger_set_version(struct logger_reader *reader, void __user *arg) return 0; } +static long logger_set_prio(struct logger_writer *writer, void __user *arg) +{ + int prio; + + prio = (int)arg; + + if ((prio < 2) || (prio > 7)) + return -EINVAL; + + writer->prio = prio; + return 0; +} + +static long logger_set_tag(struct logger_writer *writer, void __user *arg) +{ + int len; + char *p, *q; + + if (copy_from_user(&len, arg, sizeof(int))) + return -EFAULT; + + arg += sizeof(int); + + + p = kzalloc(len, GFP_KERNEL); + if (!p) + return -ENOMEM; + + if (copy_from_user(p, arg, len)) { + kfree(p); + return -EFAULT; + } + p[len-1] = '\0'; + + q = writer->tag; + writer->tag = p; + writer->tag_len = len - 1; /* without NULL */ + kfree(q); + + return 0; +} + static long logger_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct logger_log *log = file_get_log(file); struct logger_reader *reader; + struct logger_writer *writer; long ret = -EINVAL; void __user *argp = (void __user *)arg; @@ -648,10 +930,6 @@ static long logger_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ret = 0; break; case LOGGER_FLUSH_LOG: - if (!(file->f_mode & FMODE_WRITE)) { - ret = -EBADF; - break; - } if (!(in_egroup_p(file_inode(file)->i_gid) || capable(CAP_SYSLOG))) { ret = -EPERM; @@ -678,6 +956,22 @@ static long logger_ioctl(struct file *file, unsigned int cmd, unsigned long arg) reader = file->private_data; ret = logger_set_version(reader, argp); break; + case LOGGER_SET_PRIO: /* 44552 */ + if (file->f_mode & FMODE_READ) { + ret = -EBADF; + break; + } + writer = file->private_data; + ret = logger_set_prio(writer, argp); + break; + case LOGGER_SET_TAG: /* 44551 */ + if (file->f_mode & FMODE_READ) { + ret = -EBADF; + break; + } + writer = file->private_data; + ret = logger_set_tag(writer, argp); + break; } mutex_unlock(&log->mutex); diff --git a/drivers/staging/android/logger.h b/drivers/staging/android/logger.h index 70af7d8..b11e48c 100644 --- a/drivers/staging/android/logger.h +++ b/drivers/staging/android/logger.h @@ -85,5 +85,7 @@ struct logger_entry { #define LOGGER_FLUSH_LOG _IO(__LOGGERIO, 4) /* flush log */ #define LOGGER_GET_VERSION _IO(__LOGGERIO, 5) /* abi version */ #define LOGGER_SET_VERSION _IO(__LOGGERIO, 6) /* abi version */ +#define LOGGER_SET_TAG _IO(__LOGGERIO, 7) /* stdio tag */ +#define LOGGER_SET_PRIO _IO(__LOGGERIO, 8) /* stdio priority */ #endif /* _LINUX_LOGGER_H */ -- 2.7.4 From 2de0459eef2e35a4b31be79b03f31161b564802c Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C5=81ukasz=20Stelmach?= Date: Mon, 15 Feb 2021 15:41:27 +0100 Subject: [PATCH 06/16] logger: testing tool for STDIO logger MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Change-Id: I029a7def836b317a4e059c7a56301e169910a830 Signed-off-by: Łukasz Stelmach --- tools/testing/selftests/logger/.gitignore | 1 + tools/testing/selftests/logger/Makefile | 24 +++++ tools/testing/selftests/logger/logger.c | 155 ++++++++++++++++++++++++++++++ 3 files changed, 180 insertions(+) create mode 100644 tools/testing/selftests/logger/.gitignore create mode 100644 tools/testing/selftests/logger/Makefile create mode 100644 tools/testing/selftests/logger/logger.c diff --git a/tools/testing/selftests/logger/.gitignore b/tools/testing/selftests/logger/.gitignore new file mode 100644 index 0000000..b1e5ec6 --- /dev/null +++ b/tools/testing/selftests/logger/.gitignore @@ -0,0 +1 @@ +logger-test diff --git a/tools/testing/selftests/logger/Makefile b/tools/testing/selftests/logger/Makefile new file mode 100644 index 0000000..02a9019 --- /dev/null +++ b/tools/testing/selftests/logger/Makefile @@ -0,0 +1,24 @@ +CFLAGS += -I../../../../usr/include/ +CFLAGS += -std=gnu99 +CFLAGS += -D_GNU_SOURCE +LDFLAGS = -pthread + +.PHONY: all clean + +include ../lib.mk + +TEST_CUSTOM_PROGS := $(OUTPUT)/logger-test +all: $(TEST_CUSTOM_PROGS) + +OBJS = \ + logger.o + +OBJS := $(patsubst %,$(OUTPUT)/%,$(OBJS)) + +$(TEST_CUSTOM_PROGS): $(OBJS) + $(CC) -o $(TEST_CUSTOM_PROGS) $(OBJS) $(LDFLAGS) + +$(OBJS): $(OUTPUT)/%.o: %.c + $(CC) -c $^ -o $@ $(CFLAGS) + +EXTRA_CLEAN := $(TEST_CUSTOM_PROGS) $(OBJS) diff --git a/tools/testing/selftests/logger/logger.c b/tools/testing/selftests/logger/logger.c new file mode 100644 index 0000000..0446e79 --- /dev/null +++ b/tools/testing/selftests/logger/logger.c @@ -0,0 +1,155 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define LOGGER_SET_VERSION 44550 +#define LOGGER_SET_TAG 44551 +#define LOGGER_SET_PRIO 44552 + +#define handle_error_en(en, msg) \ + do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0) + +#define BIT(nr) ((1UL) << (nr)) + +void *tstart(void *arg) +{ + int *fd = arg; + write(*fd, "child thread msg #1\nchild thread msg #2", 39); + return 0; +} + +int main(int ac, char *av[]) { + + char *device = "/dev/log_main"; + char *msg = "The Foo"; + char *tag = "stdio"; + int c, fd, s; + pid_t child; + pthread_t tid; + struct iovec vec[3]; + unsigned char prio = 4; + unsigned long test_mask = ~0UL; + + while (1) { + static struct option long_options[] = { + {"priority", required_argument, 0, 'p'}, + {"tag", required_argument, 0, 't'}, + {"test-mask", required_argument, 0, 'm'}, + {"device", required_argument, 0, 'd'}, + {0, 0, 0, 0} + }; + + c = getopt_long(ac, av, "p:t:m:d:", long_options, NULL); + if (c == -1) + break; + + switch (c) { + case 'p': + prio = (unsigned char) strtol(optarg, NULL, 10); + break; + case 't': + tag = strdup(optarg); + break; + case 'm': + test_mask = (unsigned char) strtol(optarg, NULL, 16); + break; + case 'd': + device = strdup(optarg); + break; + default: + exit(1); + } + } + + setlinebuf(stdout); + fd = open(device, O_WRONLY); + + if (ac >= 2) { + } + + if (ac == 3) { + } + + if (test_mask & BIT(0)) { + vec[0].iov_base = &prio; + vec[0].iov_len = 1; + vec[1].iov_base = tag; + vec[1].iov_len = strlen(tag) + 1; + vec[2].iov_base = msg; + vec[2].iov_len = strlen(msg) + 1; + + writev(fd, vec, 3); + if (test_mask & BIT(1)) { + msg = "line #1\nline #2"; + vec[2].iov_base = msg; + vec[2].iov_len = strlen(msg) + 1; + + writev(fd, vec, 3); + } + } + + ioctl(fd, LOGGER_SET_PRIO, prio); + ioctl(fd, LOGGER_SET_TAG, "\006\000\000\000stdio"); + + if (test_mask & BIT(2)) { + + write(fd, "The Foo From STDIO\n", 19); + + write(fd, "LINE #1\nLINE #2", 15); + write(fd, " CONTINUED\nONCE", 15); + write(fd, " AGAIN\n", 7); + } + + if (test_mask & BIT(3)) { + msg = malloc(8000); + if (!msg) + return 1; + + for (int i = 0; i < 8000; i++) + msg[i] = ' ' + (i % 96); + msg[7999] = '\n'; + write(fd, msg, 8000); + } + + if (test_mask & BIT(4)) { + child = fork(); + if (child < 0) { + return -1; + } else if (child == 0) { + sleep(1); + printf("child: %d\n", getpid()); + write(fd, "child 1\n", 8); + sleep(1); + write(fd, "child 2\n", 8); + close(fd); + return 0; + } + write(fd, "PARENT\n", 7); + printf("PARENT: %d\n", getpid()); + wait(&s); + } + + if (test_mask & BIT(5)) { + s = pthread_create(&tid, NULL, &tstart, &fd); + if (s != 0) + handle_error_en(s, "pthread_create"); + sleep(1); + write(fd, "PARENT THREAD\n", 14); + + s = pthread_join(tid, NULL); + if (s != 0) + handle_error_en(s, "pthread_join"); + } + + return 0; +} -- 2.7.4 From 1dc277bb4c78ee9ff1e3da913b6815dd86d311b2 Mon Sep 17 00:00:00 2001 From: Seung-Woo Kim Date: Tue, 6 Apr 2021 16:56:45 +0900 Subject: [PATCH 07/16] staging: android: logger: remove build warnings Remove build warnings including unused variable and cast from pointer to integer of different size in 64bit. Change-Id: Id66e111364edb86d6bf74ae3b3414abd6e418a5e Fixes: commit db906a57d268 ("logger: accept untagged log entries") Signed-off-by: Seung-Woo Kim --- drivers/staging/android/logger.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/staging/android/logger.c b/drivers/staging/android/logger.c index fb1c952..c860dae 100644 --- a/drivers/staging/android/logger.c +++ b/drivers/staging/android/logger.c @@ -540,7 +540,7 @@ static void flush_thread_data(struct file* file) { struct logger_writer *writer = file->private_data; struct logger_log *log = file_get_log(file); - size_t len, w_off, chunk_len = 0; + size_t chunk_len = 0; chunk_len = writer->b_off + 1; writer->b_header.len = chunk_len + writer->tag_len + 2; @@ -849,7 +849,7 @@ static long logger_set_prio(struct logger_writer *writer, void __user *arg) { int prio; - prio = (int)arg; + prio = (int)(uintptr_t)arg; if ((prio < 2) || (prio > 7)) return -EINVAL; -- 2.7.4 From 9b864bde500915e3849c91460b9fd887c16fd0a1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C5=81ukasz=20Stelmach?= Date: Thu, 8 Apr 2021 14:09:24 +0200 Subject: [PATCH 08/16] logger: Fix incorrect buffer access when writing data MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Fix crash caused by accessing memory beyond log->buffer Change-Id: I528b62e34e9fb5f92f62f6b218718e15cd5f7d31 Signed-off-by: Łukasz Stelmach --- drivers/staging/android/logger.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/staging/android/logger.c b/drivers/staging/android/logger.c index c860dae..df9f246 100644 --- a/drivers/staging/android/logger.c +++ b/drivers/staging/android/logger.c @@ -531,7 +531,7 @@ static void write_log_data(struct logger_log *log, /* message */ len = min(chunk_len, log->size - w_off); - memcpy(log->buffer + w_off, writer->buffer, chunk_len); + memcpy(log->buffer + w_off, writer->buffer, len); memcpy(log->buffer, writer->buffer + len, chunk_len - len); log->w_off = logger_offset(log, w_off + chunk_len); } -- 2.7.4 From 92b8ecd866d5dda5e78974e048c195d3c1a763ef Mon Sep 17 00:00:00 2001 From: Dongwoo Lee Date: Mon, 12 Apr 2021 12:47:07 +0900 Subject: [PATCH 09/16] ARM64: tizen_bcm2711_defconfig: Enable security labels for f2fs To support smack on f2fs, this enables security label for f2fs filesystem. Change-Id: Idb151191387c762fb238d5ad0f78d2710cbc7674 Signed-off-by: Dongwoo Lee --- arch/arm64/configs/tizen_bcm2711_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/configs/tizen_bcm2711_defconfig b/arch/arm64/configs/tizen_bcm2711_defconfig index 2cdf050..07faa8a 100644 --- a/arch/arm64/configs/tizen_bcm2711_defconfig +++ b/arch/arm64/configs/tizen_bcm2711_defconfig @@ -412,6 +412,7 @@ CONFIG_EXT4_FS_SECURITY=y CONFIG_BTRFS_FS=y CONFIG_BTRFS_FS_POSIX_ACL=y CONFIG_F2FS_FS=y +CONFIG_F2FS_FS_SECURITY=y CONFIG_FANOTIFY=y CONFIG_AUTOFS4_FS=y CONFIG_FUSE_FS=y -- 2.7.4 From 400182c6489f6842df2657e218f7b790ab297d2b Mon Sep 17 00:00:00 2001 From: Dongwoo Lee Date: Mon, 12 Apr 2021 12:56:59 +0900 Subject: [PATCH 10/16] ARM: tizen_bcm2711_defconfig: Enable security labels for f2fs To support smack on f2fs, this enables security label for f2fs filesystem. Change-Id: I834d81cec7d861ab2fbfcaf58ad51688216f4b2d Signed-off-by: Dongwoo Lee --- arch/arm/configs/tizen_bcm2711_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm/configs/tizen_bcm2711_defconfig b/arch/arm/configs/tizen_bcm2711_defconfig index cdd87318..6dbadac 100644 --- a/arch/arm/configs/tizen_bcm2711_defconfig +++ b/arch/arm/configs/tizen_bcm2711_defconfig @@ -424,6 +424,7 @@ CONFIG_EXT4_FS_SECURITY=y CONFIG_BTRFS_FS=y CONFIG_BTRFS_FS_POSIX_ACL=y CONFIG_F2FS_FS=y +CONFIG_F2FS_FS_SECURITY=y CONFIG_FANOTIFY=y CONFIG_AUTOFS4_FS=y CONFIG_FUSE_FS=y -- 2.7.4 From bb3b5ab942590b5fe033bedb62bfbe1d42aa2204 Mon Sep 17 00:00:00 2001 From: Dongwoo Lee Date: Wed, 14 Apr 2021 11:52:25 +0900 Subject: [PATCH 11/16] f2fs: Change default mount options As adjusting mount options for increasing performance and reducing data move due to bggc, this changes default mount options about fsync mode and bggc algorithm as below: fsync_mode: from 'posix' to 'nobarrier' bggc_algorithm: from 'default' to 'atgc' Change-Id: I124ced2ef824832df280de74120612dc72167b36 Signed-off-by: Dongwoo Lee --- fs/f2fs/super.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 4fffbef..2c500f8 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -1666,7 +1666,7 @@ static void default_options(struct f2fs_sb_info *sbi) F2FS_OPTION(sbi).inline_xattr_size = DEFAULT_INLINE_XATTR_ADDRS; F2FS_OPTION(sbi).whint_mode = WHINT_MODE_OFF; F2FS_OPTION(sbi).alloc_mode = ALLOC_MODE_DEFAULT; - F2FS_OPTION(sbi).fsync_mode = FSYNC_MODE_POSIX; + F2FS_OPTION(sbi).fsync_mode = FSYNC_MODE_NOBARRIER; F2FS_OPTION(sbi).s_resuid = make_kuid(&init_user_ns, F2FS_DEF_RESUID); F2FS_OPTION(sbi).s_resgid = make_kgid(&init_user_ns, F2FS_DEF_RESGID); F2FS_OPTION(sbi).compress_algorithm = COMPRESS_LZ4; @@ -1681,6 +1681,7 @@ static void default_options(struct f2fs_sb_info *sbi) set_opt(sbi, INLINE_DENTRY); set_opt(sbi, EXTENT_CACHE); set_opt(sbi, NOHEAP); + set_opt(sbi, ATGC); clear_opt(sbi, DISABLE_CHECKPOINT); F2FS_OPTION(sbi).unusable_cap = 0; sbi->sb->s_flags |= SB_LAZYTIME; -- 2.7.4 From e3567a038caad88c3475371e5a60b95ac2988dff Mon Sep 17 00:00:00 2001 From: Jaehoon Chung Date: Fri, 16 Apr 2021 11:18:41 +0900 Subject: [PATCH 12/16] misc: tizen-inform-reboot: fix a potential NULL pointer dereference Fix a potential NULL pointer dereference. If there is no file or directory, it has to check whether it's error or not. Change-Id: Ia6e7280c1901ae772a5f890c312b7a741fbac0a1 Signed-off-by: Jaehoon Chung --- drivers/misc/tizen-inform-reboot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/misc/tizen-inform-reboot.c b/drivers/misc/tizen-inform-reboot.c index 386c1f6..02f82bb 100644 --- a/drivers/misc/tizen-inform-reboot.c +++ b/drivers/misc/tizen-inform-reboot.c @@ -29,7 +29,7 @@ static int inform_reboot_notifier(struct notifier_block *nb, set_fs(KERNEL_DS); file = filp_open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0644); - if (file) { + if (!IS_ERR(file)) { struct super_block *sb = file->f_path.dentry->d_sb; if (cmd) { -- 2.7.4 From 0739877a5d0a9c7052ba8f132defd4ef7cc6eb8a Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C5=81ukasz=20Stelmach?= Date: Fri, 9 Apr 2021 16:59:56 +0200 Subject: [PATCH 13/16] logger: adapt access mode checks MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Allow setting the tag and the priority only for files opened O_WRONLY. Change-Id: Icc9d7a8eb96f8f1b1aa00717aae1f32f7a2e52e4 Signed-off-by: Łukasz Stelmach --- drivers/staging/android/logger.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/staging/android/logger.c b/drivers/staging/android/logger.c index df9f246..e547e41 100644 --- a/drivers/staging/android/logger.c +++ b/drivers/staging/android/logger.c @@ -957,7 +957,8 @@ static long logger_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ret = logger_set_version(reader, argp); break; case LOGGER_SET_PRIO: /* 44552 */ - if (file->f_mode & FMODE_READ) { + if ((file->f_mode & FMODE_READ) || + !(file->f_mode & FMODE_WRITE)) { ret = -EBADF; break; } @@ -965,7 +966,8 @@ static long logger_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ret = logger_set_prio(writer, argp); break; case LOGGER_SET_TAG: /* 44551 */ - if (file->f_mode & FMODE_READ) { + if ((file->f_mode & FMODE_READ) || + !(file->f_mode & FMODE_WRITE)) { ret = -EBADF; break; } -- 2.7.4 From bc082072da8ddab83345c7fe85596fe0b1197cff Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C5=81ukasz=20Stelmach?= Date: Fri, 9 Apr 2021 17:20:07 +0200 Subject: [PATCH 14/16] logger: fix temporary buffer handling MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Prevent writing beyond temporary buffer and improve accumulation of data before receiving a newline character or filling the buffer. Change-Id: I8e0591c90914dbd4c2addde4247157831fa4843a Signed-off-by: Łukasz Stelmach --- drivers/staging/android/logger.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/drivers/staging/android/logger.c b/drivers/staging/android/logger.c index e547e41..197b9c5 100644 --- a/drivers/staging/android/logger.c +++ b/drivers/staging/android/logger.c @@ -593,6 +593,7 @@ static ssize_t logger_write_iter(struct kiocb *iocb, struct iov_iter *from) if (from_stdio) { char *p; size_t chunk_len = 0; + /* -2 : priority byte and tag terminating '\0' */ size_t max_payload = LOGGER_ENTRY_MAX_PAYLOAD - writer->tag_len - 2; if (writer->owner != current->group_leader) { @@ -623,7 +624,9 @@ static ssize_t logger_write_iter(struct kiocb *iocb, struct iov_iter *from) if (writer->b_owner != current && writer->b_off) flush_thread_data(file); - count = min_t(size_t, iov_iter_count(from), max_payload - 1); + /* -1 : leave space for message terminating '\0' */ + count = min_t(size_t, iov_iter_count(from), + max_payload - writer->b_off - 1); do { @@ -638,8 +641,16 @@ static ssize_t logger_write_iter(struct kiocb *iocb, struct iov_iter *from) *p++ = '\0'; chunk_len = p - writer->buffer; } else { - writer->buffer[count++] = '\0'; - chunk_len = count; + writer->buffer[writer->b_off + count++] = '\0'; + p = &writer->buffer[writer->b_off + count]; + chunk_len = p - writer->buffer; + + BUG_ON(chunk_len > max_payload); + if (chunk_len < max_payload ) { + writer->b_off = writer->b_off + count - 1; + continue; + } + } header.len = chunk_len + writer->tag_len + 2; -- 2.7.4 From 0bd63d18aa6237a40912ce2cdda7a358ebf87520 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C5=81ukasz=20Stelmach?= Date: Tue, 13 Apr 2021 12:24:38 +0200 Subject: [PATCH 15/16] logger: return amount of data written to stdio MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Return amount of data written by a process to a logger via STDIO interface. Change-Id: I9c77a312d09f3d796a7ec64d5909af193bcc8bc2 Signed-off-by: Łukasz Stelmach --- drivers/staging/android/logger.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/drivers/staging/android/logger.c b/drivers/staging/android/logger.c index 197b9c5..7983e57 100644 --- a/drivers/staging/android/logger.c +++ b/drivers/staging/android/logger.c @@ -592,7 +592,7 @@ static ssize_t logger_write_iter(struct kiocb *iocb, struct iov_iter *from) /* Prepend messages from STDOUT and STDERR with a tag and prio */ if (from_stdio) { char *p; - size_t chunk_len = 0; + size_t chunk_len = 0, c = 0; /* -2 : priority byte and tag terminating '\0' */ size_t max_payload = LOGGER_ENTRY_MAX_PAYLOAD - writer->tag_len - 2; @@ -624,30 +624,31 @@ static ssize_t logger_write_iter(struct kiocb *iocb, struct iov_iter *from) if (writer->b_owner != current && writer->b_off) flush_thread_data(file); + count = 0; /* -1 : leave space for message terminating '\0' */ - count = min_t(size_t, iov_iter_count(from), - max_payload - writer->b_off - 1); + c = min_t(size_t, iov_iter_count(from), + max_payload - writer->b_off - 1); do { - if (copy_from_iter(writer->buffer + writer->b_off, count, from) != count) { + if (copy_from_iter(writer->buffer + writer->b_off, c, from) != c) { mutex_unlock(&log->mutex); return -EFAULT; } - + count += c; /* TODO: replace NULL characters with new lines */ - p = strnrchr(writer->buffer + writer->b_off, count, '\n'); + p = strnrchr(writer->buffer + writer->b_off, c, '\n'); if (p) { *p++ = '\0'; chunk_len = p - writer->buffer; } else { - writer->buffer[writer->b_off + count++] = '\0'; - p = &writer->buffer[writer->b_off + count]; + writer->buffer[writer->b_off + c++] = '\0'; + p = &writer->buffer[writer->b_off + c]; chunk_len = p - writer->buffer; BUG_ON(chunk_len > max_payload); if (chunk_len < max_payload ) { - writer->b_off = writer->b_off + count - 1; + writer->b_off = writer->b_off + c - 1; continue; } @@ -659,13 +660,13 @@ static ssize_t logger_write_iter(struct kiocb *iocb, struct iov_iter *from) write_log_data(log, &header, writer, chunk_len); /* move the remaining part of the message */ - memmove(writer->buffer, p, writer->b_off + count - chunk_len); + memmove(writer->buffer, p, writer->b_off + c - chunk_len); /* new b_off points where the rimainder of the string ends */ - writer->b_off = writer->b_off + count - chunk_len; + writer->b_off = writer->b_off + c - chunk_len; writer->buffer[writer->b_off] = '\0'; - } while ((count = min_t(size_t, iov_iter_count(from), max_payload - 1))); + } while ((c = min_t(size_t, iov_iter_count(from), max_payload - 1))); /* save for remaining unfinished line */ writer->b_header = header; -- 2.7.4 From d1b9548884b766252263c82fbcb8b2579a9a21f9 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C5=81ukasz=20Stelmach?= Date: Fri, 19 Mar 2021 15:20:06 +0100 Subject: [PATCH 16/16] logger: move logger.h to uapi MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Move logger.h to uapi so it can be exported for userland software to use. Change-Id: I64dca69f3442edc246562485b0b29b43615ae881 Signed-off-by: Łukasz Stelmach --- drivers/staging/android/logger.c | 2 +- {drivers/staging/android => include/uapi/linux}/logger.h | 4 ++++ tools/testing/selftests/logger/logger.c | 5 +---- 3 files changed, 6 insertions(+), 5 deletions(-) rename {drivers/staging/android => include/uapi/linux}/logger.h (98%) diff --git a/drivers/staging/android/logger.c b/drivers/staging/android/logger.c index 7983e57..d7707b6 100644 --- a/drivers/staging/android/logger.c +++ b/drivers/staging/android/logger.c @@ -32,7 +32,7 @@ #include #include -#include "logger.h" +#include /** * struct logger_log - represents a specific log, such as 'main' or 'radio' diff --git a/drivers/staging/android/logger.h b/include/uapi/linux/logger.h similarity index 98% rename from drivers/staging/android/logger.h rename to include/uapi/linux/logger.h index b11e48c..a02ac117e 100644 --- a/drivers/staging/android/logger.h +++ b/include/uapi/linux/logger.h @@ -66,7 +66,11 @@ struct logger_entry { __s32 tid; __s32 sec; __s32 nsec; +#ifndef __KERNEL__ + __s32 euid; +#else kuid_t euid; +#endif char msg[0]; }; diff --git a/tools/testing/selftests/logger/logger.c b/tools/testing/selftests/logger/logger.c index 0446e79..5f0bd3b 100644 --- a/tools/testing/selftests/logger/logger.c +++ b/tools/testing/selftests/logger/logger.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -12,10 +13,6 @@ #include #include -#define LOGGER_SET_VERSION 44550 -#define LOGGER_SET_TAG 44551 -#define LOGGER_SET_PRIO 44552 - #define handle_error_en(en, msg) \ do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0) -- 2.7.4