Project

General

Profile

Submit #2783 » 0001-sbin-hammer-add-get_ondisk.patch

tkusumi, 02/04/2015 11:04 AM

View differences:

sbin/hammer/ondisk.c
struct buffer_info **bufferp);
static hammer_off_t alloc_bigblock(struct volume_info *volume, int zone);
static void get_buffer_readahead(struct buffer_info *base);
static __inline void *get_ondisk(hammer_off_t buf_offset,
struct buffer_info **bufferp, int isnew);
#if 0
static void init_fifo_head(hammer_fifo_head_t head, u_int16_t hdr_type);
static hammer_off_t hammer_alloc_fifo(int32_t base_bytes, int32_t ext_bytes,
......
}
}
/*
* Retrieve a pointer to a buffer data given a buffer offset. The underlying
* bufferp is freed if isnew or the offset is beyond cached ondisk data.
* If bufferp is freed a referenced buffer is loaded into it.
*/
void *
get_buffer_data(hammer_off_t buf_offset, struct buffer_info **bufferp,
int isnew)
......
buffer = *bufferp = NULL;
}
}
if (buffer == NULL)
buffer = *bufferp = get_buffer(buf_offset, isnew);
if (buffer == NULL)
return (NULL);
return((char *)buffer->ondisk + ((int32_t)buf_offset & HAMMER_BUFMASK));
return get_ondisk(buf_offset, bufferp, isnew);
}
/*
......
hammer_node_ondisk_t
get_node(hammer_off_t node_offset, struct buffer_info **bufp)
{
struct buffer_info *buf;
if (*bufp)
if (*bufp) {
rel_buffer(*bufp);
*bufp = buf = get_buffer(node_offset, 0);
if (buf) {
return((void *)((char *)buf->ondisk +
(int32_t)(node_offset & HAMMER_BUFMASK)));
} else {
return(NULL);
*bufp = NULL;
}
return get_ondisk(node_offset, bufp, 0);
}
/*
* Return a pointer to a buffer data given a buffer offset.
* If *bufferp is NULL acquire the buffer otherwise use that buffer.
*/
static __inline
void *
get_ondisk(hammer_off_t buf_offset, struct buffer_info **bufferp,
int isnew)
{
struct buffer_info *buffer;
buffer = *bufferp;
if (buffer == NULL) {
buffer = *bufferp = get_buffer(buf_offset, isnew);
if (buffer == NULL)
return(NULL);
}
return (char *)buffer->ondisk +
((int32_t)buf_offset & HAMMER_BUFMASK);
}
/*
(1-1/2)