Go to the documentation of this file.
25 #if _SQUID_WINDOWS_ || _SQUID_OS2_
27 diskWriteIsComplete(
int fd)
29 return fd_table[fd].disk.write_q ? 0 : 1;
74 fd = open(path, mode, 0644);
80 debugs(50, 3,
"error opening file " << path <<
": " <<
xstrerr(xerrno));
100 if ((read_callback =
F->read_handler)) {
101 F->read_handler =
nullptr;
102 read_callback(-1,
F->read_data);
105 if (
F->flags.write_daemon) {
106 #if _SQUID_WINDOWS_ || _SQUID_OS2_
111 while (!diskWriteIsComplete(fd))
114 F->flags.close_request =
true;
115 debugs(6, 2,
"file_close: FD " << fd <<
", delaying close");
125 assert(
F->write_handler ==
nullptr);
129 debugs(6,
F->flags.close_request ? 2 : 5,
"file_close: FD " << fd <<
" really closing");
156 size_t wantCapacity = 0;
159 wantCapacity += q->len - q->buf_offset;
161 const auto wq =
new dwrite_q(wantCapacity);
162 while (
const auto q = fdd->
write_q) {
163 const auto len = q->len - q->buf_offset;
164 memcpy(wq->buf + wq->len, q->buf + q->buf_offset, len);
190 debugs(6, 3,
"diskHandleWrite: FD " << fd);
192 F->flags.write_daemon =
false;
198 debugs(6, 3,
"diskHandleWrite: FD " << fd <<
" writing " <<
216 const auto xerrno = errno;
218 debugs(6, 3,
"diskHandleWrite: FD " << fd <<
" len = " << len);
240 fatal(
"Write failure -- check your disk space and cache.log");
251 while (
const auto q = fdd->
write_q) {
260 if (
const auto q = fdd->
write_q) {
264 if (q->buf_offset > q->len)
266 q <<
"," << (
int) q->buf_offset <<
", " << q->len <<
", " <<
267 len <<
" FD " << fd <<
")");
269 assert(q->buf_offset <= q->len);
271 if (q->buf_offset == q->len) {
285 F->flags.write_daemon =
true;
296 callback(fd, status, len,
cbdata);
316 void const *ptr_to_buf,
326 const auto wq =
new dwrite_q(len,
static_cast<char *
>(
const_cast<void *
>(ptr_to_buf)), free_func);
327 wq->file_offset = file_offset;
329 if (!
F->disk.wrt_handle_data) {
334 assert(
F->disk.wrt_handle_data == handle_data &&
F->disk.wrt_handle ==
handle);
338 if (
F->disk.write_q ==
nullptr) {
340 F->disk.write_q =
F->disk.write_q_tail = wq;
342 F->disk.write_q_tail->next = wq;
343 F->disk.write_q_tail = wq;
346 if (!
F->flags.write_daemon) {
371 #if WRITES_MAINTAIN_DISK_OFFSET
372 if (
F->disk.offset != ctrl_dat->
offset) {
376 debugs(6, 3,
"diskHandleRead: FD " << fd <<
" seeking to offset " << ctrl_dat->
offset);
378 if (lseek(fd, ctrl_dat->
offset, SEEK_SET) == -1) {
385 F->disk.offset = ctrl_dat->
offset;
393 F->disk.offset += len;
408 }
else if (len == 0) {
425 file_read(
int fd,
char *buf,
int req_len, off_t offset,
DRCB * handler,
void *client_data)
437 if (unlink(s) < 0 && !quiet) {
446 debugs(21, 2,
"renaming " << from <<
" to " << to);
453 #if _SQUID_OS2_ || _SQUID_WINDOWS_
461 debugs(21, (xerrno == ENOENT ? 2 :
DBG_IMPORTANT),
"ERROR: Cannot rename " << from <<
" to " << to <<
": " <<
xstrerr(xerrno));
487 #define fsbtoblk(num, fsbs, bs) \
488 (((fsbs) != 0 && (fsbs) < (bs)) ? \
489 (num) / ((bs) / (fsbs)) : (num) * ((fsbs) / (bs)))
491 fsStats(
const char *path,
int *totl_kb,
int *free_kb,
int *totl_in,
int *free_in)
void fatal(const char *message)
const char * xstrerr(int error)
static PF diskHandleWrite
void fd_bytes(const int fd, const int len, const IoDirection direction)
static void cxx_xfree(void *ptr)
#define cbdataReferenceValidDone(var, ptr)
void commSetCloseOnExec(int)
int fsBlockSize(const char *path, int *blksize)
dwrite_q(const size_t wantCapacity)
static uint32 F(uint32 X, uint32 Y, uint32 Z)
struct StatCounters::@119::@123 disk
void file_read(int fd, char *buf, int req_len, off_t offset, DRCB *handler, void *client_data)
int cbdataReferenceValid(const void *p)
int xstatvfs(const char *path, struct statvfs *sfs)
void fd_open(const int fd, unsigned int, const char *description)
#define cbdataReference(var)
static int do_close(diomsg *r, int)
void DRCB(int, const char *buf, int size, int errflag, void *data)
struct StatCounters::@119 syscalls
const char * rawContent() const
int fsStats(const char *path, int *totl_kb, int *free_kb, int *totl_in, int *free_in)
#define DISK_NO_SPACE_LEFT
size_t len
length of content in buf
FREE * free_func
when set, gets called upon object destruction to free buf
#define cbdataReferenceDone(var)
int FD_WRITE_METHOD(int fd, const char *buf, int len)
size_type length() const
Returns the number of bytes stored in SBuf.
int FD_READ_METHOD(int fd, char *buf, int len)
int ignoreErrno(int ierrno)
void SetSelect(int, unsigned int, PF *, void *, time_t)
Mark an FD to be watched for its IO status.
void file_write(int fd, off_t file_offset, void const *ptr_to_buf, int len, DWCB *handle, void *handle_data, FREE *free_func)
void safeunlink(const char *s, int quiet)
void fd_close(const int fd)
bool FileRename(const SBuf &from, const SBuf &to)
int file_open(const char *path, int mode)
#define fsbtoblk(num, fsbs, bs)
#define debugs(SECTION, LEVEL, CONTENT)
#define COMM_SELECT_WRITE
static void diskCombineWrites(_fde_disk *fdd)
void DWCB(int, int, size_t, void *)