struct buffer_head *blockdirty(struct buffer_head *buffer, unsigned newdelta) { map_t *map = buffer->map; assert(buffer->state < BUFFER_STATES); buftrace("---- before: fork buffer %p ----", buffer); if (buffer_dirty(buffer)) { if (buffer_already_dirty(buffer, newdelta)) return buffer; /* Buffer can't modify already, we have to fork buffer */ buftrace("---- fork buffer %p ----", buffer); struct buffer_head *clone = new_buffer(map); if (IS_ERR(clone)) return clone; /* Create the cloned buffer */ memcpy(bufdata(clone), bufdata(buffer), bufsize(buffer)); clone->index = buffer->index; /* Replace the buffer by cloned buffer. */ remove_buffer_hash(buffer); insert_buffer_hash(clone); /* * The refcount of buffer is used for backend. So, the * backend has to free this buffer (blockput(buffer)) */ buffer = clone; } __tux3_mark_buffer_dirty(buffer, newdelta); return buffer; }
static int bnode_need_redirect(struct sb *sb, struct buffer_head *buffer) { if(DEBUG_MODE_K==1) { printf("\t\t\t\t%25s[K] %25s %4d #in\n",__FILE__,__func__,__LINE__); } /* If this is not re-dirty for sb->unify, we need to redirect */ return !buffer_already_dirty(buffer, sb->unify); }
static int bnode_need_redirect(struct sb *sb, struct buffer_head *buffer) { /* If this is not re-dirty for sb->rollup, we need to redirect */ return !buffer_already_dirty(buffer, sb->rollup); }