summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/ntdb/io.c116
-rw-r--r--lib/ntdb/private.h25
-rw-r--r--lib/ntdb/transaction.c23
3 files changed, 114 insertions, 50 deletions
diff --git a/lib/ntdb/io.c b/lib/ntdb/io.c
index 138a405dda3..b0588132e03 100644
--- a/lib/ntdb/io.c
+++ b/lib/ntdb/io.c
@@ -238,27 +238,6 @@ enum NTDB_ERROR zero_out(struct ntdb_context *ntdb, ntdb_off_t off, ntdb_len_t l
return ecode;
}
-ntdb_off_t ntdb_read_off(struct ntdb_context *ntdb, ntdb_off_t off)
-{
- ntdb_off_t ret;
- enum NTDB_ERROR ecode;
-
- if (likely(!(ntdb->flags & NTDB_CONVERT))) {
- ntdb_off_t *p = ntdb->io->direct(ntdb, off, sizeof(*p), false);
- if (NTDB_PTR_IS_ERR(p)) {
- return NTDB_ERR_TO_OFF(NTDB_PTR_ERR(p));
- }
- if (p)
- return *p;
- }
-
- ecode = ntdb_read_convert(ntdb, off, &ret, sizeof(ret));
- if (ecode != NTDB_SUCCESS) {
- return NTDB_ERR_TO_OFF(ecode);
- }
- return ret;
-}
-
/* write a lump of data at a specified offset */
static enum NTDB_ERROR ntdb_write(struct ntdb_context *ntdb, ntdb_off_t off,
const void *buf, ntdb_len_t len)
@@ -359,27 +338,6 @@ enum NTDB_ERROR ntdb_read_convert(struct ntdb_context *ntdb, ntdb_off_t off,
return ecode;
}
-enum NTDB_ERROR ntdb_write_off(struct ntdb_context *ntdb,
- ntdb_off_t off, ntdb_off_t val)
-{
- if (ntdb->flags & NTDB_RDONLY) {
- return ntdb_logerr(ntdb, NTDB_ERR_RDONLY, NTDB_LOG_USE_ERROR,
- "Write to read-only database");
- }
-
- if (likely(!(ntdb->flags & NTDB_CONVERT))) {
- ntdb_off_t *p = ntdb->io->direct(ntdb, off, sizeof(*p), true);
- if (NTDB_PTR_IS_ERR(p)) {
- return NTDB_PTR_ERR(p);
- }
- if (p) {
- *p = val;
- return NTDB_SUCCESS;
- }
- }
- return ntdb_write_convert(ntdb, off, &val, sizeof(val));
-}
-
static void *_ntdb_alloc_read(struct ntdb_context *ntdb, ntdb_off_t offset,
ntdb_len_t len, unsigned int prefix)
{
@@ -607,6 +565,63 @@ static void *ntdb_direct(struct ntdb_context *ntdb, ntdb_off_t off, size_t len,
return (char *)ntdb->file->map_ptr + off;
}
+static ntdb_off_t ntdb_read_normal_off(struct ntdb_context *ntdb,
+ ntdb_off_t off)
+{
+ ntdb_off_t ret;
+ enum NTDB_ERROR ecode;
+ ntdb_off_t *p;
+
+ p = ntdb_direct(ntdb, off, sizeof(*p), false);
+ if (NTDB_PTR_IS_ERR(p)) {
+ return NTDB_ERR_TO_OFF(NTDB_PTR_ERR(p));
+ }
+ if (likely(p)) {
+ return *p;
+ }
+
+ ecode = ntdb_read(ntdb, off, &ret, sizeof(ret));
+ if (ecode != NTDB_SUCCESS) {
+ return NTDB_ERR_TO_OFF(ecode);
+ }
+ return ret;
+}
+
+static ntdb_off_t ntdb_read_convert_off(struct ntdb_context *ntdb,
+ ntdb_off_t off)
+{
+ ntdb_off_t ret;
+ enum NTDB_ERROR ecode;
+
+ ecode = ntdb_read_convert(ntdb, off, &ret, sizeof(ret));
+ if (ecode != NTDB_SUCCESS) {
+ return NTDB_ERR_TO_OFF(ecode);
+ }
+ return ret;
+}
+
+static enum NTDB_ERROR ntdb_write_normal_off(struct ntdb_context *ntdb,
+ ntdb_off_t off, ntdb_off_t val)
+{
+ ntdb_off_t *p;
+
+ p = ntdb_direct(ntdb, off, sizeof(*p), true);
+ if (NTDB_PTR_IS_ERR(p)) {
+ return NTDB_PTR_ERR(p);
+ }
+ if (likely(p)) {
+ *p = val;
+ return NTDB_SUCCESS;
+ }
+ return ntdb_write(ntdb, off, &val, sizeof(val));
+}
+
+static enum NTDB_ERROR ntdb_write_convert_off(struct ntdb_context *ntdb,
+ ntdb_off_t off, ntdb_off_t val)
+{
+ return ntdb_write_convert(ntdb, off, &val, sizeof(val));
+}
+
void ntdb_inc_seqnum(struct ntdb_context *ntdb)
{
ntdb_off_t seq;
@@ -641,6 +656,18 @@ static const struct ntdb_methods io_methods = {
ntdb_normal_oob,
ntdb_expand_file,
ntdb_direct,
+ ntdb_read_normal_off,
+ ntdb_write_normal_off,
+};
+
+static const struct ntdb_methods io_convert_methods = {
+ ntdb_read,
+ ntdb_write,
+ ntdb_normal_oob,
+ ntdb_expand_file,
+ ntdb_direct,
+ ntdb_read_convert_off,
+ ntdb_write_convert_off,
};
/*
@@ -648,5 +675,8 @@ static const struct ntdb_methods io_methods = {
*/
void ntdb_io_init(struct ntdb_context *ntdb)
{
- ntdb->io = &io_methods;
+ if (ntdb->flags & NTDB_CONVERT)
+ ntdb->io = &io_convert_methods;
+ else
+ ntdb->io = &io_methods;
}
diff --git a/lib/ntdb/private.h b/lib/ntdb/private.h
index f46b5ef9069..488e99a0f98 100644
--- a/lib/ntdb/private.h
+++ b/lib/ntdb/private.h
@@ -367,6 +367,9 @@ struct ntdb_methods {
enum NTDB_ERROR (*oob)(struct ntdb_context *, ntdb_off_t, ntdb_len_t, bool);
enum NTDB_ERROR (*expand_file)(struct ntdb_context *, ntdb_len_t);
void *(*direct)(struct ntdb_context *, ntdb_off_t, size_t, bool);
+ ntdb_off_t (*read_off)(struct ntdb_context *ntdb, ntdb_off_t off);
+ enum NTDB_ERROR (*write_off)(struct ntdb_context *ntdb, ntdb_off_t off,
+ ntdb_off_t val);
};
/*
@@ -467,13 +470,6 @@ void ntdb_access_release(struct ntdb_context *ntdb, const void *p);
/* Commit result of ntdb_acces_write. */
enum NTDB_ERROR ntdb_access_commit(struct ntdb_context *ntdb, void *p);
-/* Convenience routine to get an offset. */
-ntdb_off_t ntdb_read_off(struct ntdb_context *ntdb, ntdb_off_t off);
-
-/* Write an offset at an offset. */
-enum NTDB_ERROR ntdb_write_off(struct ntdb_context *ntdb, ntdb_off_t off,
- ntdb_off_t val);
-
/* Clear an ondisk area. */
enum NTDB_ERROR zero_out(struct ntdb_context *ntdb, ntdb_off_t off, ntdb_len_t len);
@@ -642,6 +638,21 @@ static inline enum NTDB_ERROR ntdb_oob(struct ntdb_context *ntdb,
return ntdb->io->oob(ntdb, off, len, probe);
}
+/* Convenience routine to get an offset. */
+static inline ntdb_off_t ntdb_read_off(struct ntdb_context *ntdb,
+ ntdb_off_t off)
+{
+ return ntdb->io->read_off(ntdb, off);
+}
+
+/* Write an offset at an offset. */
+static inline enum NTDB_ERROR ntdb_write_off(struct ntdb_context *ntdb,
+ ntdb_off_t off,
+ ntdb_off_t val)
+{
+ return ntdb->io->write_off(ntdb, off, val);
+}
+
#ifdef NTDB_TRACE
void ntdb_trace(struct ntdb_context *ntdb, const char *op);
void ntdb_trace_seqnum(struct ntdb_context *ntdb, uint32_t seqnum, const char *op);
diff --git a/lib/ntdb/transaction.c b/lib/ntdb/transaction.c
index a265252174b..9608be43e8f 100644
--- a/lib/ntdb/transaction.c
+++ b/lib/ntdb/transaction.c
@@ -393,12 +393,35 @@ static void *transaction_direct(struct ntdb_context *ntdb, ntdb_off_t off,
return ntdb->transaction->io_methods->direct(ntdb, off, len, false);
}
+static ntdb_off_t transaction_read_off(struct ntdb_context *ntdb,
+ ntdb_off_t off)
+{
+ ntdb_off_t ret;
+ enum NTDB_ERROR ecode;
+
+ ecode = transaction_read(ntdb, off, &ret, sizeof(ret));
+ ntdb_convert(ntdb, &ret, sizeof(ret));
+ if (ecode != NTDB_SUCCESS) {
+ return NTDB_ERR_TO_OFF(ecode);
+ }
+ return ret;
+}
+
+static enum NTDB_ERROR transaction_write_off(struct ntdb_context *ntdb,
+ ntdb_off_t off, ntdb_off_t val)
+{
+ ntdb_convert(ntdb, &val, sizeof(val));
+ return transaction_write(ntdb, off, &val, sizeof(val));
+}
+
static const struct ntdb_methods transaction_methods = {
transaction_read,
transaction_write,
transaction_oob,
transaction_expand_file,
transaction_direct,
+ transaction_read_off,
+ transaction_write_off,
};
/*