diff options
Diffstat (limited to 'fs/devfs')
-rw-r--r-- | fs/devfs/base.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/fs/devfs/base.c b/fs/devfs/base.c index 1274422a5384..b621521e09d4 100644 --- a/fs/devfs/base.c +++ b/fs/devfs/base.c | |||
@@ -2162,27 +2162,27 @@ static int devfs_d_revalidate_wait(struct dentry *dentry, struct nameidata *nd) | |||
2162 | * | 2162 | * |
2163 | * make sure that | 2163 | * make sure that |
2164 | * d_instantiate always runs under lock | 2164 | * d_instantiate always runs under lock |
2165 | * we release i_sem lock before going to sleep | 2165 | * we release i_mutex lock before going to sleep |
2166 | * | 2166 | * |
2167 | * unfortunately sometimes d_revalidate is called with | 2167 | * unfortunately sometimes d_revalidate is called with |
2168 | * and sometimes without i_sem lock held. The following checks | 2168 | * and sometimes without i_mutex lock held. The following checks |
2169 | * attempt to deduce when we need to add (and drop resp.) lock | 2169 | * attempt to deduce when we need to add (and drop resp.) lock |
2170 | * here. This relies on current (2.6.2) calling coventions: | 2170 | * here. This relies on current (2.6.2) calling coventions: |
2171 | * | 2171 | * |
2172 | * lookup_hash is always run under i_sem and is passing NULL | 2172 | * lookup_hash is always run under i_mutex and is passing NULL |
2173 | * as nd | 2173 | * as nd |
2174 | * | 2174 | * |
2175 | * open(...,O_CREATE,...) calls _lookup_hash under i_sem | 2175 | * open(...,O_CREATE,...) calls _lookup_hash under i_mutex |
2176 | * and sets flags to LOOKUP_OPEN|LOOKUP_CREATE | 2176 | * and sets flags to LOOKUP_OPEN|LOOKUP_CREATE |
2177 | * | 2177 | * |
2178 | * all other invocations of ->d_revalidate seem to happen | 2178 | * all other invocations of ->d_revalidate seem to happen |
2179 | * outside of i_sem | 2179 | * outside of i_mutex |
2180 | */ | 2180 | */ |
2181 | need_lock = nd && | 2181 | need_lock = nd && |
2182 | (!(nd->flags & LOOKUP_CREATE) || (nd->flags & LOOKUP_PARENT)); | 2182 | (!(nd->flags & LOOKUP_CREATE) || (nd->flags & LOOKUP_PARENT)); |
2183 | 2183 | ||
2184 | if (need_lock) | 2184 | if (need_lock) |
2185 | down(&dir->i_sem); | 2185 | mutex_lock(&dir->i_mutex); |
2186 | 2186 | ||
2187 | if (is_devfsd_or_child(fs_info)) { | 2187 | if (is_devfsd_or_child(fs_info)) { |
2188 | devfs_handle_t de = lookup_info->de; | 2188 | devfs_handle_t de = lookup_info->de; |
@@ -2221,9 +2221,9 @@ static int devfs_d_revalidate_wait(struct dentry *dentry, struct nameidata *nd) | |||
2221 | add_wait_queue(&lookup_info->wait_queue, &wait); | 2221 | add_wait_queue(&lookup_info->wait_queue, &wait); |
2222 | read_unlock(&parent->u.dir.lock); | 2222 | read_unlock(&parent->u.dir.lock); |
2223 | /* at this point it is always (hopefully) locked */ | 2223 | /* at this point it is always (hopefully) locked */ |
2224 | up(&dir->i_sem); | 2224 | mutex_unlock(&dir->i_mutex); |
2225 | schedule(); | 2225 | schedule(); |
2226 | down(&dir->i_sem); | 2226 | mutex_lock(&dir->i_mutex); |
2227 | /* | 2227 | /* |
2228 | * This does not need nor should remove wait from wait_queue. | 2228 | * This does not need nor should remove wait from wait_queue. |
2229 | * Wait queue head is never reused - nothing is ever added to it | 2229 | * Wait queue head is never reused - nothing is ever added to it |
@@ -2238,7 +2238,7 @@ static int devfs_d_revalidate_wait(struct dentry *dentry, struct nameidata *nd) | |||
2238 | 2238 | ||
2239 | out: | 2239 | out: |
2240 | if (need_lock) | 2240 | if (need_lock) |
2241 | up(&dir->i_sem); | 2241 | mutex_unlock(&dir->i_mutex); |
2242 | return 1; | 2242 | return 1; |
2243 | } /* End Function devfs_d_revalidate_wait */ | 2243 | } /* End Function devfs_d_revalidate_wait */ |
2244 | 2244 | ||
@@ -2284,9 +2284,9 @@ static struct dentry *devfs_lookup(struct inode *dir, struct dentry *dentry, | |||
2284 | /* Unlock directory semaphore, which will release any waiters. They | 2284 | /* Unlock directory semaphore, which will release any waiters. They |
2285 | will get the hashed dentry, and may be forced to wait for | 2285 | will get the hashed dentry, and may be forced to wait for |
2286 | revalidation */ | 2286 | revalidation */ |
2287 | up(&dir->i_sem); | 2287 | mutex_unlock(&dir->i_mutex); |
2288 | wait_for_devfsd_finished(fs_info); /* If I'm not devfsd, must wait */ | 2288 | wait_for_devfsd_finished(fs_info); /* If I'm not devfsd, must wait */ |
2289 | down(&dir->i_sem); /* Grab it again because them's the rules */ | 2289 | mutex_lock(&dir->i_mutex); /* Grab it again because them's the rules */ |
2290 | de = lookup_info.de; | 2290 | de = lookup_info.de; |
2291 | /* If someone else has been so kind as to make the inode, we go home | 2291 | /* If someone else has been so kind as to make the inode, we go home |
2292 | early */ | 2292 | early */ |