Skip to content

Commit d4d5188

Browse files
lxbszidryomov
authored andcommitted
ceph: add object version support for sync read
Turn the guts of ceph_sync_read into a new helper that takes an inode and an offset instead of a kiocb struct, and make ceph_sync_read call the helper as a wrapper. Make the new helper always return the last object's version. Signed-off-by: Xiubo Li <[email protected]> Reviewed-by: Jeff Layton <[email protected]> Reviewed-and-tested-by: Luís Henriques <[email protected]> Reviewed-by: Milind Changire <[email protected]> Signed-off-by: Ilya Dryomov <[email protected]>
1 parent 4e8c4c2 commit d4d5188

File tree

2 files changed

+35
-12
lines changed

2 files changed

+35
-12
lines changed

fs/ceph/file.c

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -959,22 +959,24 @@ enum {
959959
* If we get a short result from the OSD, check against i_size; we need to
960960
* only return a short read to the caller if we hit EOF.
961961
*/
962-
static ssize_t ceph_sync_read(struct kiocb *iocb, struct iov_iter *to,
963-
int *retry_op)
962+
ssize_t __ceph_sync_read(struct inode *inode, loff_t *ki_pos,
963+
struct iov_iter *to, int *retry_op,
964+
u64 *last_objver)
964965
{
965-
struct file *file = iocb->ki_filp;
966-
struct inode *inode = file_inode(file);
967966
struct ceph_inode_info *ci = ceph_inode(inode);
968967
struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
969968
struct ceph_osd_client *osdc = &fsc->client->osdc;
970969
ssize_t ret;
971-
u64 off = iocb->ki_pos;
970+
u64 off = *ki_pos;
972971
u64 len = iov_iter_count(to);
973972
u64 i_size = i_size_read(inode);
974973
bool sparse = ceph_test_mount_opt(fsc, SPARSEREAD);
974+
u64 objver = 0;
975975

976-
dout("sync_read on file %p %llu~%u %s\n", file, off, (unsigned)len,
977-
(file->f_flags & O_DIRECT) ? "O_DIRECT" : "");
976+
dout("sync_read on inode %p %llx~%llx\n", inode, *ki_pos, len);
977+
978+
if (ceph_inode_is_shutdown(inode))
979+
return -EIO;
978980

979981
if (!len)
980982
return 0;
@@ -1042,6 +1044,9 @@ static ssize_t ceph_sync_read(struct kiocb *iocb, struct iov_iter *to,
10421044
req->r_end_latency,
10431045
len, ret);
10441046

1047+
if (ret > 0)
1048+
objver = req->r_version;
1049+
10451050
i_size = i_size_read(inode);
10461051
dout("sync_read %llu~%llu got %zd i_size %llu%s\n",
10471052
off, len, ret, i_size, (more ? " MORE" : ""));
@@ -1092,21 +1097,36 @@ static ssize_t ceph_sync_read(struct kiocb *iocb, struct iov_iter *to,
10921097
break;
10931098
}
10941099

1095-
if (off > iocb->ki_pos) {
1100+
if (off > *ki_pos) {
10961101
if (off >= i_size) {
10971102
*retry_op = CHECK_EOF;
1098-
ret = i_size - iocb->ki_pos;
1099-
iocb->ki_pos = i_size;
1103+
ret = i_size - *ki_pos;
1104+
*ki_pos = i_size;
11001105
} else {
1101-
ret = off - iocb->ki_pos;
1102-
iocb->ki_pos = off;
1106+
ret = off - *ki_pos;
1107+
*ki_pos = off;
11031108
}
11041109
}
11051110

1111+
if (last_objver && ret > 0)
1112+
*last_objver = objver;
1113+
11061114
dout("sync_read result %zd retry_op %d\n", ret, *retry_op);
11071115
return ret;
11081116
}
11091117

1118+
static ssize_t ceph_sync_read(struct kiocb *iocb, struct iov_iter *to,
1119+
int *retry_op)
1120+
{
1121+
struct file *file = iocb->ki_filp;
1122+
struct inode *inode = file_inode(file);
1123+
1124+
dout("sync_read on file %p %llx~%zx %s\n", file, iocb->ki_pos,
1125+
iov_iter_count(to), (file->f_flags & O_DIRECT) ? "O_DIRECT" : "");
1126+
1127+
return __ceph_sync_read(inode, &iocb->ki_pos, to, retry_op, NULL);
1128+
}
1129+
11101130
struct ceph_aio_request {
11111131
struct kiocb *iocb;
11121132
size_t total_len;

fs/ceph/super.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1300,6 +1300,9 @@ extern int ceph_renew_caps(struct inode *inode, int fmode);
13001300
extern int ceph_open(struct inode *inode, struct file *file);
13011301
extern int ceph_atomic_open(struct inode *dir, struct dentry *dentry,
13021302
struct file *file, unsigned flags, umode_t mode);
1303+
extern ssize_t __ceph_sync_read(struct inode *inode, loff_t *ki_pos,
1304+
struct iov_iter *to, int *retry_op,
1305+
u64 *last_objver);
13031306
extern int ceph_release(struct inode *inode, struct file *filp);
13041307
extern void ceph_fill_inline_data(struct inode *inode, struct page *locked_page,
13051308
char *data, size_t len);

0 commit comments

Comments
 (0)