int mdd_declare_changelog_store(const struct lu_env *env,
struct mdd_device *mdd,
+ enum changelog_rec_type type,
const struct lu_name *tname,
const struct lu_name *sname,
struct thandle *handle)
int reclen;
int rc;
- /* Not recording */
- if (!recording_changelog(env, mdd))
+ if (!mdd_changelog_enabled(env, mdd, type))
return 0;
reclen = mdd_llog_record_calc_size(env, tname, sname);
int rc;
ENTRY;
- /* Not recording */
- if (!recording_changelog(env, mdd))
- RETURN(0);
-
- if ((mdd->mdd_cl.mc_mask & (1 << type)) == 0)
+ if (!mdd_changelog_enabled(env, mdd, type))
RETURN(0);
LASSERT(tpfid != NULL);
if (rc != 0)
return rc;
- rc = mdd_declare_changelog_store(env, mdd, name, NULL, handle);
+ rc = mdd_declare_changelog_store(env, mdd, CL_HARDLINK, name, NULL,
+ handle);
return rc;
}
return rc;
/* FIXME: need changelog for remove entry */
- rc = mdd_declare_changelog_store(env, mdd, name, NULL, handle);
+ rc = mdd_declare_changelog_store(env, mdd, CL_UNLINK, name,
+ NULL, handle);
}
return rc;
if (rc)
GOTO(stop, rc);
- rc = mdd_declare_changelog_store(env, mdd, NULL, NULL, handle);
+ rc = mdd_declare_changelog_store(env, mdd, CL_LAYOUT, NULL, NULL,
+ handle);
if (rc)
GOTO(stop, rc);
GOTO(out, rc);
} else {
struct lu_attr *la = &mdd_env_info(env)->mti_la_for_fix;
+ enum changelog_rec_type type;
rc = mdo_declare_index_insert(env, p, mdo2fid(c), attr->la_mode,
name->ln_name, handle);
if (rc)
return rc;
- rc = mdd_declare_changelog_store(env, mdd, name, NULL, handle);
+ type = S_ISDIR(attr->la_mode) ? CL_MKDIR :
+ S_ISREG(attr->la_mode) ? CL_CREATE :
+ S_ISLNK(attr->la_mode) ? CL_SOFTLINK : CL_MKNOD;
+
+ rc = mdd_declare_changelog_store(env, mdd, type, name, NULL,
+ handle);
if (rc)
return rc;
}
return rc;
}
- rc = mdd_declare_changelog_store(env, mdd, tname, sname, handle);
+ rc = mdd_declare_changelog_store(env, mdd, CL_RENAME, tname, sname,
+ handle);
if (rc)
return rc;
if (rc != 0)
return rc;
- rc = mdd_declare_changelog_store(env, mdd, lname, NULL, handle);
+ rc = mdd_declare_changelog_store(env, mdd, CL_MIGRATE, lname, NULL,
+ handle);
return rc;
}
int mdd_readpage(const struct lu_env *env, struct md_object *obj,
const struct lu_rdpg *rdpg);
int mdd_declare_changelog_store(const struct lu_env *env,
- struct mdd_device *mdd,
- const struct lu_name *tname,
- const struct lu_name *sname,
- struct thandle *handle);
+ struct mdd_device *mdd,
+ enum changelog_rec_type type,
+ const struct lu_name *tname,
+ const struct lu_name *sname,
+ struct thandle *handle);
void mdd_changelog_rec_ext_jobid(struct changelog_rec *rec, const char *jobid);
void mdd_changelog_rec_ext_extra_flags(struct changelog_rec *rec, __u64 eflags);
void mdd_changelog_rec_extra_uidgid(struct changelog_rec *rec,
return dt_destroy(env, next, handle);
}
-static inline int recording_changelog(const struct lu_env *env,
- struct mdd_device *mdd)
+static inline bool mdd_changelog_enabled(const struct lu_env *env,
+ struct mdd_device *mdd,
+ enum changelog_rec_type type)
{
- const struct lu_ucred *uc = lu_ucred_check(env);
+ const struct lu_ucred *uc;
- return (mdd->mdd_cl.mc_flags & CLM_ON) &&
- (uc ? uc->uc_enable_audit : 1);
+ if ((mdd->mdd_cl.mc_flags & CLM_ON) &&
+ (mdd->mdd_cl.mc_mask & (1 << type))) {
+ uc = lu_ucred_check(env);
+
+ return uc != NULL ? uc->uc_enable_audit : true;
+ } else {
+ return false;
+ }
}
#endif
const char *name)
{
struct mdd_object *mdd_obj = md2mdd_obj(obj);
- struct md_device *md_dev = lu2md_dev(mdd2lu_dev(mdo2mdd(obj)));
+ struct mdd_device *mdd;
int rc;
ENTRY;
rc = mdo_xattr_get(env, mdd_obj, buf, name);
mdd_read_unlock(env, mdd_obj);
+ mdd = mdo2mdd(obj);
+
/* record only getting user xattrs and acls */
if (rc >= 0 &&
+ mdd_changelog_enabled(env, mdd, CL_GETXATTR) &&
(has_prefix(name, XATTR_USER_PREFIX) ||
has_prefix(name, XATTR_NAME_POSIX_ACL_ACCESS) ||
has_prefix(name, XATTR_NAME_POSIX_ACL_DEFAULT))) {
struct thandle *handle;
- struct mdd_device *mdd = lu2mdd_dev(&md_dev->md_lu_dev);
int rc2;
- /* Not recording */
- if (!recording_changelog(env, mdd))
- RETURN(rc);
- if (!(mdd->mdd_cl.mc_mask & (1 << CL_GETXATTR)))
- RETURN(rc);
-
LASSERT(mdo2fid(mdd_obj) != NULL);
handle = mdd_trans_create(env, mdd);
if (IS_ERR(handle))
RETURN(PTR_ERR(handle));
- rc2 = mdd_declare_changelog_store(env, mdd, NULL, NULL, handle);
+ rc2 = mdd_declare_changelog_store(env, mdd, CL_GETXATTR, NULL,
+ NULL, handle);
if (rc2)
GOTO(stop, rc2);
LASSERT(mdd_obj != NULL);
LASSERT(handle != NULL);
- /* Not recording */
- if (!recording_changelog(env, mdd))
- RETURN(0);
- if ((mdd->mdd_cl.mc_mask & (1 << type)) == 0)
+ if (!mdd_changelog_enabled(env, mdd, type))
RETURN(0);
if (mdd_is_volatile_obj(mdd_obj))
LASSERT(mdd_obj != NULL);
LASSERT(handle != NULL);
- /* Not recording */
- if (!recording_changelog(env, mdd))
- RETURN(0);
- if ((mdd->mdd_cl.mc_mask & (1 << type)) == 0)
+ if (!mdd_changelog_enabled(env, mdd, type))
RETURN(0);
if (mdd_is_volatile_obj(mdd_obj))
int rc;
ENTRY;
- /* Not recording */
- if (!recording_changelog(env, mdd))
- RETURN(0);
- if (!(mdd->mdd_cl.mc_mask & (1 << type)))
- RETURN(0);
-
LASSERT(fid != NULL);
+ /* We'll check this again below, but we check now before we
+ * start a transaction. */
+ if (!mdd_changelog_enabled(env, mdd, type))
+ RETURN(0);
+
handle = mdd_trans_create(env, mdd);
if (IS_ERR(handle))
RETURN(PTR_ERR(handle));
- rc = mdd_declare_changelog_store(env, mdd, NULL, NULL, handle);
+ rc = mdd_declare_changelog_store(env, mdd, type, NULL, NULL, handle);
if (rc)
GOTO(stop, rc);
}
#endif
- rc = mdd_declare_changelog_store(env, mdd, NULL, NULL, handle);
+ rc = mdd_declare_changelog_store(env, mdd, CL_SETXATTR, NULL, NULL,
+ handle);
return rc;
}
const char *name,
int fl, struct thandle *handle)
{
- int rc;
+ enum changelog_rec_type type;
+ int rc;
rc = mdo_declare_xattr_set(env, obj, buf, name, fl, handle);
if (rc)
return rc;
- if (mdd_xattr_changelog_type(env, mdd, name) < 0)
+ type = mdd_xattr_changelog_type(env, mdd, name);
+ if (type < 0)
return 0; /* no changelog to store */
- return mdd_declare_changelog_store(env, mdd, NULL, NULL, handle);
+ return mdd_declare_changelog_store(env, mdd, type, NULL, NULL, handle);
}
/*
const char *name,
struct thandle *handle)
{
+ enum changelog_rec_type type;
int rc;
rc = mdo_declare_xattr_del(env, obj, name, handle);
if (rc)
return rc;
- if (mdd_xattr_changelog_type(env, mdd, name) < 0)
+ type = mdd_xattr_changelog_type(env, mdd, name);
+ if (type < 0)
return 0; /* no changelog to store */
- return mdd_declare_changelog_store(env, mdd, NULL, NULL, handle);
+ return mdd_declare_changelog_store(env, mdd, type, NULL, NULL, handle);
}
/**
if (rc)
return rc;
- return mdd_declare_changelog_store(env, mdd, NULL, NULL, handle);
+ return mdd_declare_changelog_store(env, mdd, CL_LAYOUT, NULL, NULL,
+ handle);
}
/* For PFL, this is used to instantiate necessary component objects. */
GOTO(out, rc);
/* record a changelog for data mover to consume */
- rc = mdd_declare_changelog_store(env, mdd, NULL, NULL, handle);
+ rc = mdd_declare_changelog_store(env, mdd, CL_FLRW, NULL, NULL, handle);
if (rc)
GOTO(out, rc);
GOTO(out, rc);
/* record a changelog for the completion of resync */
- rc = mdd_declare_changelog_store(env, mdd, NULL, NULL, handle);
+ rc = mdd_declare_changelog_store(env, mdd, CL_RESYNC, NULL, NULL,
+ handle);
if (rc)
GOTO(out, rc);
struct mdd_object_user *mou = NULL;
const struct lu_ucred *uc = lu_ucred(env);
struct mdd_device *mdd = mdo2mdd(obj);
- int type = CL_OPEN;
+ enum changelog_rec_type type = CL_OPEN;
int rc = 0;
mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD);
else
mdd_obj->mod_count++;
- /* Not recording */
- if (!recording_changelog(env, mdd))
- GOTO(out, rc);
- if (!(mdd->mdd_cl.mc_mask & (1 << type)))
+ if (!mdd_changelog_enabled(env, mdd, type))
GOTO(out, rc);
find:
if (rc)
GOTO(stop, rc);
- rc = mdd_declare_changelog_store(env, mdd, NULL, NULL, handle);
+ rc = mdd_declare_changelog_store(env, mdd, CL_CLOSE, NULL, NULL,
+ handle);
if (rc)
GOTO(stop, rc);
/* under mdd write lock */
/* If recording, see if we need to remove UID from list */
- if ((mdd->mdd_cl.mc_flags & CLM_ON) &&
- (mdd->mdd_cl.mc_mask & (1 << CL_OPEN))) {
+ if (mdd_changelog_enabled(env, mdd, CL_OPEN)) {
struct mdd_object_user *mou;
/* look for UID in list */
out:
mdd_write_unlock(env, mdd_obj);
+ if (rc != 0 || blocked ||
+ !mdd_changelog_enabled(env, mdd, CL_CLOSE))
+ GOTO(stop, rc);
+
/* Record CL_CLOSE in changelog only if file was opened in write mode,
* or if CL_OPEN was recorded and it's last close by user.
* Changelogs mask may change between open and close operations, but
* this is not a big deal if we have a CL_CLOSE entry with no matching
* CL_OPEN. Plus Changelogs mask may not change often.
*/
- if (!rc && !blocked &&
- ((!(mdd->mdd_cl.mc_mask & (1 << CL_OPEN)) &&
+ if (((!(mdd->mdd_cl.mc_mask & (1 << CL_OPEN)) &&
(mode & (MDS_FMODE_WRITE | MDS_OPEN_APPEND | MDS_OPEN_TRUNC))) ||
((mdd->mdd_cl.mc_mask & (1 << CL_OPEN)) && last_close_by_uid)) &&
!(ma->ma_valid & MA_FLAGS && ma->ma_attr_flags & MDS_RECOV_OPEN)) {
if (IS_ERR(handle))
GOTO(stop, rc = PTR_ERR(handle));
- rc = mdd_declare_changelog_store(env, mdd, NULL, NULL,
- handle);
+ rc = mdd_declare_changelog_store(env, mdd, CL_CLOSE,
+ NULL, NULL, handle);
if (rc)
GOTO(stop, rc);