]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] hpfs: clean up lock ordering
authorAlexander Viro <viro@www.linux.org.uk>
Thu, 18 Mar 2004 05:23:34 +0000 (21:23 -0800)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Thu, 18 Mar 2004 05:23:34 +0000 (21:23 -0800)
hpfs_{lock,unlock}_{2,3}inodes() killed; all places that take more than
one lock have ->i_sem held by VFS on all inodes involved and all hpfs per-inode
locks are of the same type.  IOW, we can replace these guys with multiple
hpfs_lock_inode() - order doesn't matter here.

fs/hpfs/buffer.c
fs/hpfs/hpfs_fn.h
fs/hpfs/namei.c

index d0bb501b08b5e63a676565143eca889667475851..3d11f50d5ea16e1f3c6bc1bc440c7e754e864ab3 100644 (file)
@@ -60,74 +60,6 @@ void hpfs_unlock_inode(struct inode *i)
        }
 }
 
-void hpfs_lock_2inodes(struct inode *i1, struct inode *i2)
-{
-       if (!i2 || i1 == i2) {
-               hpfs_lock_inode(i1);
-       } else if (!i1) {
-               hpfs_lock_inode(i2);
-       } else {
-               struct hpfs_inode_info *hpfs_i1 = hpfs_i(i1);
-               struct hpfs_inode_info *hpfs_i2 = hpfs_i(i2);
-               if (i1->i_ino < i2->i_ino) {
-                       down(&hpfs_i1->i_sem);
-                       down(&hpfs_i2->i_sem);
-               } else {
-                       down(&hpfs_i2->i_sem);
-                       down(&hpfs_i1->i_sem);
-               }
-       }
-}
-
-void hpfs_unlock_2inodes(struct inode *i1, struct inode *i2)
-{
-       /* order of up() doesn't matter here */
-       hpfs_unlock_inode(i1);
-       hpfs_unlock_inode(i2);
-}
-
-void hpfs_lock_3inodes(struct inode *i1, struct inode *i2, struct inode *i3)
-{
-       if (!i1) { hpfs_lock_2inodes(i2, i3); return; }
-       if (!i2) { hpfs_lock_2inodes(i1, i3); return; }
-       if (!i3) { hpfs_lock_2inodes(i1, i2); return; }
-       if (i1->i_ino < i2->i_ino && i1->i_ino < i3->i_ino) {
-               struct hpfs_inode_info *hpfs_i1 = hpfs_i(i1);
-               down(&hpfs_i1->i_sem);
-               hpfs_lock_2inodes(i2, i3);
-       } else if (i2->i_ino < i1->i_ino && i2->i_ino < i3->i_ino) {
-               struct hpfs_inode_info *hpfs_i2 = hpfs_i(i2);
-               down(&hpfs_i2->i_sem);
-               hpfs_lock_2inodes(i1, i3);
-       } else if (i3->i_ino < i1->i_ino && i3->i_ino < i2->i_ino) {
-               struct hpfs_inode_info *hpfs_i3 = hpfs_i(i3);
-               down(&hpfs_i3->i_sem);
-               hpfs_lock_2inodes(i1, i2);
-       } else if (i1->i_ino != i2->i_ino) hpfs_lock_2inodes(i1, i2);
-       else hpfs_lock_2inodes(i1, i3);
-}
-               
-void hpfs_unlock_3inodes(struct inode *i1, struct inode *i2, struct inode *i3)
-{
-       if (!i1) { hpfs_unlock_2inodes(i2, i3); return; }
-       if (!i2) { hpfs_unlock_2inodes(i1, i3); return; }
-       if (!i3) { hpfs_unlock_2inodes(i1, i2); return; }
-       if (i1->i_ino < i2->i_ino && i1->i_ino < i3->i_ino) {
-               struct hpfs_inode_info *hpfs_i1 = hpfs_i(i1);
-               hpfs_unlock_2inodes(i2, i3);
-               up(&hpfs_i1->i_sem);
-       } else if (i2->i_ino < i1->i_ino && i2->i_ino < i3->i_ino) {
-               struct hpfs_inode_info *hpfs_i2 = hpfs_i(i2);
-               hpfs_unlock_2inodes(i1, i3);
-               up(&hpfs_i2->i_sem);
-       } else if (i3->i_ino < i1->i_ino && i3->i_ino < i2->i_ino) {
-               struct hpfs_inode_info *hpfs_i3 = hpfs_i(i3);
-               hpfs_unlock_2inodes(i1, i2);
-               up(&hpfs_i3->i_sem);
-       } else if (i1->i_ino != i2->i_ino) hpfs_unlock_2inodes(i1, i2);
-       else hpfs_unlock_2inodes(i1, i3);
-}
-
 /* Map a sector into a buffer and return pointers to it and to the buffer. */
 
 void *hpfs_map_sector(struct super_block *s, unsigned secno, struct buffer_head **bhp,
index eef75aa0ed4563bf98428632d52f1f90b4641ce4..8344e1f51c1646e04e9447e26e0aeeaff2245b3b 100644 (file)
@@ -196,10 +196,6 @@ void hpfs_lock_iget(struct super_block *, int);
 void hpfs_unlock_iget(struct super_block *);
 void hpfs_lock_inode(struct inode *);
 void hpfs_unlock_inode(struct inode *);
-void hpfs_lock_2inodes(struct inode *, struct inode *);
-void hpfs_unlock_2inodes(struct inode *, struct inode *);
-void hpfs_lock_3inodes(struct inode *, struct inode *, struct inode *);
-void hpfs_unlock_3inodes(struct inode *, struct inode *, struct inode *);
 void *hpfs_map_sector(struct super_block *, unsigned, struct buffer_head **, int);
 void *hpfs_get_sector(struct super_block *, unsigned, struct buffer_head **);
 void *hpfs_map_4sectors(struct super_block *, unsigned, struct quad_buffer_head *, int);
index 1c0058055dae64b43aacf0afd0401797809b08c7..33be4466454d9388bef0a418b3da4e372bfc2fea 100644 (file)
@@ -349,7 +349,8 @@ int hpfs_unlink(struct inode *dir, struct dentry *dentry)
        lock_kernel();
        hpfs_adjust_length((char *)name, &len);
 again:
-       hpfs_lock_2inodes(dir, inode);
+       hpfs_lock_inode(dir);
+       hpfs_lock_inode(inode);
        err = -ENOENT;
        de = map_dirent(dir, hpfs_i(dir)->i_dno, (char *)name, len, &dno, &qbh);
        if (!de)
@@ -376,7 +377,8 @@ again:
                if (rep++)
                        break;
 
-               hpfs_unlock_2inodes(dir, inode);
+               hpfs_unlock_inode(inode);
+               hpfs_unlock_inode(dir);
                d_drop(dentry);
                spin_lock(&dentry->d_lock);
                if (atomic_read(&dentry->d_count) > 1 ||
@@ -407,7 +409,8 @@ again:
 out1:
        hpfs_brelse4(&qbh);
 out:
-       hpfs_unlock_2inodes(dir, inode);
+       hpfs_unlock_inode(inode);
+       hpfs_unlock_inode(dir);
        unlock_kernel();
        return err;
 }
@@ -427,7 +430,8 @@ int hpfs_rmdir(struct inode *dir, struct dentry *dentry)
 
        hpfs_adjust_length((char *)name, &len);
        lock_kernel();
-       hpfs_lock_2inodes(dir, inode);
+       hpfs_lock_inode(dir);
+       hpfs_lock_inode(inode);
        err = -ENOENT;
        de = map_dirent(dir, hpfs_i(dir)->i_dno, (char *)name, len, &dno, &qbh);
        if (!de)
@@ -465,7 +469,8 @@ int hpfs_rmdir(struct inode *dir, struct dentry *dentry)
 out1:
        hpfs_brelse4(&qbh);
 out:
-       hpfs_unlock_2inodes(dir, inode);
+       hpfs_unlock_inode(inode);
+       hpfs_unlock_inode(dir);
        unlock_kernel();
        return err;
 }
@@ -522,7 +527,10 @@ int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry,
        hpfs_adjust_length((char *)old_name, &old_len);
 
        lock_kernel();
-       hpfs_lock_3inodes(old_dir, new_dir, i);
+       hpfs_lock_inode(old_dir);
+       if (new_dir != old_dir)
+               hpfs_lock_inode(new_dir);
+       hpfs_lock_inode(i);
        
        /* Erm? Moving over the empty non-busy directory is perfectly legal */
        if (new_inode && S_ISDIR(new_inode->i_mode)) {
@@ -601,7 +609,10 @@ int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry,
        hpfs_i(i)->i_conv = hpfs_sb(i->i_sb)->sb_conv;
        hpfs_decide_conv(i, (char *)new_name, new_len);
        end1:
-       hpfs_unlock_3inodes(old_dir, new_dir, i);
+       hpfs_unlock_inode(i);
+       if (old_dir != new_dir)
+               hpfs_unlock_inode(new_dir);
+       hpfs_unlock_inode(old_dir);
        unlock_kernel();
        return err;
 }