From: Sage Weil Date: Tue, 3 Jun 2008 14:15:44 +0000 (-0700) Subject: kclient: simplify no-xattr encoding a bit X-Git-Tag: v0.3~172 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f8206050820e866faf45631dcf98da5d526953bd;p=ceph.git kclient: simplify no-xattr encoding a bit --- diff --git a/src/kernel/inode.c b/src/kernel/inode.c index a19aeb3bad8..61172137d46 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -1861,6 +1861,10 @@ ssize_t ceph_getxattr(struct dentry *dentry, const char *name, void *value, spin_lock(&inode->i_lock); + err = -ENODATA; + if (!ci->i_xattr_len) + goto out; + /* find attr */ p = ci->i_xattr_data; end = p + ci->i_xattr_len; @@ -1891,7 +1895,7 @@ out: return err; bad: - derr(10, "currupt xattr info on %p %llx\n", dentry->d_inode, + derr(10, "corrupt xattr info on %p %llx\n", dentry->d_inode, ceph_ino(dentry->d_inode)); err = -EIO; goto out; @@ -1902,7 +1906,7 @@ ssize_t ceph_listxattr(struct dentry *dentry, char *names, size_t size) struct inode *inode = dentry->d_inode; struct ceph_inode_info *ci = ceph_inode(inode); int namelen = 0; - u32 numattr; + u32 numattr = 0; void *p, *end; int err; @@ -1913,17 +1917,20 @@ ssize_t ceph_listxattr(struct dentry *dentry, char *names, size_t size) spin_lock(&inode->i_lock); /* measure len */ - p = ci->i_xattr_data; - end = p + ci->i_xattr_len; - ceph_decode_32_safe(&p, end, numattr, bad); - while (numattr--) { - u32 len; - ceph_decode_32_safe(&p, end, len, bad); - namelen += len + 1; - p += len; - ceph_decode_32_safe(&p, end, len, bad); - p += len; - } + if (ci->i_xattr_len) { + p = ci->i_xattr_data; + end = p + ci->i_xattr_len; + ceph_decode_32_safe(&p, end, numattr, bad); + while (numattr--) { + u32 len; + ceph_decode_32_safe(&p, end, len, bad); + namelen += len + 1; + p += len; + ceph_decode_32_safe(&p, end, len, bad); + p += len; + } + } else + namelen = 1; /* for \0 */ err = -ERANGE; if (size && namelen > size) @@ -1933,25 +1940,28 @@ ssize_t ceph_listxattr(struct dentry *dentry, char *names, size_t size) goto out; /* copy names */ - p = ci->i_xattr_data; - ceph_decode_32(&p, numattr); - while (numattr--) { - u32 len; - ceph_decode_32(&p, len); - memcpy(names, p, len); - names[len] = '\0'; - names += len + 1; - p += len; - ceph_decode_32(&p, len); - p += len; - } + if (ci->i_xattr_len) { + p = ci->i_xattr_data; + ceph_decode_32(&p, numattr); + while (numattr--) { + u32 len; + ceph_decode_32(&p, len); + memcpy(names, p, len); + names[len] = '\0'; + names += len + 1; + p += len; + ceph_decode_32(&p, len); + p += len; + } + } else + names[0] = 0; out: spin_unlock(&inode->i_lock); return err; bad: - derr(10, "currupt xattr info on %p %llx\n", dentry->d_inode, + derr(10, "corrupt xattr info on %p %llx\n", dentry->d_inode, ceph_ino(dentry->d_inode)); err = -EIO; goto out; diff --git a/src/messages/MClientReply.h b/src/messages/MClientReply.h index f43fc32b2ac..3d478077b38 100644 --- a/src/messages/MClientReply.h +++ b/src/messages/MClientReply.h @@ -149,8 +149,10 @@ struct InodeStat { bufferlist xbl; ::decode(xbl, p); - bufferlist::iterator q = xbl.begin(); - ::decode(xattrs, q); + if (xbl.length()) { + bufferlist::iterator q = xbl.begin(); + ::decode(xattrs, q); + } } static void encode(bufferlist &bl, CInode *in) { @@ -184,7 +186,8 @@ struct InodeStat { ::encode(in->symlink, bl); bufferlist xbl; - ::encode(in->xattrs, xbl); + if (!in->xattrs.empty()) + ::encode(in->xattrs, xbl); ::encode(xbl, bl); }