From: Masaki Saeki <saeki.mas...@po.ntts.co.jp> This change is a preparation patch for add store_driver. move the definition of functions that are shared by store_driver
Signed-off-by: Masaki Saeki <saeki.mas...@po.ntts.co.jp> --- sheep/sheep_priv.h | 4 ++ sheep/store/common.c | 85 +++++++++++++++++++++++++++++++++++++++++++++ sheep/store/plain_store.c | 83 ------------------------------------------- 3 files changed, 89 insertions(+), 83 deletions(-) diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h index 3876b31..fe9cd48 100644 --- a/sheep/sheep_priv.h +++ b/sheep/sheep_priv.h @@ -402,6 +402,10 @@ int leave_cluster(void); void queue_cluster_request(struct request *req); +int prepare_iocb(uint64_t oid, const struct siocb *iocb, bool create); +int err_to_sderr(const char *path, uint64_t oid, int err); +int discard(int fd, uint64_t start, uint32_t end); + int update_epoch_log(uint32_t epoch, struct sd_node *nodes, size_t nr_nodes); int inc_and_log_epoch(void); diff --git a/sheep/store/common.c b/sheep/store/common.c index 8843fb8..c681fd0 100644 --- a/sheep/store/common.c +++ b/sheep/store/common.c @@ -9,6 +9,9 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <libgen.h> +#include <linux/falloc.h> + #include "sheep_priv.h" char *obj_path; @@ -17,6 +20,88 @@ char *epoch_path; struct store_driver *sd_store; LIST_HEAD(store_drivers); +#ifndef FALLOC_FL_PUNCH_HOLE +#define FALLOC_FL_PUNCH_HOLE 0x02 +#endif + +#define sector_algined(x) ({ ((x) & (SECTOR_SIZE - 1)) == 0; }) + +static inline bool iocb_is_aligned(const struct siocb *iocb) +{ + return sector_algined(iocb->offset) && sector_algined(iocb->length); +} + +int prepare_iocb(uint64_t oid, const struct siocb *iocb, bool create) +{ + int syncflag = create ? O_SYNC : O_DSYNC; + int flags = syncflag | O_RDWR; + + if (uatomic_is_true(&sys->use_journal) || sys->nosync == true) + flags &= ~syncflag; + + if (sys->backend_dio && iocb_is_aligned(iocb)) { + if (!is_aligned_to_pagesize(iocb->buf)) + panic("Memory isn't aligned to pagesize %p", iocb->buf); + flags |= O_DIRECT; + } + + if (create) + flags |= O_CREAT | O_EXCL; + + return flags; +} + +int err_to_sderr(const char *path, uint64_t oid, int err) +{ + struct stat s; + char p[PATH_MAX], *dir; + + /* Use a temporary buffer since dirname() may modify its argument. */ + pstrcpy(p, sizeof(p), path); + dir = dirname(p); + + sd_debug("%s", path); + switch (err) { + case ENOENT: + if (stat(dir, &s) < 0) { + sd_err("%s corrupted", dir); + return md_handle_eio(dir); + } + sd_debug("object %016" PRIx64 " not found locally", oid); + return SD_RES_NO_OBJ; + case ENOSPC: + /* TODO: stop automatic recovery */ + sd_err("diskfull, oid=%"PRIx64, oid); + return SD_RES_NO_SPACE; + case EMFILE: + case ENFILE: + case EINTR: + case EAGAIN: + case EEXIST: + sd_err("%m, oid=%"PRIx64, oid); + /* make gateway try again */ + return SD_RES_NETWORK_ERROR; + default: + sd_err("oid=%"PRIx64", %m", oid); + return md_handle_eio(dir); + } +} + +int discard(int fd, uint64_t start, uint32_t end) +{ + int ret = xfallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, + start, end - start); + if (ret < 0) { + if (errno == ENOSYS || errno == EOPNOTSUPP) + sd_info("FALLOC_FL_PUNCH_HOLE is not supported " + "on this filesystem"); + else + sd_err("failed to discard object, %m"); + } + + return ret; +} + int update_epoch_log(uint32_t epoch, struct sd_node *nodes, size_t nr_nodes) { int ret, len, nodes_len; diff --git a/sheep/store/plain_store.c b/sheep/store/plain_store.c index efbf129..7304d65 100644 --- a/sheep/store/plain_store.c +++ b/sheep/store/plain_store.c @@ -10,41 +10,9 @@ */ #include <libgen.h> -#include <linux/falloc.h> #include "sheep_priv.h" -#ifndef FALLOC_FL_PUNCH_HOLE -#define FALLOC_FL_PUNCH_HOLE 0x02 -#endif - -#define sector_algined(x) ({ ((x) & (SECTOR_SIZE - 1)) == 0; }) - -static inline bool iocb_is_aligned(const struct siocb *iocb) -{ - return sector_algined(iocb->offset) && sector_algined(iocb->length); -} - -static int prepare_iocb(uint64_t oid, const struct siocb *iocb, bool create) -{ - int syncflag = create ? O_SYNC : O_DSYNC; - int flags = syncflag | O_RDWR; - - if (uatomic_is_true(&sys->use_journal) || sys->nosync == true) - flags &= ~syncflag; - - if (sys->backend_dio && iocb_is_aligned(iocb)) { - if (!is_aligned_to_pagesize(iocb->buf)) - panic("Memory isn't aligned to pagesize %p", iocb->buf); - flags |= O_DIRECT; - } - - if (create) - flags |= O_CREAT | O_EXCL; - - return flags; -} - static int get_store_path(uint64_t oid, uint8_t ec_index, char *path) { if (is_erasure_oid(oid)) { @@ -90,57 +58,6 @@ bool default_exist(uint64_t oid, uint8_t ec_index) return md_exist(oid, ec_index, path); } -static int err_to_sderr(const char *path, uint64_t oid, int err) -{ - struct stat s; - char p[PATH_MAX], *dir; - - /* Use a temporary buffer since dirname() may modify its argument. */ - pstrcpy(p, sizeof(p), path); - dir = dirname(p); - - sd_debug("%s", path); - switch (err) { - case ENOENT: - if (stat(dir, &s) < 0) { - sd_err("%s corrupted", dir); - return md_handle_eio(dir); - } - sd_debug("object %016" PRIx64 " not found locally", oid); - return SD_RES_NO_OBJ; - case ENOSPC: - /* TODO: stop automatic recovery */ - sd_err("diskfull, oid=%"PRIx64, oid); - return SD_RES_NO_SPACE; - case EMFILE: - case ENFILE: - case EINTR: - case EAGAIN: - case EEXIST: - sd_err("%m, oid=%"PRIx64, oid); - /* make gateway try again */ - return SD_RES_NETWORK_ERROR; - default: - sd_err("oid=%"PRIx64", %m", oid); - return md_handle_eio(dir); - } -} - -static int discard(int fd, uint64_t start, uint32_t end) -{ - int ret = xfallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, - start, end - start); - if (ret < 0) { - if (errno == ENOSYS || errno == EOPNOTSUPP) - sd_info("FALLOC_FL_PUNCH_HOLE is not supported " - "on this filesystem"); - else - sd_err("failed to discard object, %m"); - } - - return ret; -} - /* Trim zero blocks of the beginning and end of the object. */ static int default_trim(int fd, uint64_t oid, const struct siocb *iocb, uint64_t *poffset, uint32_t *plen) -- 1.7.1 -- sheepdog mailing list sheepdog@lists.wpkg.org https://lists.wpkg.org/mailman/listinfo/sheepdog