common.c 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include "kublk.h"
  3. void backing_file_tgt_deinit(struct ublk_dev *dev)
  4. {
  5. int i;
  6. for (i = 1; i < dev->nr_fds; i++) {
  7. fsync(dev->fds[i]);
  8. close(dev->fds[i]);
  9. }
  10. }
  11. int backing_file_tgt_init(struct ublk_dev *dev, unsigned int nr_direct)
  12. {
  13. int fd, i;
  14. ublk_assert(dev->nr_fds == 1);
  15. for (i = 0; i < dev->tgt.nr_backing_files; i++) {
  16. char *file = dev->tgt.backing_file[i];
  17. unsigned long bytes;
  18. struct stat st;
  19. ublk_dbg(UBLK_DBG_DEV, "%s: file %d: %s\n", __func__, i, file);
  20. fd = open(file, O_RDWR | (i < nr_direct ? O_DIRECT : 0));
  21. if (fd < 0) {
  22. ublk_err("%s: backing file %s can't be opened: %s\n",
  23. __func__, file, strerror(errno));
  24. return -EBADF;
  25. }
  26. if (fstat(fd, &st) < 0) {
  27. close(fd);
  28. return -EBADF;
  29. }
  30. if (S_ISREG(st.st_mode))
  31. bytes = st.st_size;
  32. else if (S_ISBLK(st.st_mode)) {
  33. if (ioctl(fd, BLKGETSIZE64, &bytes) != 0)
  34. return -1;
  35. } else {
  36. return -EINVAL;
  37. }
  38. dev->tgt.backing_file_size[i] = bytes;
  39. dev->fds[dev->nr_fds] = fd;
  40. dev->nr_fds += 1;
  41. }
  42. return 0;
  43. }