summaryrefslogtreecommitdiff
blob: 07d1ecef037604105778283de71932d91fef587d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
diff --git a/xlators/performance/open-behind/src/open-behind.c b/xlators/performance/open-behind/src/open-behind.c
index 70a144abb5..95e00dbd79 100644
--- a/xlators/performance/open-behind/src/open-behind.c
+++ b/xlators/performance/open-behind/src/open-behind.c
@@ -708,6 +708,32 @@ ob_fstat(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)
     return 0;
 }
 
+int
+ob_seek(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,
+        gf_seek_what_t what, dict_t *xdata)
+{
+    call_stub_t *stub = NULL;
+    fd_t *wind_fd = NULL;
+
+    wind_fd = ob_get_wind_fd(this, fd, NULL);
+
+    stub = fop_seek_stub(frame, default_seek_resume, wind_fd, offset, what,
+                         xdata);
+
+    fd_unref(wind_fd);
+
+    if (!stub)
+        goto err;
+
+    open_and_resume(this, wind_fd, stub);
+
+    return 0;
+err:
+    STACK_UNWIND_STRICT(fstat, frame, -1, ENOMEM, 0, 0);
+
+    return 0;
+}
+
 int
 ob_flush(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)
 {
@@ -1256,6 +1282,7 @@ struct xlator_fops fops = {
     .flush = ob_flush,
     .fsync = ob_fsync,
     .fstat = ob_fstat,
+    .seek = ob_seek,
     .ftruncate = ob_ftruncate,
     .fsetxattr = ob_fsetxattr,
     .setxattr = ob_setxattr,