return rval;
}
-int Client::_do_filelock(Inode *in, int lock_type, int op, int sleep,
+int Client::_do_filelock(Inode *in, Fh *fh, int lock_type, int op, int sleep,
struct flock *fl, uint64_t owner)
{
ldout(cct, 10) << "_do_filelock ino " << in->ino
lock_state = in->flock_locks;
} else
assert(0);
+ _update_lock_state(fl, owner, lock_state);
- ceph_filelock filelock;
- _convert_flock(fl, owner, &filelock);
- if (filelock.type == CEPH_LOCK_UNLOCK) {
- list<ceph_filelock> activated_locks;
- lock_state->remove_lock(filelock, activated_locks);
- } else {
- bool r = lock_state->add_lock(filelock, false, false);
- assert(r);
+ if (fh) {
+ if (lock_type == CEPH_LOCK_FCNTL) {
+ if (!fh->fcntl_locks)
+ fh->fcntl_locks = new ceph_lock_state_t(cct);
+ lock_state = fh->fcntl_locks;
+ } else {
+ if (!fh->flock_locks)
+ fh->flock_locks = new ceph_lock_state_t(cct);
+ lock_state = fh->flock_locks;
+ }
+ _update_lock_state(fl, owner, lock_state);
}
} else
assert(0);
fl.l_start = p->second.start;
fl.l_len = p->second.length;
fl.l_pid = p->second.pid;
- _do_filelock(in, p->first, CEPH_MDS_OP_SETFILELOCK, 0, &fl, p->second.owner);
+ _do_filelock(in, NULL, p->first, CEPH_MDS_OP_SETFILELOCK, 0, &fl, p->second.owner);
}
}
-void Client::_convert_flock(struct flock *fl, uint64_t owner, struct ceph_filelock *filelock)
+void Client::_update_lock_state(struct flock *fl, uint64_t owner,
+ ceph_lock_state_t *lock_state)
{
int lock_cmd;
if (F_RDLCK == fl->l_type)
else
lock_cmd = CEPH_LOCK_UNLOCK;;
- filelock->start = fl->l_start;
- filelock->length = fl->l_len;
- filelock->client = 0;
+ ceph_filelock filelock;
+ filelock.start = fl->l_start;
+ filelock.length = fl->l_len;
+ filelock.client = 0;
// see comment in _do_filelock()
- filelock->owner = owner | (1ULL << 63);
- filelock->pid = fl->l_pid;
- filelock->type = lock_cmd;
+ filelock.owner = owner | (1ULL << 63);
+ filelock.pid = fl->l_pid;
+ filelock.type = lock_cmd;
+
+ if (filelock.type == CEPH_LOCK_UNLOCK) {
+ list<ceph_filelock> activated_locks;
+ lock_state->remove_lock(filelock, activated_locks);
+ } else {
+ bool r = lock_state->add_lock(filelock, false, false);
+ assert(r);
+ }
}
int Client::_getlk(Fh *fh, struct flock *fl, uint64_t owner)
{
Inode *in = fh->inode;
ldout(cct, 10) << "_getlk " << fh << " ino " << in->ino << dendl;
- int ret = _do_filelock(in, CEPH_LOCK_FCNTL, CEPH_MDS_OP_GETFILELOCK, 0, fl, owner);
+ int ret = _do_filelock(in, fh, CEPH_LOCK_FCNTL, CEPH_MDS_OP_GETFILELOCK, 0, fl, owner);
return ret;
}
{
Inode *in = fh->inode;
ldout(cct, 10) << "_setlk " << fh << " ino " << in->ino << dendl;
- int ret = _do_filelock(in, CEPH_LOCK_FCNTL, CEPH_MDS_OP_SETFILELOCK, sleep, fl, owner);
- if (ret == 0) {
- if (!fh->fcntl_locks)
- fh->fcntl_locks = new ceph_lock_state_t(cct);
-
- ceph_filelock filelock;
- _convert_flock(fl, owner, &filelock);
-
- if (filelock.type == CEPH_LOCK_UNLOCK) {
- list<ceph_filelock> activated_locks;
- fh->fcntl_locks->remove_lock(filelock, activated_locks);
- } else {
- bool r = fh->fcntl_locks->add_lock(filelock, false, false);
- assert(r);
- }
- }
+ int ret = _do_filelock(in, fh, CEPH_LOCK_FCNTL, CEPH_MDS_OP_SETFILELOCK, sleep, fl, owner);
ldout(cct, 10) << "_setlk " << fh << " ino " << in->ino << " result=" << ret << dendl;
return ret;
}
fl.l_type = type;
fl.l_whence = SEEK_SET;
- int ret = _do_filelock(in, CEPH_LOCK_FLOCK, CEPH_MDS_OP_SETFILELOCK, sleep, &fl, owner);
- if (ret == 0) {
- if (!fh->flock_locks)
- fh->flock_locks = new ceph_lock_state_t(cct);
-
- ceph_filelock filelock;
- _convert_flock(&fl, owner, &filelock);
-
- if (filelock.type == CEPH_LOCK_UNLOCK) {
- list<ceph_filelock> activated_locks;
- fh->flock_locks->remove_lock(filelock, activated_locks);
- } else {
- bool r = fh->flock_locks->add_lock(filelock, false, false);
- assert(r);
- }
- }
+ int ret = _do_filelock(in, fh, CEPH_LOCK_FLOCK, CEPH_MDS_OP_SETFILELOCK, sleep, &fl, owner);
ldout(cct, 10) << "_flock " << fh << " ino " << in->ino << " result=" << ret << dendl;
return ret;
}