bool skip_linkea,
bool skip_dmv)
{
+ struct lu_attr *attr = MDD_ENV_VAR(env, cattr);
struct mdd_xattr_entry *entry;
+ bool needencxattr = false;
+ bool encxattrfound = false;
char *xname;
int list_xsize;
int xlen;
if (list_xsize < 0)
RETURN(list_xsize);
+ if (attr->la_valid & LA_FLAGS &&
+ attr->la_flags & LUSTRE_ENCRYPT_FL) {
+ needencxattr = true;
+ list_xsize +=
+ strlen(LL_XATTR_NAME_ENCRYPTION_CONTEXT) + 1;
+ }
+
lu_buf_alloc(&xattrs->mx_namebuf, list_xsize);
if (xattrs->mx_namebuf.lb_buf == NULL)
RETURN(-ENOMEM);
rem = rc;
rc = 0;
xname = xattrs->mx_namebuf.lb_buf;
+reloop:
for (; rem > 0; xname += xlen, rem -= xlen) {
+ if (needencxattr &&
+ strcmp(xname, LL_XATTR_NAME_ENCRYPTION_CONTEXT) == 0)
+ encxattrfound = true;
xlen = strnlen(xname, rem - 1) + 1;
if (strcmp(XATTR_NAME_LMA, xname) == 0 ||
strcmp(XATTR_NAME_LMV, xname) == 0)
list_add_tail(&entry->mxe_linkage, &xattrs->mx_list);
}
+ if (needencxattr && !encxattrfound) {
+ xlen = strlen(LL_XATTR_NAME_ENCRYPTION_CONTEXT) + 1;
+ strncpy(xname, LL_XATTR_NAME_ENCRYPTION_CONTEXT, xlen);
+ rem = xlen;
+ GOTO(reloop, 0);
+ }
+
RETURN(0);
fini:
mdd_xattrs_fini(xattrs);
sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
# migrate a non-empty encrypted dir
trace_cmd $LFS migrate -m 1 $dirname/d2
+ sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
+ [ -f $dirname/d2/subf ] || error "migrate failed (1)"
+ [ $(cat $dirname/d2/subf) == "b" ] || error "migrate failed (2)"
$LFS setdirstripe -i 1 -c 1 $dirname/d3
dirname=$dirname/d3/subdir
stripe=$($LFS getdirstripe -i $scrambleddir)
[ $stripe -eq 1 ] ||
error "migrate $scrambleddir between MDTs failed (2)"
+
+ # now, with the key
+ insert_enc_key
+ [ -f $dirname/subf ] ||
+ error "migrate $scrambleddir between MDTs failed (3)"
+ [ $(cat $dirname/subf) == "b" ] ||
+ error "migrate $scrambleddir between MDTs failed (4)"
}
run_test 59c "MDT migrate of encrypted files without key"