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