[PATCH v2] ubifs: make ubifs_[get|set]xattr atomic
Richard Weinberger
richard at nod.at
Mon Aug 3 13:27:12 PDT 2015
Am 31.07.2015 um 03:12 schrieb Dongsheng Yang:
> This commit make the ubifs_[get|set]xattr protected by ui_mutex.
>
> Originally, there is a possibility that ubifs_getxattr to get
> a wrong value.
>
> P1 P2
> ---------- ----------
> ubifs_getxattr ubifs_setxattr
> - kfree()
> - memcpy()
> - kmemdup()
>
> Then ubifs_getxattr() would get a non-sense data. To solve this
> problem, this commit make the xattr of ubifs_inode updated in
> atomic.
so, ui->data needs protection?
The comment in fs/ubifs/ubifs.h does not mention ->data.
I'm asking because I want to make sure that ui_mutex is the correct lock to take.
> Signed-off-by: Dongsheng Yang <yangds.fnst at cn.fujitsu.com>
> ---
> -v2:
> Add more description in commit message
> fs/ubifs/xattr.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/fs/ubifs/xattr.c b/fs/ubifs/xattr.c
> index 96f3448..dec1afd 100644
> --- a/fs/ubifs/xattr.c
> +++ b/fs/ubifs/xattr.c
> @@ -208,6 +208,7 @@ static int change_xattr(struct ubifs_info *c, struct inode *host,
> if (err)
> return err;
>
> + mutex_lock(&ui->ui_mutex);
> kfree(ui->data);
> ui->data = kmemdup(value, size, GFP_NOFS);
> if (!ui->data) {
> @@ -216,6 +217,7 @@ static int change_xattr(struct ubifs_info *c, struct inode *host,
> }
> inode->i_size = ui->ui_size = size;
> ui->data_len = size;
> + mutex_unlock(&ui->ui_mutex);
You also need a mutex_unlock(&ui->ui_mutex) under out_free, otherwise
the if (!ui->data) { branch will trigger a deadlock.
Thanks,
//richard
More information about the linux-mtd
mailing list