[PATCH 02/11] xfsprogs: avoid dependency on linux XATTR_SIZE/LIST_MAX

Jan Tulak
2015-08-27T06:02:31Z

Currently, we depends on Linux XATTR values for on disk
definitions. Which causes trouble on other platforms and
maybe also if these values were to change.

Fix it by creating a custom definition independent from
those in Linux (although with the same values).

Signed-off-by: Jan Tulak <jtulak@redhat.com>
---
libhandle/handle.c | 6 ++++--
libhandle/jdm.c | 6 ++++--
libxfs/xfs_attr_remote.c | 2 +-
libxfs/xfs_format.h | 11 ++++++++++-
4 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/libhandle/handle.c b/libhandle/handle.c
index b1c0c10..d532f44 100644
--- a/libhandle/handle.c
+++ b/libhandle/handle.c
@@ -21,6 +21,8 @@
#include "xfs.h"
#include "handle.h"
#include "parent.h"
+#include "xfs/xfs_arch.h"
+#include "xfs/xfs_format.h"

/* just pick a value we know is more than big enough */
#define MAXHANSIZ 64
@@ -397,8 +399,8 @@ attr_list_by_handle(
alhreq.buffer = buf;
alhreq.buflen = bufsize;
/* prevent needless EINVAL from the kernel */
- if (alhreq.buflen > XATTR_LIST_MAX)
- alhreq.buflen = XATTR_LIST_MAX;
+ if (alhreq.buflen > XFS_XATTR_LIST_MAX)
+ alhreq.buflen = XFS_XATTR_LIST_MAX;

error = xfsctl(path, fd, XFS_IOC_ATTRLIST_BY_HANDLE, &alhreq);

diff --git a/libhandle/jdm.c b/libhandle/jdm.c
index d804423..db7d1fe 100644
--- a/libhandle/jdm.c
+++ b/libhandle/jdm.c
@@ -21,6 +21,8 @@
#include "handle.h"
#include "jdm.h"
#include "parent.h"
+#include "xfs/xfs_arch.h"
+#include "xfs/xfs_format.h"

/* internal fshandle - typecast to a void for external use */
#define FSHANDLE_SZ 8
@@ -168,8 +170,8 @@ jdm_attr_list( jdm_fshandle_t *fshp,
int rval;

/* prevent needless EINVAL from the kernel */
- if (bufsz > XATTR_LIST_MAX)
- bufsz = XATTR_LIST_MAX;
+ if (bufsz > XFS_XATTR_LIST_MAX)
+ bufsz = XFS_XATTR_LIST_MAX;

jdm_fill_filehandle( &filehandle, fshandlep, statp );
rval = attr_list_by_handle (( void * )&filehandle,
diff --git a/libxfs/xfs_attr_remote.c b/libxfs/xfs_attr_remote.c
index 5feaf55..98893e2 100644
--- a/libxfs/xfs_attr_remote.c
+++ b/libxfs/xfs_attr_remote.c
@@ -102,7 +102,7 @@ xfs_attr3_rmt_verify(
if (be32_to_cpu(rmt->rm_bytes) > fsbsize - sizeof(*rmt))
return false;
if (be32_to_cpu(rmt->rm_offset) +
- be32_to_cpu(rmt->rm_bytes) > XATTR_SIZE_MAX)
+ be32_to_cpu(rmt->rm_bytes) > XFS_XATTR_SIZE_MAX)
return false;
if (rmt->rm_owner == 0)
return false;
diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h
index bb7cc04..2380084 100644
--- a/libxfs/xfs_format.h
+++ b/libxfs/xfs_format.h
@@ -60,6 +60,14 @@ struct xfs_ifork;
#define XFS_SB_VERSION_MOREBITSBIT 0x8000

/*
+ * Avoid dependency on linux values of XATTR.
+ * It has to be on the beginning of this file, because we use these Values
+ * later in this header file.
+ */
+#define XFS_XATTR_SIZE_MAX 65536 /* size of an extended attribute value (64k) */
+#define XFS_XATTR_LIST_MAX 65536 /* size of extended attribute namelist (64k) */
+
+/*
* Supported feature bit list is just all bits in the versionnum field because
* we've used them all up and understand them all. Except, of course, for the
* shared superblock bit, which nobody knows what it does and so is unsupported.
@@ -1483,7 +1491,7 @@ struct xfs_acl {
*/
#define XFS_ACL_MAX_ENTRIES(mp) \
(xfs_sb_version_hascrc(&mp->m_sb) \
- ? (XATTR_SIZE_MAX - sizeof(struct xfs_acl)) / \
+ ? (XFS_XATTR_SIZE_MAX - sizeof(struct xfs_acl)) / \
sizeof(struct xfs_acl_entry) \
: 25)

@@ -1497,4 +1505,5 @@ struct xfs_acl {
#define SGI_ACL_FILE_SIZE (sizeof(SGI_ACL_FILE)-1)
#define SGI_ACL_DEFAULT_SIZE (sizeof(SGI_ACL_DEFAULT)-1)

+
#endif /* __XFS_FORMAT_H__ */
--
2.4.5