X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Futils%2Fliblustreapi_chlg.c;h=fc83fa4e56b5a88f2433be764bd05dd7d8ad42cd;hb=a120bb13525727654713f008ffcaf0e3aec7cb65;hp=15f334cc0f06238c43440d634b344347aab127a6;hpb=08ffb6f1428fb0500e7befce5d50959658e768c6;p=fs%2Flustre-release.git diff --git a/lustre/utils/liblustreapi_chlg.c b/lustre/utils/liblustreapi_chlg.c index 15f334c..fc83fa4 100644 --- a/lustre/utils/liblustreapi_chlg.c +++ b/lustre/utils/liblustreapi_chlg.c @@ -36,8 +36,10 @@ #include #include #include +#include #include +#include static int chlg_dev_path(char *path, size_t path_len, const char *device) @@ -68,6 +70,8 @@ struct changelog_private { 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 */ @@ -91,7 +95,6 @@ int llapi_changelog_start(void **priv, enum changelog_send_flag flags, struct changelog_private *cp; static bool warned_extra_flags; static bool warned_jobid; - static bool warned_follow; char cdev_path[PATH_MAX]; int rc; @@ -148,12 +151,12 @@ int llapi_changelog_start(void **priv, enum changelog_send_flag flags, 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; @@ -243,6 +246,14 @@ int llapi_changelog_recv(void *priv, struct changelog_rec **rech) 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) { @@ -284,6 +295,14 @@ int llapi_changelog_free(struct changelog_rec **rech) 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) { @@ -328,3 +347,36 @@ out_close: 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; +}