Commit 6c99dfc4 authored by Namjae Jeon's avatar Namjae Jeon
Browse files

ksmbd: fix missing error code in smb2_lock



Dan report a warning that is missing error code in smb2_lock
from static checker. This patch add error code to avoid static checker
warning.

Reported-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: default avatarNamjae Jeon <namjae.jeon@samsung.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 08bdbc6e
Loading
Loading
Loading
Loading
+34 −32
Original line number Diff line number Diff line
@@ -6587,7 +6587,7 @@ int smb2_lock(struct ksmbd_work *work)
	int lock_count;
	int flags = 0;
	int cmd = 0;
	int err = 0, i;
	int err = -EIO, i, rc = 0;
	u64 lock_start, lock_length;
	struct ksmbd_lock *smb_lock = NULL, *cmp_lock, *tmp, *tmp2;
	struct ksmbd_conn *conn;
@@ -6603,7 +6603,7 @@ int smb2_lock(struct ksmbd_work *work)
	if (!fp) {
		ksmbd_debug(SMB, "Invalid file id for lock : %llu\n",
			    le64_to_cpu(req->VolatileFileId));
		rsp->hdr.Status = STATUS_FILE_CLOSED;
		err = -ENOENT;
		goto out2;
	}

@@ -6613,7 +6613,7 @@ int smb2_lock(struct ksmbd_work *work)

	ksmbd_debug(SMB, "lock count is %d\n", lock_count);
	if (!lock_count) {
		rsp->hdr.Status = STATUS_INVALID_PARAMETER;
		err = -EINVAL;
		goto out2;
	}

@@ -6621,10 +6621,8 @@ int smb2_lock(struct ksmbd_work *work)
		flags = le32_to_cpu(lock_ele[i].Flags);

		flock = smb_flock_init(filp);
		if (!flock) {
			rsp->hdr.Status = STATUS_LOCK_NOT_GRANTED;
		if (!flock)
			goto out;
		}

		cmd = smb2_set_flock_flags(flock, flags);

@@ -6662,8 +6660,7 @@ int smb2_lock(struct ksmbd_work *work)
				if (cmp_lock->fl->fl_type != F_UNLCK &&
				    flock->fl_type != F_UNLCK) {
					pr_err("conflict two locks in one request\n");
					rsp->hdr.Status =
						STATUS_INVALID_PARAMETER;
					err = -EINVAL;
					goto out;
				}
			}
@@ -6671,19 +6668,19 @@ int smb2_lock(struct ksmbd_work *work)

		smb_lock = smb2_lock_init(flock, cmd, flags, &lock_list);
		if (!smb_lock) {
			rsp->hdr.Status = STATUS_INVALID_PARAMETER;
			err = -EINVAL;
			goto out;
		}
	}

	list_for_each_entry_safe(smb_lock, tmp, &lock_list, llist) {
		if (smb_lock->cmd < 0) {
			rsp->hdr.Status = STATUS_INVALID_PARAMETER;
			err = -EINVAL;
			goto out;
		}

		if (!(smb_lock->flags & SMB2_LOCKFLAG_MASK)) {
			rsp->hdr.Status = STATUS_INVALID_PARAMETER;
			err = -EINVAL;
			goto out;
		}

@@ -6691,7 +6688,7 @@ int smb2_lock(struct ksmbd_work *work)
		     smb_lock->flags & SMB2_LOCKFLAG_UNLOCK) ||
		    (prior_lock == SMB2_LOCKFLAG_UNLOCK &&
		     !(smb_lock->flags & SMB2_LOCKFLAG_UNLOCK))) {
			rsp->hdr.Status = STATUS_INVALID_PARAMETER;
			err = -EINVAL;
			goto out;
		}

@@ -6744,7 +6741,6 @@ int smb2_lock(struct ksmbd_work *work)
					spin_unlock(&conn->llist_lock);
					read_unlock(&conn_list_lock);
					pr_err("previous lock conflict with zero byte lock range\n");
					rsp->hdr.Status = STATUS_LOCK_NOT_GRANTED;
					goto out;
				}

@@ -6754,7 +6750,6 @@ int smb2_lock(struct ksmbd_work *work)
					spin_unlock(&conn->llist_lock);
					read_unlock(&conn_list_lock);
					pr_err("current lock conflict with zero byte lock range\n");
					rsp->hdr.Status = STATUS_LOCK_NOT_GRANTED;
					goto out;
				}

@@ -6766,8 +6761,6 @@ int smb2_lock(struct ksmbd_work *work)
					spin_unlock(&conn->llist_lock);
					read_unlock(&conn_list_lock);
					pr_err("Not allow lock operation on exclusive lock range\n");
					rsp->hdr.Status =
						STATUS_LOCK_NOT_GRANTED;
					goto out;
				}
			}
@@ -6790,19 +6783,19 @@ int smb2_lock(struct ksmbd_work *work)
		flock = smb_lock->fl;
		list_del(&smb_lock->llist);
retry:
		err = vfs_lock_file(filp, smb_lock->cmd, flock, NULL);
		rc = vfs_lock_file(filp, smb_lock->cmd, flock, NULL);
skip:
		if (flags & SMB2_LOCKFLAG_UNLOCK) {
			if (!err) {
			if (!rc) {
				ksmbd_debug(SMB, "File unlocked\n");
			} else if (err == -ENOENT) {
			} else if (rc == -ENOENT) {
				rsp->hdr.Status = STATUS_NOT_LOCKED;
				goto out;
			}
			locks_free_lock(flock);
			kfree(smb_lock);
		} else {
			if (err == FILE_LOCK_DEFERRED) {
			if (rc == FILE_LOCK_DEFERRED) {
				void **argv;

				ksmbd_debug(SMB,
@@ -6820,12 +6813,11 @@ int smb2_lock(struct ksmbd_work *work)
				}
				argv[0] = flock;

				err = setup_async_work(work,
				rc = setup_async_work(work,
						      smb2_remove_blocked_lock,
						      argv);
				if (err) {
					rsp->hdr.Status =
					   STATUS_INSUFFICIENT_RESOURCES;
				if (rc) {
					err = -ENOMEM;
					goto out;
				}
				spin_lock(&fp->f_lock);
@@ -6872,7 +6864,7 @@ int smb2_lock(struct ksmbd_work *work)
				list_del(&work->fp_entry);
				spin_unlock(&fp->f_lock);
				goto retry;
			} else if (!err) {
			} else if (!rc) {
				spin_lock(&work->conn->llist_lock);
				list_add_tail(&smb_lock->clist,
					      &work->conn->lock_list);
@@ -6882,7 +6874,6 @@ int smb2_lock(struct ksmbd_work *work)
				list_add(&smb_lock->llist, &rollback_list);
				ksmbd_debug(SMB, "successful in taking lock\n");
			} else {
				rsp->hdr.Status = STATUS_LOCK_NOT_GRANTED;
				goto out;
			}
		}
@@ -6908,7 +6899,6 @@ int smb2_lock(struct ksmbd_work *work)

	list_for_each_entry_safe(smb_lock, tmp, &rollback_list, llist) {
		struct file_lock *rlock = NULL;
		int rc;

		rlock = smb_flock_init(filp);
		rlock->fl_type = F_UNLCK;
@@ -6931,7 +6921,19 @@ int smb2_lock(struct ksmbd_work *work)
		kfree(smb_lock);
	}
out2:
	ksmbd_debug(SMB, "failed in taking lock(flags : %x)\n", flags);
	ksmbd_debug(SMB, "failed in taking lock(flags : %x), err : %d\n", flags, err);

	if (!rsp->hdr.Status) {
		if (err == -EINVAL)
			rsp->hdr.Status = STATUS_INVALID_PARAMETER;
		else if (err == -ENOMEM)
			rsp->hdr.Status = STATUS_INSUFFICIENT_RESOURCES;
		else if (err == -ENOENT)
			rsp->hdr.Status = STATUS_FILE_CLOSED;
		else
			rsp->hdr.Status = STATUS_LOCK_NOT_GRANTED;
	}

	smb2_set_err_rsp(work);
	ksmbd_fd_put(work, fp);
	return err;