lkml.org 
[lkml]   [2011]   [Dec]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [PATCH] mm: add missing mutex lock arround notify_change
On Fri, 16 Dec 2011 12:25:34 +0100
Djalal Harouni <tixxdz@opendz.org> wrote:

>
> Calls to notify_change() must hold i_mutex.
>

It seems that this is true. It's tersely documented in
Documentation/filesystems/porting. It should be mentioned in the
non-existent notify_change() kerneldoc.

<does a quick audit>

fs/hpfs/namei.c and fs/nfsd/vfs.c:nfsd_setattr() aren't obviosuly
holding that lock when calling notify_change(). Everything else under
fs/ looks OK.

I'll add the below to my tree and shall slip it into linux-next, but not
mainline:

--- a/fs/attr.c~a
+++ a/fs/attr.c
@@ -171,6 +171,8 @@ int notify_change(struct dentry * dentry
struct timespec now;
unsigned int ia_valid = attr->ia_valid;

+ WARN_ON_ONCE(!mutex_is_locked(&inode->i_mutex));
+
if (ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID | ATTR_TIMES_SET)) {
if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
return -EPERM;
@@ -245,5 +247,4 @@ int notify_change(struct dentry * dentry

return error;
}
-
EXPORT_SYMBOL(notify_change);

> --- a/mm/filemap.c
> +++ b/mm/filemap.c
> @@ -1994,10 +1994,16 @@ EXPORT_SYMBOL(should_remove_suid);
>
> static int __remove_suid(struct dentry *dentry, int kill)
> {
> + int ret;
> struct iattr newattrs;
>
> newattrs.ia_valid = ATTR_FORCE | kill;
> - return notify_change(dentry, &newattrs);
> +
> + mutex_lock(&dentry->d_inode->i_mutex);
> + ret = notify_change(dentry, &newattrs);
> + mutex_unlock(&dentry->d_inode->i_mutex);
> +
> + return ret;
> }
>
> int file_remove_suid(struct file *file)

Looks good to me.


\
 
 \ /
  Last update: 2011-12-16 21:59    [W:2.578 / U:0.308 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site