kfree(frag);
}
kfree(ci->i_xattrs.data);
+ __destroy_xattrs(ci);
kmem_cache_free(ceph_inode_cachep, ci);
}
for (i=0; i<numattr; i++) {
kfree(xattrs[i]);
}
+ kfree(xattrs);
goto start;
}
err = -EIO;
if (err < 0)
goto bad;
}
+ kfree(xattrs);
}
ci->i_xattrs.index_version = ci->i_xattrs.version;
if (xattrs[i])
kfree(xattrs[i]);
}
+ kfree(xattrs);
}
ci->i_xattrs.names_size = 0;
return err;
spin_lock(&inode->i_lock);
issued = __ceph_caps_issued(ci, NULL);
- dout(10, "getxattr %p issued %s\n", inode, ceph_cap_string(issued));
+ dout(0, "getxattr %p issued %s ver=%lld index_ver=%lld\n", inode,
+ ceph_cap_string(issued),
+ ci->i_xattrs.version, ci->i_xattrs.index_version);
- if (0 && issued & CEPH_CAP_XATTR_RDCACHE) {
+ if ((issued & CEPH_CAP_XATTR_RDCACHE) &&
+ (ci->i_xattrs.index_version >= ci->i_xattrs.version)) {
dout(10, "getxattr %p using cached xattrs\n", inode);
goto get_xattr;
} else {
spin_lock(&inode->i_lock);
issued = __ceph_caps_issued(ci, NULL);
- dout(0, "listxattr %p issued %s\n", inode, ceph_cap_string(issued));
+ dout(0, "listxattr %p issued %s ver=%lld index_ver=%lld\n", inode,
+ ceph_cap_string(issued),
+ ci->i_xattrs.version, ci->i_xattrs.index_version);
- if (0 && issued & CEPH_CAP_XATTR_RDCACHE) {
+ if ((issued & CEPH_CAP_XATTR_RDCACHE) &&
+ (ci->i_xattrs.index_version > ci->i_xattrs.version)) {
dout(0, "listxattr %p using cached xattrs\n", inode);
goto list_xattr;
} else {
}
}
- dout(0, "setxattr value=%s\n", value);
+ dout(0, "setxattr value=%.*s\n", (int)size, value);
/* do request */
req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_SETXATTR,
return -EOPNOTSUPP;
err = -ENOMEM;
- dout(0, "setxattr 1\n");
newname = kmalloc(name_len + 1, GFP_NOFS);
if (!newname)
goto out;
xattr = kmalloc(sizeof(struct ceph_inode_xattr), GFP_NOFS);
if (!xattr)
goto out;
- dout(0, "setxattr 2\n");
spin_lock(&inode->i_lock);
required_blob_size = __get_required_blob_size(ci, name_len, val_len);