From 8320394725180b76e76f36b8a513f3c7bf11e65c Mon Sep 17 00:00:00 2001 From: James Simmons Date: Tue, 19 Sep 2023 09:40:24 -0400 Subject: [PATCH] LU-13308 mdc: support additional flags for OBD_IOC_CHLG_POLL ioctl Currently the mdc kernel code expects the flag argument for OBD_IOC_CHLG_POLL ioctl to only be CHANGELOG_FLAG_FOLLOW. With IPv6 we need to send a request to the kernel to present the NID in the struct lnet_nid format since we can't just send large NIDs to user land if we are using older tools. With the newer user land tools we will be sending an expanded flag which the current kernel changelog code can't handle. Rework the code to support the new flag if we end up with the case of newer user land tools and an older kernel. This code will also maintain backwards compatiblity with the older user land tools. Change-Id: I26a80d30ce2ebf2075a2a8f510ff81d6b0b8d848 Signed-off-by: James Simmons Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/52361 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Etienne AUJAMES Reviewed-by: Oleg Drokin --- lustre/include/uapi/linux/lustre/lustre_ioctl.h | 4 +++- lustre/mdc/mdc_changelog.c | 9 +++++---- lustre/utils/liblustreapi_chlg.c | 4 +++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/lustre/include/uapi/linux/lustre/lustre_ioctl.h b/lustre/include/uapi/linux/lustre/lustre_ioctl.h index 5b05816..a5a43f6 100644 --- a/lustre/include/uapi/linux/lustre/lustre_ioctl.h +++ b/lustre/include/uapi/linux/lustre/lustre_ioctl.h @@ -198,7 +198,9 @@ enum obd_abort_recovery_flags { #define OBD_IOC_START_LFSCK _IOWR('f', 230, OBD_IOC_DATA_TYPE) #define OBD_IOC_STOP_LFSCK _IOW('f', 231, OBD_IOC_DATA_TYPE) #define OBD_IOC_QUERY_LFSCK _IOR('f', 232, struct obd_ioctl_data) -#define OBD_IOC_CHLG_POLL _IOR('f', 233, long) +#define OBD_IOC_CHLG_SET_FLAGS _IOR('f', 233, long) +/* for compatibility issues with old apps */ +#define OBD_IOC_CHLG_POLL OBD_IOC_CHLG_SET_FLAGS /* lustre/lustre_user.h 240-253 */ #endif /* _UAPI_LUSTRE_IOCTL_H */ diff --git a/lustre/mdc/mdc_changelog.c b/lustre/mdc/mdc_changelog.c index c3a65f0..d164234 100644 --- a/lustre/mdc/mdc_changelog.c +++ b/lustre/mdc/mdc_changelog.c @@ -97,7 +97,7 @@ struct chlg_reader_state { struct list_head crs_rec_queue; unsigned int crs_last_catidx; unsigned int crs_last_idx; - bool crs_poll; + unsigned int crs_flags; }; struct chlg_rec_entry { @@ -340,7 +340,8 @@ again: CERROR("%s: fail to process llog: rc = %d\n", obd->obd_name, rc); GOTO(err_out, rc); } - if (!kthread_should_stop() && crs->crs_poll) { + if (!kthread_should_stop() && + (crs->crs_flags & CHANGELOG_FLAG_FOLLOW)) { llog_cat_close(NULL, llh); llog_ctxt_put(ctx); class_decref(obd, "changelog", crs); @@ -707,14 +708,14 @@ static unsigned int chlg_poll(struct file *file, poll_table *wait) return mask; } -static long chlg_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +static long chlg_ioctl(struct file *file, unsigned int cmd, unsigned long flags) { int rc; struct chlg_reader_state *crs = file->private_data; switch (cmd) { case OBD_IOC_CHLG_POLL: - crs->crs_poll = !!arg; + crs->crs_flags = flags; rc = 0; break; default: diff --git a/lustre/utils/liblustreapi_chlg.c b/lustre/utils/liblustreapi_chlg.c index 9c14252..31b291c 100644 --- a/lustre/utils/liblustreapi_chlg.c +++ b/lustre/utils/liblustreapi_chlg.c @@ -153,7 +153,9 @@ int llapi_changelog_start(void **priv, enum changelog_send_flag flags, if (flags & CHANGELOG_FLAG_FOLLOW) { int rc; - rc = ioctl(cp->clp_fd, OBD_IOC_CHLG_POLL, 1); + + rc = ioctl(cp->clp_fd, OBD_IOC_CHLG_SET_FLAGS, + CHANGELOG_FLAG_FOLLOW); if (rc < 0) llapi_err_noerrno(LLAPI_MSG_ERROR, "can't enable " "CHANGELOG_FLAG_FOLLOW"); -- 1.8.3.1