BOOL is_locked(uint16 smbpid, files_struct * fsp, struct vfs_connection_struct *conn, SMB_BIG_UINT count, SMB_BIG_UINT offset, enum brl_type lock_type) { int snum = conn->snum; BOOL ret; if (count == 0) return (False); if (!lp_locking(snum) || !lp_strict_locking(snum)) return (False); ret = !brl_locktest(fsp->sbuf.st_dev, fsp->sbuf.st_ino, fsp->fnum, smbpid, sys_getpid(), conn->snum, offset, count, lock_type); /* * There is no lock held by an SMB daemon, check to * see if there is a POSIX lock from a UNIX or NFS process. */ if (!ret && lp_posix_locking(snum)) ret = is_posix_locked(fsp, offset, count, lock_type); return ret; }
BOOL is_locked(files_struct *fsp,connection_struct *conn, SMB_BIG_UINT count,SMB_BIG_UINT offset, enum brl_type lock_type, BOOL check_self) { int snum = SNUM(conn); BOOL ret; if (count == 0) return(False); if (!lp_locking(snum) || !lp_strict_locking(snum)) return(False); ret = !brl_locktest(fsp->dev, fsp->inode, fsp->fnum, global_smbpid, sys_getpid(), conn->cnum, offset, count, lock_type, check_self); DEBUG(10,("is_locked: brl start=%.0f len=%.0f %s for file %s\n", (double)offset, (double)count, ret ? "locked" : "unlocked", fsp->fsp_name )); /* * There is no lock held by an SMB daemon, check to * see if there is a POSIX lock from a UNIX or NFS process. */ if(!ret && lp_posix_locking(snum)) { ret = is_posix_locked(fsp, offset, count, lock_type); DEBUG(10,("is_locked: posix start=%.0f len=%.0f %s for file %s\n", (double)offset, (double)count, ret ? "locked" : "unlocked", fsp->fsp_name )); } return ret; }
BOOL is_locked(files_struct *fsp, SMB_BIG_UINT count, SMB_BIG_UINT offset, enum brl_type lock_type) { int snum = SNUM(fsp->conn); int strict_locking = lp_strict_locking(snum); enum brl_flavour lock_flav = lp_posix_cifsu_locktype(); BOOL ret = True; if (count == 0) { return False; } if (!lp_locking(snum) || !strict_locking) { return False; } if (strict_locking == Auto) { if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type) && (lock_type == READ_LOCK || lock_type == WRITE_LOCK)) { DEBUG(10,("is_locked: optimisation - exclusive oplock on file %s\n", fsp->fsp_name )); ret = False; } else if ((fsp->oplock_type == LEVEL_II_OPLOCK) && (lock_type == READ_LOCK)) { DEBUG(10,("is_locked: optimisation - level II oplock on file %s\n", fsp->fsp_name )); ret = False; } else { struct byte_range_lock *br_lck = brl_get_locks(fsp); if (!br_lck) { return False; } ret = !brl_locktest(br_lck, global_smbpid, procid_self(), offset, count, lock_type, lock_flav); byte_range_lock_destructor(br_lck); } } else { struct byte_range_lock *br_lck = brl_get_locks(fsp); if (!br_lck) { return False; } ret = !brl_locktest(br_lck, global_smbpid, procid_self(), offset, count, lock_type, lock_flav); byte_range_lock_destructor(br_lck); } DEBUG(10,("is_locked: flavour = %s brl start=%.0f len=%.0f %s for fnum %d file %s\n", lock_flav_name(lock_flav), (double)offset, (double)count, ret ? "locked" : "unlocked", fsp->fnum, fsp->fsp_name )); return ret; }
bool strict_lock_default(files_struct *fsp, struct lock_struct *plock) { int strict_locking = lp_strict_locking(fsp->conn->params); bool ret = False; if (plock->size == 0) { return True; } if (!lp_locking(fsp->conn->params) || !strict_locking) { return True; } if (strict_locking == Auto) { if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type) && (plock->lock_type == READ_LOCK || plock->lock_type == WRITE_LOCK)) { DEBUG(10,("is_locked: optimisation - exclusive oplock on file %s\n", fsp_str_dbg(fsp))); ret = True; } else if ((fsp->oplock_type == LEVEL_II_OPLOCK) && (plock->lock_type == READ_LOCK)) { DEBUG(10,("is_locked: optimisation - level II oplock on file %s\n", fsp_str_dbg(fsp))); ret = True; } else { struct byte_range_lock *br_lck; br_lck = brl_get_locks_readonly(fsp); if (!br_lck) { return True; } ret = brl_locktest(br_lck, plock->context.smblctx, plock->context.pid, plock->start, plock->size, plock->lock_type, plock->lock_flav); } } else { struct byte_range_lock *br_lck; br_lck = brl_get_locks_readonly(fsp); if (!br_lck) { return True; } ret = brl_locktest(br_lck, plock->context.smblctx, plock->context.pid, plock->start, plock->size, plock->lock_type, plock->lock_flav); } DEBUG(10,("strict_lock_default: flavour = %s brl start=%.0f " "len=%.0f %s for fnum %llu file %s\n", lock_flav_name(plock->lock_flav), (double)plock->start, (double)plock->size, ret ? "unlocked" : "locked", (unsigned long long)plock->fnum, fsp_str_dbg(fsp))); return ret; }