mirror of
https://github.com/samba-team/samba.git
synced 2025-02-02 09:47:23 +03:00
tdb: add utility function check_merge_with_left_record()
Check whether the record left of a given freelist record is also a freelist record, and if so, merge the two records. Signed-off-by: Michael Adam <obnox@samba.org> Reviewed-by: Volker Lendecke <vl@samba.org>
This commit is contained in:
parent
66f3330be8
commit
117807cd2d
@ -190,6 +190,56 @@ static int merge_with_left_record(struct tdb_context *tdb,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether the record left of a given freelist record is
|
||||
* also a freelist record, and if so, merge the two records.
|
||||
*
|
||||
* Return code:
|
||||
* -1 upon error
|
||||
* 0 if left was not a free record
|
||||
* 1 if left was free and successfully merged.
|
||||
*
|
||||
* The currend record is handed in with pointer and fully read record.
|
||||
*
|
||||
* The left record pointer and struct can be retrieved as result
|
||||
* in lp and lr;
|
||||
*/
|
||||
static int check_merge_with_left_record(struct tdb_context *tdb,
|
||||
tdb_off_t rec_ptr,
|
||||
struct tdb_record *rec,
|
||||
tdb_off_t *lp,
|
||||
struct tdb_record *lr)
|
||||
{
|
||||
tdb_off_t left_ptr;
|
||||
struct tdb_record left_rec;
|
||||
int ret;
|
||||
|
||||
ret = read_record_on_left(tdb, rec_ptr, &left_ptr, &left_rec);
|
||||
if (ret != 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (left_rec.magic != TDB_FREE_MAGIC) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* It's free - expand to include it. */
|
||||
ret = merge_with_left_record(tdb, left_ptr, &left_rec, rec);
|
||||
if (ret != 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (lp != NULL) {
|
||||
*lp = left_ptr;
|
||||
}
|
||||
|
||||
if (lr != NULL) {
|
||||
*lr = left_rec;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an element into the freelist.
|
||||
*
|
||||
|
Loading…
x
Reference in New Issue
Block a user