unsigned Ebofs::_apply_transaction(Transaction& t)
{
+ // verify we have enough space
+ if (t.disk_space_required() > get_free_blocks()*EBOFS_BLOCK_SIZE) {
+ derr(0) << "apply_transaction needs " << t.disk_space_required() << " bytes > "
+ << (get_free_blocks()*EBOFS_BLOCK_SIZE) << " free" << dendl;
+ return -ENOSPC;
+ }
+
// do ops
unsigned r = 0; // bit fields indicate which ops failed.
int bit = 1;
int get_len() { return len ? len : ops.size(); }
int get_btrfs_len() { return blen; }
+ __u64 disk_space_required() {
+ // be conservative!
+ __u64 s = 16384 +
+ (ops.size() + oids.size() + cids.size() + lengths.size()) * 4096;
+ for (vector<bufferlist>::iterator p = bls.begin(); p != bls.end(); p++)
+ s += bls.size() + 4096;
+ return s;
+ }
+
bool have_op() {
return opp < ops.size();
}