summarylogtreecommitdiffstats
path: root/qemu-9.2.2-libnfs6.patch
blob: 0208de38c585ccfc49812e5b89f26092c244003a (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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
diff -Nurp qemu-9.2.2/block/nfs.c qemu-9.2.2-libnfs6/block/nfs.c
--- qemu-9.2.2/block/nfs.c	2025-02-24 15:36:36.000000000 +0100
+++ qemu-9.2.2-libnfs6/block/nfs.c	2025-03-04 12:48:22.163719876 +0100
@@ -70,7 +70,9 @@ typedef struct NFSRPC {
     BlockDriverState *bs;
     int ret;
     int complete;
+#ifndef LIBNFS_API_V2
     QEMUIOVector *iov;
+#endif
     struct stat *st;
     Coroutine *co;
     NFSClient *client;
@@ -246,6 +248,7 @@ nfs_co_generic_cb(int ret, struct nfs_co
     NFSRPC *task = private_data;
     task->ret = ret;
     assert(!task->st);
+#ifndef LIBNFS_API_V2
     if (task->ret > 0 && task->iov) {
         if (task->ret <= task->iov->size) {
             qemu_iovec_from_buf(task->iov, 0, data, task->ret);
@@ -253,6 +256,7 @@ nfs_co_generic_cb(int ret, struct nfs_co
             task->ret = -EIO;
         }
     }
+#endif
     if (task->ret < 0) {
         error_report("NFS Error: %s", nfs_get_error(nfs));
     }
@@ -266,15 +270,43 @@ static int coroutine_fn nfs_co_preadv(Bl
 {
     NFSClient *client = bs->opaque;
     NFSRPC task;
+#ifdef LIBNFS_API_V2
+    char *buf = NULL;
+    bool my_buffer = false;
+#endif
 
     nfs_co_init_task(bs, &task);
+
+#ifdef LIBNFS_API_V2
+    if (iov->niov != 1) {
+        buf = g_try_malloc(bytes);
+        if (bytes && buf == NULL) {
+            return -ENOMEM;
+        }
+        my_buffer = true;
+    } else {
+        buf = iov->iov[0].iov_base;
+    }
+#else
     task.iov = iov;
+#endif
 
     WITH_QEMU_LOCK_GUARD(&client->mutex) {
+#ifdef LIBNFS_API_V2
+        if (nfs_pread_async(client->context, client->fh,
+                            buf, bytes, offset,
+                            nfs_co_generic_cb, &task) != 0) {
+            if (my_buffer) {
+                g_free(buf);
+            }
+            return -ENOMEM;
+        }
+#else
         if (nfs_pread_async(client->context, client->fh,
                             offset, bytes, nfs_co_generic_cb, &task) != 0) {
             return -ENOMEM;
         }
+#endif
 
         nfs_set_events(client);
     }
@@ -282,6 +314,15 @@ static int coroutine_fn nfs_co_preadv(Bl
         qemu_coroutine_yield();
     }
 
+#ifdef LIBNFS_API_V2
+    if (task.ret > 0) {
+        qemu_iovec_from_buf(iov, 0, buf, task.ret);
+    }
+    if (my_buffer) {
+        g_free(buf);
+    }
+#endif
+
     if (task.ret < 0) {
         return task.ret;
     }
@@ -318,7 +359,11 @@ static int coroutine_fn nfs_co_pwritev(B
 
     WITH_QEMU_LOCK_GUARD(&client->mutex) {
         if (nfs_pwrite_async(client->context, client->fh,
+#ifdef LIBNFS_API_V2
+                             buf, bytes, offset,
+#else
                              offset, bytes, buf,
+#endif
                              nfs_co_generic_cb, &task) != 0) {
             if (my_buffer) {
                 g_free(buf);
diff -Nurp qemu-9.2.2/meson.build qemu-9.2.2-libnfs6/meson.build
--- qemu-9.2.2/meson.build	2025-02-24 15:36:36.000000000 +0100
+++ qemu-9.2.2-libnfs6/meson.build	2025-03-04 12:50:25.273920473 +0100
@@ -1122,7 +1122,7 @@ endif
 
 libnfs = not_found
 if not get_option('libnfs').auto() or have_block
-  libnfs = dependency('libnfs', version: ['>=1.9.3', '<6.0.0'],
+  libnfs = dependency('libnfs', version: '>=1.9.3',
                       required: get_option('libnfs'),
                       method: 'pkg-config')
 endif