#include <poll.h>
#include <sys/stat.h>
#include <sys/types.h>
+#include <sys/ioctl.h>
#include <lustre/lustreapi.h>
+#include <linux/lustre/lustre_ioctl.h>
static int chlg_dev_path(char *path, size_t path_len, const char *device)
int clp_fd;
/* Changelog delivery mode */
enum changelog_send_flag clp_send_flags;
+ /* Changelog extra flags */
+ enum changelog_send_extra_flag clp_send_extra_flags;
/* Available bytes in buffer */
size_t clp_buf_len;
/* Current position in buffer */
struct changelog_private *cp;
static bool warned_extra_flags;
static bool warned_jobid;
- static bool warned_follow;
char cdev_path[PATH_MAX];
int rc;
warned_jobid = true;
}
- /* Behavior expected by CHANGELOG_FLAG_FOLLOW is not implemented, warn
- * the user and ignore it. */
- if (flags & CHANGELOG_FLAG_FOLLOW && !warned_follow) {
- llapi_err_noerrno(LLAPI_MSG_WARN, "warning: %s() called with "
- "CHANGELOG_FLAG_FOLLOW (ignored)", __func__);
- warned_follow = true;
+ if (flags & CHANGELOG_FLAG_FOLLOW) {
+ int rc;
+ rc = ioctl(cp->clp_fd, OBD_IOC_CHLG_POLL, 1);
+ if (rc < 0)
+ llapi_err_noerrno(LLAPI_MSG_ERROR, "can't enable "
+ "CHANGELOG_FLAG_FOLLOW");
}
return 0;
if (cp->clp_send_flags & CHANGELOG_FLAG_EXTRA_FLAGS) {
rec_fmt |= CLF_EXTRA_FLAGS;
+ if (cp->clp_send_extra_flags & CHANGELOG_EXTRA_FLAG_UIDGID)
+ rec_extra_fmt |= CLFE_UIDGID;
+ if (cp->clp_send_extra_flags & CHANGELOG_EXTRA_FLAG_NID)
+ rec_extra_fmt |= CLFE_NID;
+ if (cp->clp_send_extra_flags & CHANGELOG_EXTRA_FLAG_OMODE)
+ rec_extra_fmt |= CLFE_OPEN;
+ if (cp->clp_send_extra_flags & CHANGELOG_EXTRA_FLAG_XATTR)
+ rec_extra_fmt |= CLFE_XATTR;
}
if (cp->clp_buf + cp->clp_buf_len <= cp->clp_buf_pos) {
return 0;
}
+int llapi_changelog_in_buf(void *priv)
+{
+ struct changelog_private *cp = priv;
+ if (cp->clp_buf + cp->clp_buf_len > cp->clp_buf_pos)
+ return 1;
+ return 0;
+}
+
int llapi_changelog_clear(const char *mdtname, const char *idstr,
long long endrec)
{
close(fd);
return rc;
}
+
+/**
+ * Set extra flags for reading changelogs
+ *
+ * @param priv Opaque private control structure
+ * @param extra_flags Read extra flags (e.g. CHANGELOG_EXTRA_FLAG_UIDGID)
+ *
+ * Just call this function right after llapi_changelog_start().
+ */
+int llapi_changelog_set_xflags(void *priv,
+ enum changelog_send_extra_flag extra_flags)
+{
+ struct changelog_private *cp = priv;
+ static bool warned_uidgid;
+
+ if (!cp || cp->clp_magic != CHANGELOG_PRIV_MAGIC)
+ return -EINVAL;
+
+ cp->clp_send_extra_flags = extra_flags;
+
+ /* CHANGELOG_EXTRA_FLAG_UIDGID will eventually become mandatory.
+ * If it wasn't specified, display a warning here.
+ * Code elsewhere will remove the corresponding extension.
+ */
+ if (!(extra_flags & CHANGELOG_EXTRA_FLAG_UIDGID) && !warned_uidgid) {
+ llapi_err_noerrno(LLAPI_MSG_WARN,
+ "warning: %s() called without CHANGELOG_EXTRA_FLAG_UIDGID",
+ __func__);
+ warned_uidgid = true;
+ }
+
+ return 0;
+}