Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 06476a69 authored by Alex Elder's avatar Alex Elder
Browse files

ceph: pass inode rather than table to ceph_match_vxattr()



All callers of ceph_match_vxattr() determine what to pass as the
first argument by calling ceph_inode_vxattrs(inode).  Just do that
inside ceph_match_vxattr() itself, changing it to take an inode
rather than the vxattr pointer as its first argument.

Also ensure the function works correctly for an empty table (i.e.,
containing only a terminating null entry).

Signed-off-by: default avatarAlex Elder <elder@dreamhost.com>
Signed-off-by: default avatarSage Weil <sage@newdream.net>
parent b829c195
Loading
Loading
Loading
Loading
+20 −23
Original line number Diff line number Diff line
@@ -126,14 +126,19 @@ static struct ceph_vxattr_cb *ceph_inode_vxattrs(struct inode *inode)
	return NULL;
}

static struct ceph_vxattr_cb *ceph_match_vxattr(struct ceph_vxattr_cb *vxattr,
static struct ceph_vxattr_cb *ceph_match_vxattr(struct inode *inode,
						const char *name)
{
	do {
		if (strcmp(vxattr->name, name) == 0)
	struct ceph_vxattr_cb *vxattr = ceph_inode_vxattrs(inode);

	if (vxattr) {
		while (vxattr->name) {
			if (!strcmp(vxattr->name, name))
				return vxattr;
			vxattr++;
	} while (vxattr->name);
		}
	}

	return NULL;
}

@@ -502,7 +507,6 @@ ssize_t ceph_getxattr(struct dentry *dentry, const char *name, void *value,
{
	struct inode *inode = dentry->d_inode;
	struct ceph_inode_info *ci = ceph_inode(inode);
	struct ceph_vxattr_cb *vxattrs = ceph_inode_vxattrs(inode);
	int err;
	struct ceph_inode_xattr *xattr;
	struct ceph_vxattr_cb *vxattr = NULL;
@@ -511,8 +515,7 @@ ssize_t ceph_getxattr(struct dentry *dentry, const char *name, void *value,
		return -ENODATA;

	/* let's see if a virtual xattr was requested */
	if (vxattrs)
		vxattr = ceph_match_vxattr(vxattrs, name);
	vxattr = ceph_match_vxattr(inode, name);

	spin_lock(&ci->i_ceph_lock);
	dout("getxattr %p ver=%lld index_ver=%lld\n", inode,
@@ -698,8 +701,8 @@ int ceph_setxattr(struct dentry *dentry, const char *name,
		  const void *value, size_t size, int flags)
{
	struct inode *inode = dentry->d_inode;
	struct ceph_vxattr_cb *vxattr;
	struct ceph_inode_info *ci = ceph_inode(inode);
	struct ceph_vxattr_cb *vxattrs = ceph_inode_vxattrs(inode);
	int err;
	int name_len = strlen(name);
	int val_len = size;
@@ -716,12 +719,9 @@ int ceph_setxattr(struct dentry *dentry, const char *name,
	if (!ceph_is_valid_xattr(name))
		return -EOPNOTSUPP;

	if (vxattrs) {
		struct ceph_vxattr_cb *vxattr =
			ceph_match_vxattr(vxattrs, name);
	vxattr = ceph_match_vxattr(inode, name);
	if (vxattr && vxattr->readonly)
		return -EOPNOTSUPP;
	}

	/* preallocate memory for xattr name, value, index node */
	err = -ENOMEM;
@@ -814,8 +814,8 @@ static int ceph_send_removexattr(struct dentry *dentry, const char *name)
int ceph_removexattr(struct dentry *dentry, const char *name)
{
	struct inode *inode = dentry->d_inode;
	struct ceph_vxattr_cb *vxattr;
	struct ceph_inode_info *ci = ceph_inode(inode);
	struct ceph_vxattr_cb *vxattrs = ceph_inode_vxattrs(inode);
	int issued;
	int err;
	int required_blob_size;
@@ -827,12 +827,9 @@ int ceph_removexattr(struct dentry *dentry, const char *name)
	if (!ceph_is_valid_xattr(name))
		return -EOPNOTSUPP;

	if (vxattrs) {
		struct ceph_vxattr_cb *vxattr =
			ceph_match_vxattr(vxattrs, name);
	vxattr = ceph_match_vxattr(inode, name);
	if (vxattr && vxattr->readonly)
		return -EOPNOTSUPP;
	}

	err = -ENOMEM;
	spin_lock(&ci->i_ceph_lock);