int ext2_fsync_r (struct _reent *r, int fd) { ext2_log_trace("fd %p\n", (void *) fd); ext2_file_state* file = STATE(fd); int ret = 0; // Sanity check if (!file || !file->fd) { r->_errno = EINVAL; return -1; } // Lock ext2Lock(file->vd); // Sync the file (and its attributes) to disc ret = ext2fs_file_flush(file->fd); if (ret) r->_errno = ret; // Unlock ext2Unlock(file->vd); return ret; }
/* * Flush data buffers to disk. */ static errcode_t inode_flush(io_channel channel) { struct inode_private_data *data; EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL); data = (struct inode_private_data *) channel->private_data; EXT2_CHECK_MAGIC(data, EXT2_ET_MAGIC_INODE_IO_CHANNEL); return ext2fs_file_flush(data->file); }
size_t do_write (ext2_file_t efile, const char *buf, size_t size, off_t offset) { int rt; const char *tmp; unsigned int wr; unsigned long long npos; unsigned long long fsize; debugf("enter"); rt = ext2fs_file_get_lsize(efile, &fsize); if (rt != 0) { debugf("ext2fs_file_get_lsize(efile, &fsize); failed"); return rt; } if (offset + size > fsize) { rt = ext2fs_file_set_size2(efile, offset + size); if (rt) { debugf("extfs_file_set_size(efile, %lld); failed", offset + size); return rt; } } rt = ext2fs_file_llseek(efile, offset, SEEK_SET, &npos); if (rt) { debugf("ext2fs_file_lseek(efile, %lld, SEEK_SET, &npos); failed", offset); return rt; } for (rt = 0, wr = 0, tmp = buf; size > 0 && rt == 0; size -= wr, tmp += wr) { rt = ext2fs_file_write(efile, tmp, size, &wr); debugf("rt: %d, size: %u, written: %u", rt, size, wr); } if (rt) { debugf("ext2fs_file_write(edile, tmp, size, &wr); failed"); return rt; } rt = ext2fs_file_flush(efile); if (rt) { debugf("ext2_file_flush(efile); failed"); return rt; } debugf("leave"); return wr; }
size_t do_write (ext2_file_t efile, const char *buf, size_t size, off_t offset) { int rt; const char *tmp; unsigned int wr; unsigned long long npos; unsigned long long fsize; debugf("enter"); rt = ext2fs_file_get_lsize(efile, &fsize); if (rt != 0) { debugf("ext2fs_file_get_lsize(efile, &fsize); failed"); return rt; } if (offset + size > fsize) { rt = ext2fs_file_set_lsize(efile, offset + size); if (rt) { debugf("extfs_file_set_size(efile, %lld); failed", offset + size); return rt; } } char c[] = "10"; rt = ext2fs_file_write(efile, c, 2, &wr); if (rt) { debugf("ext2fs_file_write(edile, tmp, size, &wr); failed"); return rt; } rt = ext2fs_file_flush(efile); if (rt) { debugf("ext2_file_flush(efile); failed"); return rt; } debugf("leave"); return size; }