]> git.ipfire.org Git - thirdparty/squid.git/blob - src/store_io.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / store_io.cc
1 #include "squid.h"
2 #include "MemObject.h"
3 #include "SquidConfig.h"
4 #include "Store.h"
5 #include "SwapDir.h"
6
7 StoreIoStats store_io_stats;
8
9 /*
10 * submit a request to create a cache object for writing.
11 * The StoreEntry structure is sent as a hint to the filesystem
12 * to what will be stored in this object, to allow the filesystem
13 * to select different polices depending on object size or type.
14 */
15 StoreIOState::Pointer
16 storeCreate(StoreEntry * e, StoreIOState::STFNCB * file_callback, StoreIOState::STIOCB * close_callback, void *callback_data)
17 {
18 assert (e);
19
20 ++store_io_stats.create.calls;
21
22 /*
23 * Pick the swapdir
24 * We assume that the header has been packed by now ..
25 */
26 const sdirno dirn = storeDirSelectSwapDir(e);
27
28 if (dirn == -1) {
29 debugs(20, 2, "storeCreate: no swapdirs for " << *e);
30 ++store_io_stats.create.select_fail;
31 return NULL;
32 }
33
34 debugs(20, 2, "storeCreate: Selected dir " << dirn << " for " << *e);
35 SwapDir *SD = dynamic_cast<SwapDir *>(INDEXSD(dirn));
36
37 /* Now that we have a fs to use, call its storeCreate function */
38 StoreIOState::Pointer sio = SD->createStoreIO(*e, file_callback, close_callback, callback_data);
39
40 if (sio == NULL)
41 ++store_io_stats.create.create_fail;
42 else
43 ++store_io_stats.create.success;
44
45 return sio;
46 }
47
48 /*
49 * storeOpen() is purely for reading ..
50 */
51 StoreIOState::Pointer
52 storeOpen(StoreEntry * e, StoreIOState::STFNCB * file_callback, StoreIOState::STIOCB * callback,
53 void *callback_data)
54 {
55 return dynamic_cast<SwapDir *>(e->store().getRaw())->openStoreIO(*e, file_callback, callback, callback_data);
56 }
57
58 void
59 storeClose(StoreIOState::Pointer sio, int how)
60 {
61 if (sio->flags.closing) {
62 debugs(20,3,HERE << "storeClose: flags.closing already set, bailing");
63 return;
64 }
65
66 sio->flags.closing = true;
67
68 debugs(20,3,HERE << "storeClose: calling sio->close(" << how << ")");
69 sio->close(how);
70 }
71
72 void
73 storeRead(StoreIOState::Pointer sio, char *buf, size_t size, off_t offset, StoreIOState::STRCB * callback, void *callback_data)
74 {
75 sio->read_(buf, size, offset, callback, callback_data);
76 }
77
78 void
79 storeIOWrite(StoreIOState::Pointer sio, char const *buf, size_t size, off_t offset, FREE * free_func)
80 {
81 sio->write(buf,size,offset,free_func);
82 }