reiserfs: locking, handle nested locks properly
[sfrench/cifs-2.6.git] / fs / reiserfs / dir.c
index 03e4ca5624d6057f90c8230a2c6d89cac0fcd96f..1fd2051109a3547a47dbea91dc8e88ea5343d7c4 100644 (file)
@@ -71,6 +71,7 @@ int reiserfs_readdir_inode(struct inode *inode, struct dir_context *ctx)
        char small_buf[32];     /* avoid kmalloc if we can */
        struct reiserfs_dir_entry de;
        int ret = 0;
+       int depth;
 
        reiserfs_write_lock(inode->i_sb);
 
@@ -181,17 +182,17 @@ int reiserfs_readdir_inode(struct inode *inode, struct dir_context *ctx)
                                 * Since filldir might sleep, we can release
                                 * the write lock here for other waiters
                                 */
-                               reiserfs_write_unlock(inode->i_sb);
+                               depth = reiserfs_write_unlock_nested(inode->i_sb);
                                if (!dir_emit
                                    (ctx, local_buf, d_reclen, d_ino,
                                     DT_UNKNOWN)) {
-                                       reiserfs_write_lock(inode->i_sb);
+                                       reiserfs_write_lock_nested(inode->i_sb, depth);
                                        if (local_buf != small_buf) {
                                                kfree(local_buf);
                                        }
                                        goto end;
                                }
-                               reiserfs_write_lock(inode->i_sb);
+                               reiserfs_write_lock_nested(inode->i_sb, depth);
                                if (local_buf != small_buf) {
                                        kfree(local_buf);
                                }