return SMB2_OPLOCK_LEVEL_BATCH;
} else if (EXCLUSIVE_OPLOCK_TYPE(oplock_type)) {
return SMB2_OPLOCK_LEVEL_EXCLUSIVE;
- } else if (LEVEL_II_OPLOCK_TYPE(oplock_type)) {
+ } else if (oplock_type == LEVEL_II_OPLOCK) {
+ /*
+ * Don't use LEVEL_II_OPLOCK_TYPE here as
+ * this also includes FAKE_LEVEL_II_OPLOCKs
+ * which are internal only.
+ */
return SMB2_OPLOCK_LEVEL_II;
} else {
return SMB2_OPLOCK_LEVEL_NONE;
return status;
}
- if (fsp && fsp->base_fsp) {
+ /* Ok, this looks wrong to me, but appears to
+ * be how SMB2 renames work. CHECK WITH Microsoft !
+ * jra.
+ */
+ if (fsp->oplock_type != NO_OPLOCK) {
+ return NT_STATUS_SHARING_VIOLATION;
+ }
+
+ if (fsp->base_fsp) {
/* newname must be a stream name. */
if (newname[0] != ':') {
return NT_STATUS_NOT_SUPPORTED;