LLAPI\_CHANGELOG\_START(3) Lustre Library Functions LLAPI\_CHANGELOG\_START(3)

# [NAME](#NAME)

llapi\_changelog\_start, llapi\_changelog\_start\_user, llapi\_changelog\_set\_xflags, llapi\_changelog\_fini - Initialize and clean a read instance for MDT changelogs

# [SYNOPSIS](#SYNOPSIS)

```
#include <lustre/lustreapi.h>
```

```
int llapi_changelog_start(void **priv, enum changelog_send_flag flags,
                          const char *device, long long startrec);
```

```
int llapi_changelog_start_user(void **priv, enum changelog_send_flag flags,
                               const char *device, const char *username,
                               __u64 mask, long long startrec);
```

```
int llapi_changelog_set_xflags(void *priv,
                               enum changelog_send_extra_flag extra_flags);
```

```
int llapi_changelog_fini(void **priv);
```

# [DESCRIPTION](#DESCRIPTION)

The function **llapi\_changelog\_start()** initializes a new instance *priv* to read MDT changelogs. It opens the changelog char device corresponding to the MDT's name given by *device* (e.g: "lustrefs-MDT0000").

A changelog starting point can be specified with *startrec* record number. **llapi\_changelog\_recv()** will get changelog records with numbers greater or equal than *startrec*. 0 value means that all records will be read.

Some options can be passed to **llapi\_changelog\_start()** with *flags* mask.

**enum changelog\_send\_flag** values:

```
	CHANGELOG_FLAG_FOLLOW
	CHANGELOG_FLAG_BLOCK
	CHANGELOG_FLAG_JOBID
	CHANGELOG_FLAG_EXTRA_FLAGS
```

[CHANGELOG\_FLAG\_FOLLOW](#CHANGELOG_FLAG_FOLLOW)

Use changelog follow mode: **llapi\_changelog\_recv()** will not return when all records have been read. Instead it will block until a new record is available. It avoids restarting an instance and re-scan for newer changelogs.

[CHANGELOG\_FLAG\_BLOCK](#CHANGELOG_FLAG_BLOCK)

Deprecated since Lustre 2.10.

[CHANGELOG\_FLAG\_JOBID](#CHANGELOG_FLAG_JOBID)

Pack jobid into the changelog records if available.

[CHANGELOG\_FLAG\_EXTRA\_FLAG](#CHANGELOG_FLAG_EXTRA_FLAG)

Pack additional flag bits into the changelog record.

The function **llapi\_changelog\_start\_user()** , similar to the function **llapi\_changelog\_start()** , initializes a new instance *priv* to read MDT changelogs, but with user-specific filtering, including username and mask.

The *username* parameter specifies the changelog username or ID, e.g. "cl1", "cl1-user", "1", or "user".

The *mask* parameter specifies the filtering mask in numeric form. If *mask* is 0, the user's registered *MASK* specified to [**lctl-changelog\_register**(8)](/man/enterprise-packages/lustre/lctl-changelog_register.8) will be used.

The function **llapi\_changelog\_set\_xflags()** specifies additional changelog flags with *extra\_flags* mask for the instance *priv*. To use those extra flags, CHANGELOG\_FLAG\_EXTRA\_FLAG must be set by **llapi\_changelog\_start()** on *flags* parameter.

**enum changelog\_send\_extra\_flag** values:

```
	CHANGELOG_EXTRA_FLAG_UIDGID
	CHANGELOG_EXTRA_FLAG_NID
	CHANGELOG_EXTRA_FLAG_OMODE
	CHANGELOG_EXTRA_FLAG_XATTR
```

[CHANGELOG\_EXTRA\_FLAG\_UIDGID](#CHANGELOG_EXTRA_FLAG_UIDGID)

Pack uid/gid into the changelog record

[CHANGELOG\_EXTRA\_FLAG\_NID](#CHANGELOG_EXTRA_FLAG_NID)

Pack nid into the changelog record

[CHANGELOG\_EXTRA\_FLAG\_OMODE](#CHANGELOG_EXTRA_FLAG_OMODE)

Pack open mode into the changelog record

[CHANGELOG\_EXTRA\_FLAG\_XATTR](#CHANGELOG_EXTRA_FLAG_XATTR)

Pack xattr name into the changelog record

The function **llapi\_changelog\_fini()** closes the MDT's changelog char device and free internal pointers for the instance *priv*.

# [RETURN VALUES](#RETURN_VALUES)

Return 0 on success or a negative errno value on failure.

# [ERRORS](#ERRORS)

-ENOMEM

Insufficient memory to complete operation.

-EINVAL

One or more invalid arguments are given.

-ENOENT

MDT's changelog char device not found. Is the Lustre FS mounted?

-EACCES

Not enough permissions to open the changelog char device. By default, the device is only accessible to the root user.

# [EXAMPLE](#EXAMPLE)

To register a user to watch file and directory creation and removal:

```


        char *mdd = "testfs-MDT0000";


        long long startrec = 0;


        char *name = "dirwatch";


        char *mask_str = "rmdir,mkdir,creat,unlnk";


        __u64 mask = CHANGELOG_DEFMASK;


        void *changelog_priv;


        struct changelog_rec *rec;


        /* convert mask string to numeric value */


        rc = llapi_convert_str2mask(mask_str, changelog_type2str, &mask,


                                CHANGELOG_MINMASK, CHANGELOG_ALLMASK,


                                CHANGELOG_DEFMASK);


        /* register a new Changelog consumer with a name and mask */


        rc = llapi_changelog_start_user(&changelog_priv,


                                CHANGELOG_FLAG_BLOCK | CHANGELOG_FLAG_EXTRA_FLAGS |


                                CHANGELOG_FLAG_NID_BE | CHANGELOG_FLAG_JOBID,


                                mdd, name, mask, startrec);


        rc = llapi_changelog_set_xflags(changelog_priv,


                                        CHANGELOG_EXTRA_FLAG_UIDGID |


                                        CHANGELOG_EXTRA_FLAG_NID |


                                        CHANGELOG_EXTRA_FLAG_OMODE |


                                        CHANGELOG_EXTRA_FLAG_XATTR);


        while ((rc = llapi_changelog_recv(changelog_priv, &rec)) == 0) {


                /* process changelog records */


                llapi_changelog_free(&rec);


        }


        llapi_changelog_fini(&changelog_priv);
```

# [AVAILABILITY](#AVAILABILITY)

**llapi\_changelog\_start()** and **llapi\_changelog\_fini()** are part of the [**lustre**(7)](/man/enterprise-packages/lustre/lustre.7) user application interface library since release 2.0.0, **llapi\_changelog\_set\_xflags()** since release 2.11.0, and **llapi\_changelog\_start\_user()** since release 2.18.0.

# [SEE ALSO](#SEE_ALSO)

[**lfs-changelog**(1)](/man/enterprise-packages/lustre/lfs-changelog.1), [**llapi\_changelog\_clear**(3)](/man/enterprise-packages/lustre/llapi_changelog_clear.3), [**llapi\_changelog\_deregister**(3)](/man/enterprise-packages/lustre/llapi_changelog_deregister.3), [**llapi\_changelog\_get\_fd**(3)](/man/enterprise-packages/lustre/llapi_changelog_get_fd.3), [**llapi\_changelog\_in\_buf**(3)](/man/enterprise-packages/lustre/llapi_changelog_in_buf.3), [**llapi\_changelog\_recv**(3)](/man/enterprise-packages/lustre/llapi_changelog_recv.3), [**llapi\_changelog\_register**(3)](/man/enterprise-packages/lustre/llapi_changelog_register.3), [**llapi\_convert\_str2mask**(3)](/man/enterprise-packages/lustre/llapi_convert_str2mask.3), [**lustreapi**(7)](/man/enterprise-packages/lustre/lustreapi.7)

2026-09-12 Lustre User API

---

Document: llapi_changelog_fini(3) from lustre 2.17.60-r0 (Chainguard OS)
Source: https://github.com/lustre/lustre-release
