[linux-cifs-client] [PATCH] Fix losing locks during fork

Jeff Layton jlayton at samba.org
Tue Apr 6 06:14:58 MDT 2010


On Tue, 6 Apr 2010 01:17:39 +0400
Pavel Shilovsky <piastry at etersoft.ru> wrote:

> Sorry, for resending - wrong description in the previous email.
> 
> From: Pavel Shilovsky <piastryyy at gmail.com>
> 
> When process does fork() private_data of files with lock list stays the same
> for file descriptors of the parent and of the child. While finishing the child closes
> files and deletes locks from the list even if unlocking fails. When the child process
> finishes the parent doesn't have lock in lock list and can't unlock previously before
> fork() locked region after the child process finished.
> 
> This patch provides behaviour to save locks in lock list if unlocking fails.
> ---
>  fs/cifs/file.c |    7 ++++---
>  1 files changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/cifs/file.c b/fs/cifs/file.c
> index c34b7f8..7185cd3 100644
> --- a/fs/cifs/file.c
> +++ b/fs/cifs/file.c
> @@ -898,9 +898,10 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
>                                                         1, 0, li->type, false);
>                                         if (stored_rc)
>                                                 rc = stored_rc;
> -
> -                                       list_del(&li->llist);
> -                                       kfree(li);
> +                                       else {
> +                                               list_del(&li->llist);
> +                                               kfree(li);
> +                                       }
>                                 }
>                         }
>                         mutex_unlock(&fid->lock_mutex);

Looks correct to me.

Reviewed-by: Jeff Layton <jlayton at samba.org>


More information about the linux-cifs-client mailing list