Fh *f = new Fh;
if (fhp) *fhp = f;
f->mode = cmode;
+ if (flags & O_APPEND)
+ f->append = true;
// inode
assert(in);
// use/adjust fd pos?
if (offset < 0) {
lock_fh_pos(f);
+ /*
+ * FIXME: this is racy in that we may block _after_ this point waiting for caps, and inode.size may
+ * change out from under us.
+ */
+ if (f->append)
+ f->pos = in->inode.size; // O_APPEND.
offset = f->pos;
f->pos = offset+size;
unlock_fh_pos(f);
bool is_lazy() { return mode & O_LAZY; }
+ bool append;
bool pos_locked; // pos is currently in use
list<Cond*> pos_waiters; // waiters for pos
- Fh() : inode(0), pos(0), mds(0), mode(0), pos_locked(false) {}
+ Fh() : inode(0), pos(0), mds(0), mode(0), append(false), pos_locked(false) {}
};