summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYan, Zheng <zyan@redhat.com>2017-06-14 15:54:56 +0800
committerIlya Dryomov <idryomov@gmail.com>2017-07-07 17:25:13 +0200
commit1684dd03e9f59212775cafa50ea77b9ef5b263db (patch)
treec09f6611a70dbda9e36bd71f0887a0e56bb592c8
parent92e57e6287cc7402487edf3eb09c8a7b36dad63f (diff)
downloadlinux-stable-1684dd03e9f59212775cafa50ea77b9ef5b263db.tar.gz
linux-stable-1684dd03e9f59212775cafa50ea77b9ef5b263db.tar.bz2
linux-stable-1684dd03e9f59212775cafa50ea77b9ef5b263db.zip
ceph: getattr before read on ceph.* xattrs
Previously we were returning values for quota, layout xattrs without any kind of update -- the user just got whatever happened to be in our cache. Clearly this extra round trip has a cost, but reads of these xattrs are fairly rare, happening on admin intervention rather than in normal operation. Link: http://tracker.ceph.com/issues/17939 Signed-off-by: "Yan, Zheng" <zyan@redhat.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
-rw-r--r--fs/ceph/xattr.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c
index 75267cdd5dfd..11263f102e4c 100644
--- a/fs/ceph/xattr.c
+++ b/fs/ceph/xattr.c
@@ -756,6 +756,9 @@ ssize_t __ceph_getxattr(struct inode *inode, const char *name, void *value,
/* let's see if a virtual xattr was requested */
vxattr = ceph_match_vxattr(inode, name);
if (vxattr) {
+ err = ceph_do_getattr(inode, 0, true);
+ if (err)
+ return err;
err = -ENODATA;
if (!(vxattr->exists_cb && !vxattr->exists_cb(ci)))
err = vxattr->getxattr_cb(ci, value, size);