]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: simplify no-xattr encoding a bit
authorSage Weil <sage@newdream.net>
Tue, 3 Jun 2008 14:15:44 +0000 (07:15 -0700)
committerSage Weil <sage@newdream.net>
Wed, 4 Jun 2008 20:02:46 +0000 (13:02 -0700)
src/kernel/inode.c
src/messages/MClientReply.h

index a19aeb3bad8551b21ce40c1de90d1dbcf94029fa..61172137d467bbe5ba6a333055bf7c0612d7fc2a 100644 (file)
@@ -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;
index f43fc32b2ac74b7c5dea585885831237de9a227e..3d478077b38968d2a6d2c16e89a0329a980d33de 100644 (file)
@@ -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);
   }