Here's a patch for the ERANGE error (lightly tested). Sage's patch
looks good but only covers one of two code paths for xattrs. With zfs
they may either be stored as a system attribute which is usually close
to the dnode on disk (zfs set xattr=sa pool/dataset). Or they may be
stored in their own object which is how it's implemented on Solaris (zfs
set xattr=on pool/dataset). The second method is still the default for
compatibility reasons even though it's slower. Sage's patch only
covered the SA case.
> Well, looking at the code again it's not going to work, as setxattr is
> going to fail with ERANGE.
Why? We support an arbitrary number of maximum sized xattrs (65536).
What am I missing here?
Incidentally, does anybody know of an good xattr test suite we could add
to our regression tests?
Thanks,
Brian
diff --git a/module/zfs/zpl_xattr.c b/module/zfs/zpl_xattr.c
index c03764f..9f4d63c 100644
--- a/module/zfs/zpl_xattr.c
+++ b/module/zfs/zpl_xattr.c
@@ -225,6 +225,11 @@ zpl_xattr_get_dir(struct inode *ip, const char
*name, void *value,
goto out;
}
+ if (size < i_size_read(xip)) {
+ error = -ERANGE;
+ goto out;
+ }
+
error = zpl_read_common(xip, value, size, 0, UIO_SYSSPACE, 0, cr);
out:
if (xip)
@@ -263,7 +268,10 @@ zpl_xattr_get_sa(struct inode *ip, const char
*name, void *value, size_t size)
if (!size)
return (nv_size);
- memcpy(value, nv_value, MIN(size, nv_size));
+ if (size < nv_size)
+ return (-ERANGE);
+
+ memcpy(value, nv_value, size);
return (MIN(size, nv_size));
}
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html