int default_write(uint64_t oid, struct siocb *iocb) { int flags = get_open_flags(oid, false), fd, ret = SD_RES_SUCCESS; char path[PATH_MAX]; ssize_t size; if (iocb->epoch < sys_epoch()) { dprintf("%"PRIu32" sys %"PRIu32"\n", iocb->epoch, sys_epoch()); return SD_RES_OLD_NODE_VER; } get_obj_path(oid, path); if (iocb->flags & SD_FLAG_CMD_CACHE && is_disk_cache_enabled()) flags &= ~O_DSYNC; fd = open(path, flags, def_fmode); if (fd < 0) return err_to_sderr(oid, errno); size = xpwrite(fd, iocb->buf, iocb->length, iocb->offset); if (size != iocb->length) { eprintf("failed to write object %"PRIx64", path=%s, offset=%" PRId64", size=%"PRId32", result=%zd, %m\n", oid, path, iocb->offset, iocb->length, size); ret = err_to_sderr(oid, errno); goto out; } out: close(fd); return ret; }
static int get_open_flags(uint64_t oid, bool create, int fl) { int flags = O_DSYNC | O_RDWR; if ((fl & SD_FLAG_CMD_CACHE && is_disk_cache_enabled()) || uatomic_is_true(&sys->use_journal) || sys->nosync == true) flags &= ~O_DSYNC; /* * We can not use DIO for inode object because it is not 512B aligned. */ if (sys->backend_dio && is_data_obj(oid)) flags |= O_DIRECT; if (create) flags |= O_CREAT | O_EXCL; return flags; }