ceph: request xattrs if xattr_version is zero
Following sequence of events can happen. - Client releases an inode, queues cap release message. - A 'lookup' reply brings the same inode back, but the reply doesn't contain xattrs because MDS didn't receive the cap release message and thought client already has up-to-data xattrs. The fix is force sending a getattr request to MDS if xattrs_version is 0. The getattr mask is set to CEPH_STAT_CAP_XATTR, so MDS knows client does not have xattr. Signed-off-by: Yan, Zheng <zyan@redhat.com>
This commit is contained in:

zatwierdzone przez
Ilya Dryomov

rodzic
b76f82398c
commit
508b32d866
@@ -826,8 +826,7 @@ again:
|
||||
ceph_put_cap_refs(ci, got);
|
||||
|
||||
if (checkeof && ret >= 0) {
|
||||
int statret = ceph_do_getattr(inode,
|
||||
CEPH_STAT_CAP_SIZE);
|
||||
int statret = ceph_do_getattr(inode, CEPH_STAT_CAP_SIZE, false);
|
||||
|
||||
/* hit EOF or hole? */
|
||||
if (statret == 0 && iocb->ki_pos < inode->i_size &&
|
||||
@@ -995,7 +994,7 @@ static loff_t ceph_llseek(struct file *file, loff_t offset, int whence)
|
||||
mutex_lock(&inode->i_mutex);
|
||||
|
||||
if (whence == SEEK_END || whence == SEEK_DATA || whence == SEEK_HOLE) {
|
||||
ret = ceph_do_getattr(inode, CEPH_STAT_CAP_SIZE);
|
||||
ret = ceph_do_getattr(inode, CEPH_STAT_CAP_SIZE, false);
|
||||
if (ret < 0) {
|
||||
offset = ret;
|
||||
goto out;
|
||||
|
Reference in New Issue
Block a user