Go to the documentation of this file.
26 #if _SQUID_WINDOWS_ || _SQUID_OS2_
28 diskWriteIsComplete(
int fd)
30 return fd_table[fd].disk.write_q ? 0 : 1;
73 auto fd =
xopen(path, mode, 0644);
79 debugs(50, 3,
"error opening file " << path <<
": " <<
xstrerr(xerrno));
99 if ((read_callback =
F->read_handler)) {
100 F->read_handler =
nullptr;
101 read_callback(-1,
F->read_data);
104 if (
F->flags.write_daemon) {
105 #if _SQUID_WINDOWS_ || _SQUID_OS2_
110 while (!diskWriteIsComplete(fd))
113 F->flags.close_request =
true;
114 debugs(6, 2,
"file_close: FD " << fd <<
", delaying close");
124 assert(
F->write_handler ==
nullptr);
128 debugs(6,
F->flags.close_request ? 2 : 5,
"file_close: FD " << fd <<
" really closing");
155 size_t wantCapacity = 0;
158 wantCapacity += q->len - q->buf_offset;
160 const auto wq =
new dwrite_q(wantCapacity);
161 while (
const auto q = fdd->
write_q) {
162 const auto len = q->len - q->buf_offset;
163 memcpy(wq->buf + wq->len, q->buf + q->buf_offset, len);
189 debugs(6, 3,
"diskHandleWrite: FD " << fd);
191 F->flags.write_daemon =
false;
197 debugs(6, 3,
"diskHandleWrite: FD " << fd <<
" writing " <<
215 const auto xerrno = errno;
217 debugs(6, 3,
"diskHandleWrite: FD " << fd <<
" len = " << len);
239 fatal(
"Write failure -- check your disk space and cache.log");
250 while (
const auto q = fdd->
write_q) {
259 if (
const auto q = fdd->
write_q) {
263 if (q->buf_offset > q->len)
265 q <<
"," << (
int) q->buf_offset <<
", " << q->len <<
", " <<
266 len <<
" FD " << fd <<
")");
268 assert(q->buf_offset <= q->len);
270 if (q->buf_offset == q->len) {
284 F->flags.write_daemon =
true;
295 callback(fd, status, len,
cbdata);
315 void const *ptr_to_buf,
325 const auto wq =
new dwrite_q(len,
static_cast<char *
>(
const_cast<void *
>(ptr_to_buf)), free_func);
326 wq->file_offset = file_offset;
328 if (!
F->disk.wrt_handle_data) {
329 F->disk.wrt_handle = handle;
333 assert(
F->disk.wrt_handle_data == handle_data &&
F->disk.wrt_handle == handle);
337 if (
F->disk.write_q ==
nullptr) {
339 F->disk.write_q =
F->disk.write_q_tail = wq;
341 F->disk.write_q_tail->next = wq;
342 F->disk.write_q_tail = wq;
345 if (!
F->flags.write_daemon) {
370 #if WRITES_MAINTAIN_DISK_OFFSET
371 if (
F->disk.offset != ctrl_dat->
offset) {
375 debugs(6, 3,
"diskHandleRead: FD " << fd <<
" seeking to offset " << ctrl_dat->
offset);
377 if (lseek(fd, ctrl_dat->
offset, SEEK_SET) == -1) {
384 F->disk.offset = ctrl_dat->
offset;
392 F->disk.offset += len;
407 }
else if (len == 0) {
424 file_read(
int fd,
char *buf,
int req_len, off_t offset,
DRCB * handler,
void *client_data)
436 if (unlink(s) < 0 && !quiet) {
445 debugs(21, 2,
"renaming " << from <<
" to " << to);
452 #if _SQUID_OS2_ || _SQUID_WINDOWS_
460 debugs(21, (xerrno == ENOENT ? 2 :
DBG_IMPORTANT),
"ERROR: Cannot rename " << from <<
" to " << to <<
": " <<
xstrerr(xerrno));
486 #define fsbtoblk(num, fsbs, bs) \
487 (((fsbs) != 0 && (fsbs) < (bs)) ? \
488 (num) / ((bs) / (fsbs)) : (num) * ((fsbs) / (bs)))
490 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)
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)
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)
struct StatCounters::@115::@119 disk
int xopen(const char *filename, int oflag, int pmode=0)
POSIX open(2) equivalent.
struct StatCounters::@115 syscalls
void safeunlink(const char *s, int quiet)
void fd_close(const int fd)
int xclose(int fd)
POSIX close(2) equivalent.
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 *)