]) # LC_D_COMPARE_4ARGS
#
+# LC_FULL_NAME_HASH_3ARGS
+#
+# Kernel version 4.8 commit 8387ff2577eb9ed245df9a39947f66976c6bcd02
+# vfs: make the string hashes salt the hash
+#
+AC_DEFUN([LC_FULL_NAME_HASH_3ARGS], [
+LB_CHECK_COMPILE([if 'full_name_hash' taken 3 arguments],
+full_name_hash_3args, [
+ #include <linux/stringhash.h>
+],[
+ unsigned int hash;
+ hash = full_name_hash(NULL,NULL,0);
+],[
+ AC_DEFINE(HAVE_FULL_NAME_HASH_3ARGS, 1,
+ [full_name_hash need 3 arguments])
+])
+]) # LC_FULL_NAME_HASH_3ARGS
+
+#
# LC_PROG_LINUX
#
# Lustre linux kernel checks
# 4.8
LC_HAVE_POSIX_ACL_VALID_USER_NS
LC_D_COMPARE_4ARGS
+ LC_FULL_NAME_HASH_3ARGS
#
AS_IF([test "x$enable_server" != xno], [
# define ll_task_pid_ns(task) ((task)->nsproxy->pid_ns)
#endif
+#ifdef HAVE_FULL_NAME_HASH_3ARGS
+# define ll_full_name_hash(salt, name, len) full_name_hash(salt, name, len)
+#else
+# define ll_full_name_hash(salt, name, len) full_name_hash(name, len)
+#endif
+
#endif /* _LUSTRE_COMPAT_H */
return rc;
llh->llh_reg_mode = mode;
- resid->name[LUSTRE_RES_ID_HSH_OFF] = full_name_hash(name, strlen(name));
+ resid->name[LUSTRE_RES_ID_HSH_OFF] = ll_full_name_hash(NULL, name,
+ strlen(name));
LASSERT(resid->name[LUSTRE_RES_ID_HSH_OFF] != 0);
rc = __lfsck_ibits_lock(env, lfsck, obj, resid, &llh->llh_reg_lh,
bits, llh->llh_reg_mode);
.d_name = {
.name = dirname,
.len = strlen(dirname),
- .hash = full_name_hash(dirname, strlen(dirname)),
+ .hash = ll_full_name_hash(dparent, dirname,
+ strlen(dirname)),
},
};
int err;
RETURN(PTR_ERR(op_data));
/* Get child FID first */
- qstr.hash = full_name_hash(name, namelen);
+ qstr.hash = ll_full_name_hash(file_dentry(file), name, namelen);
qstr.name = name;
qstr.len = namelen;
dchild = d_lookup(file_dentry(file), &qstr);
/* allocate sa_entry and hash it to allow scanner process to find it */
static struct sa_entry *
-sa_alloc(struct ll_statahead_info *sai, __u64 index, const char *name, int len,
- const struct lu_fid *fid)
+sa_alloc(struct dentry *parent, struct ll_statahead_info *sai, __u64 index,
+ const char *name, int len, const struct lu_fid *fid)
{
struct ll_inode_info *lli;
struct sa_entry *entry;
dname = (char *)entry + sizeof(struct sa_entry);
memcpy(dname, name, len);
dname[len] = 0;
- entry->se_qstr.hash = full_name_hash(name, len);
+ entry->se_qstr.hash = ll_full_name_hash(parent, name, len);
entry->se_qstr.len = len;
entry->se_qstr.name = dname;
entry->se_fid = *fid;
int rc;
ENTRY;
- entry = sa_alloc(sai, sai->sai_index, name, len, fid);
+ entry = sa_alloc(parent, sai, sai->sai_index, name, len, fid);
if (IS_ERR(entry))
RETURN_EXIT;
lh->mlh_type = MDT_PDO_LOCK;
if (lu_name_is_valid(lname)) {
- lh->mlh_pdo_hash = full_name_hash(lname->ln_name,
- lname->ln_namelen);
+ lh->mlh_pdo_hash = ll_full_name_hash(NULL, lname->ln_name,
+ lname->ln_namelen);
/* XXX Workaround for LU-2856
*
* Zero is a valid return value of full_name_hash, but