From b501ecf1809e5a7865e158286ec877ce899ea5a4 Mon Sep 17 00:00:00 2001 From: shenhang Date: Tue, 17 Sep 2019 10:55:21 +0800 Subject: [PATCH] client: add procession of SEEK_HOLE and SEEK_DATA in lseek. Fixes: https://tracker.ceph.com/issues/42107 Signed-off-by: Shen Hang (cherry picked from commit 394720ca6b731e4698f1dbc7896d294363ecb466) --- src/client/Client.cc | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 5fb2e8db3c73a..cf68e7b0ec476 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -8731,6 +8731,13 @@ loff_t Client::_lseek(Fh *f, loff_t offset, int whence) int r; loff_t pos = -1; + if (whence == SEEK_END || whence == SEEK_DATA || whence == SEEK_HOLE) { + r = _getattr(in, CEPH_STAT_CAP_SIZE, f->actor_perms); + if (r < 0) { + return r; + } + } + switch (whence) { case SEEK_SET: pos = offset; @@ -8741,12 +8748,26 @@ loff_t Client::_lseek(Fh *f, loff_t offset, int whence) break; case SEEK_END: - r = _getattr(in, CEPH_STAT_CAP_SIZE, f->actor_perms); - if (r < 0) - return r; pos = in->size + offset; break; + case SEEK_DATA: + if (offset < 0 || offset >= in->size) { + r = -ENXIO; + return offset; + } + pos = offset; + break; + + case SEEK_HOLE: + if (offset < 0 || offset >= in->size) { + r = -ENXIO; + pos = offset; + } else { + pos = in->size; + } + break; + default: ceph_abort(); } -- 2.39.5