cofs.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /*
  2. * Virtio 9p backend
  3. *
  4. * Copyright IBM, Corp. 2011
  5. *
  6. * Authors:
  7. * Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
  8. *
  9. * This work is licensed under the terms of the GNU GPL, version 2. See
  10. * the COPYING file in the top-level directory.
  11. *
  12. */
  13. #include "fsdev/qemu-fsdev.h"
  14. #include "qemu-thread.h"
  15. #include "qemu-coroutine.h"
  16. #include "virtio-9p-coth.h"
  17. int v9fs_co_readlink(V9fsState *s, V9fsString *path, V9fsString *buf)
  18. {
  19. int err;
  20. ssize_t len;
  21. buf->data = g_malloc(PATH_MAX);
  22. v9fs_co_run_in_worker(
  23. {
  24. len = s->ops->readlink(&s->ctx, path->data,
  25. buf->data, PATH_MAX - 1);
  26. if (len > -1) {
  27. buf->size = len;
  28. buf->data[len] = 0;
  29. err = 0;
  30. } else {
  31. err = -errno;
  32. }
  33. });
  34. if (err) {
  35. g_free(buf->data);
  36. buf->data = NULL;
  37. buf->size = 0;
  38. }
  39. return err;
  40. }
  41. int v9fs_co_statfs(V9fsState *s, V9fsString *path, struct statfs *stbuf)
  42. {
  43. int err;
  44. v9fs_co_run_in_worker(
  45. {
  46. err = s->ops->statfs(&s->ctx, path->data, stbuf);
  47. if (err < 0) {
  48. err = -errno;
  49. }
  50. });
  51. return err;
  52. }
  53. int v9fs_co_chmod(V9fsState *s, V9fsString *path, mode_t mode)
  54. {
  55. int err;
  56. FsCred cred;
  57. cred_init(&cred);
  58. cred.fc_mode = mode;
  59. v9fs_co_run_in_worker(
  60. {
  61. err = s->ops->chmod(&s->ctx, path->data, &cred);
  62. if (err < 0) {
  63. err = -errno;
  64. }
  65. });
  66. return err;
  67. }
  68. int v9fs_co_utimensat(V9fsState *s, V9fsString *path,
  69. struct timespec times[2])
  70. {
  71. int err;
  72. v9fs_co_run_in_worker(
  73. {
  74. err = s->ops->utimensat(&s->ctx, path->data, times);
  75. if (err < 0) {
  76. err = -errno;
  77. }
  78. });
  79. return err;
  80. }
  81. int v9fs_co_chown(V9fsState *s, V9fsString *path, uid_t uid, gid_t gid)
  82. {
  83. int err;
  84. FsCred cred;
  85. cred_init(&cred);
  86. cred.fc_uid = uid;
  87. cred.fc_gid = gid;
  88. v9fs_co_run_in_worker(
  89. {
  90. err = s->ops->chown(&s->ctx, path->data, &cred);
  91. if (err < 0) {
  92. err = -errno;
  93. }
  94. });
  95. return err;
  96. }
  97. int v9fs_co_truncate(V9fsState *s, V9fsString *path, off_t size)
  98. {
  99. int err;
  100. v9fs_co_run_in_worker(
  101. {
  102. err = s->ops->truncate(&s->ctx, path->data, size);
  103. if (err < 0) {
  104. err = -errno;
  105. }
  106. });
  107. return err;
  108. }
  109. int v9fs_co_mknod(V9fsState *s, V9fsString *path, uid_t uid,
  110. gid_t gid, dev_t dev, mode_t mode)
  111. {
  112. int err;
  113. FsCred cred;
  114. cred_init(&cred);
  115. cred.fc_uid = uid;
  116. cred.fc_gid = gid;
  117. cred.fc_mode = mode;
  118. cred.fc_rdev = dev;
  119. v9fs_co_run_in_worker(
  120. {
  121. err = s->ops->mknod(&s->ctx, path->data, &cred);
  122. if (err < 0) {
  123. err = -errno;
  124. }
  125. });
  126. return err;
  127. }
  128. int v9fs_co_remove(V9fsState *s, V9fsString *path)
  129. {
  130. int err;
  131. v9fs_co_run_in_worker(
  132. {
  133. err = s->ops->remove(&s->ctx, path->data);
  134. if (err < 0) {
  135. err = -errno;
  136. }
  137. });
  138. return err;
  139. }
  140. int v9fs_co_rename(V9fsState *s, V9fsString *oldpath, V9fsString *newpath)
  141. {
  142. int err;
  143. v9fs_co_run_in_worker(
  144. {
  145. err = s->ops->rename(&s->ctx, oldpath->data, newpath->data);
  146. if (err < 0) {
  147. err = -errno;
  148. }
  149. });
  150. return err;
  151. }