fs-writeback: Add helper function to start writeback if idle
[safe/jmp/linux-2.6] / fs / hpfs / namei.c
index 8ff8fc4..82b9c4b 100644 (file)
@@ -5,7 +5,8 @@
  *
  *  adding & removing files & directories
  */
-
+#include <linux/sched.h>
+#include <linux/smp_lock.h>
 #include "hpfs_fn.h"
 
 static int hpfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
@@ -60,7 +61,7 @@ static int hpfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
        if (dee.read_only)
                result->i_mode &= ~0222;
 
-       down(&hpfs_i(dir)->i_sem);
+       mutex_lock(&hpfs_i(dir)->i_mutex);
        r = hpfs_add_dirent(dir, (char *)name, len, &dee, 0);
        if (r == 1)
                goto bail3;
@@ -89,23 +90,23 @@ static int hpfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
        brelse(bh);
        hpfs_mark_4buffers_dirty(&qbh0);
        hpfs_brelse4(&qbh0);
-       dir->i_nlink++;
+       inc_nlink(dir);
        insert_inode_hash(result);
 
-       if (result->i_uid != current->fsuid ||
-           result->i_gid != current->fsgid ||
+       if (result->i_uid != current_fsuid() ||
+           result->i_gid != current_fsgid() ||
            result->i_mode != (mode | S_IFDIR)) {
-               result->i_uid = current->fsuid;
-               result->i_gid = current->fsgid;
+               result->i_uid = current_fsuid();
+               result->i_gid = current_fsgid();
                result->i_mode = mode | S_IFDIR;
                hpfs_write_inode_nolock(result);
        }
        d_instantiate(dentry, result);
-       up(&hpfs_i(dir)->i_sem);
+       mutex_unlock(&hpfs_i(dir)->i_mutex);
        unlock_kernel();
        return 0;
 bail3:
-       up(&hpfs_i(dir)->i_sem);
+       mutex_unlock(&hpfs_i(dir)->i_mutex);
        iput(result);
 bail2:
        hpfs_brelse4(&qbh0);
@@ -168,7 +169,7 @@ static int hpfs_create(struct inode *dir, struct dentry *dentry, int mode, struc
        result->i_data.a_ops = &hpfs_aops;
        hpfs_i(result)->mmu_private = 0;
 
-       down(&hpfs_i(dir)->i_sem);
+       mutex_lock(&hpfs_i(dir)->i_mutex);
        r = hpfs_add_dirent(dir, (char *)name, len, &dee, 0);
        if (r == 1)
                goto bail2;
@@ -184,21 +185,21 @@ static int hpfs_create(struct inode *dir, struct dentry *dentry, int mode, struc
 
        insert_inode_hash(result);
 
-       if (result->i_uid != current->fsuid ||
-           result->i_gid != current->fsgid ||
+       if (result->i_uid != current_fsuid() ||
+           result->i_gid != current_fsgid() ||
            result->i_mode != (mode | S_IFREG)) {
-               result->i_uid = current->fsuid;
-               result->i_gid = current->fsgid;
+               result->i_uid = current_fsuid();
+               result->i_gid = current_fsgid();
                result->i_mode = mode | S_IFREG;
                hpfs_write_inode_nolock(result);
        }
        d_instantiate(dentry, result);
-       up(&hpfs_i(dir)->i_sem);
+       mutex_unlock(&hpfs_i(dir)->i_mutex);
        unlock_kernel();
        return 0;
 
 bail2:
-       up(&hpfs_i(dir)->i_sem);
+       mutex_unlock(&hpfs_i(dir)->i_mutex);
        iput(result);
 bail1:
        brelse(bh);
@@ -247,14 +248,14 @@ static int hpfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t
        result->i_mtime.tv_nsec = 0;
        result->i_atime.tv_nsec = 0;
        hpfs_i(result)->i_ea_size = 0;
-       result->i_uid = current->fsuid;
-       result->i_gid = current->fsgid;
+       result->i_uid = current_fsuid();
+       result->i_gid = current_fsgid();
        result->i_nlink = 1;
        result->i_size = 0;
        result->i_blocks = 1;
        init_special_inode(result, mode, rdev);
 
-       down(&hpfs_i(dir)->i_sem);
+       mutex_lock(&hpfs_i(dir)->i_mutex);
        r = hpfs_add_dirent(dir, (char *)name, len, &dee, 0);
        if (r == 1)
                goto bail2;
@@ -271,12 +272,12 @@ static int hpfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t
 
        hpfs_write_inode_nolock(result);
        d_instantiate(dentry, result);
-       up(&hpfs_i(dir)->i_sem);
+       mutex_unlock(&hpfs_i(dir)->i_mutex);
        brelse(bh);
        unlock_kernel();
        return 0;
 bail2:
-       up(&hpfs_i(dir)->i_sem);
+       mutex_unlock(&hpfs_i(dir)->i_mutex);
        iput(result);
 bail1:
        brelse(bh);
@@ -325,15 +326,15 @@ static int hpfs_symlink(struct inode *dir, struct dentry *dentry, const char *sy
        result->i_atime.tv_nsec = 0;
        hpfs_i(result)->i_ea_size = 0;
        result->i_mode = S_IFLNK | 0777;
-       result->i_uid = current->fsuid;
-       result->i_gid = current->fsgid;
+       result->i_uid = current_fsuid();
+       result->i_gid = current_fsgid();
        result->i_blocks = 1;
        result->i_nlink = 1;
        result->i_size = strlen(symlink);
        result->i_op = &page_symlink_inode_operations;
        result->i_data.a_ops = &hpfs_symlink_aops;
 
-       down(&hpfs_i(dir)->i_sem);
+       mutex_lock(&hpfs_i(dir)->i_mutex);
        r = hpfs_add_dirent(dir, (char *)name, len, &dee, 0);
        if (r == 1)
                goto bail2;
@@ -352,11 +353,11 @@ static int hpfs_symlink(struct inode *dir, struct dentry *dentry, const char *sy
 
        hpfs_write_inode_nolock(result);
        d_instantiate(dentry, result);
-       up(&hpfs_i(dir)->i_sem);
+       mutex_unlock(&hpfs_i(dir)->i_mutex);
        unlock_kernel();
        return 0;
 bail2:
-       up(&hpfs_i(dir)->i_sem);
+       mutex_unlock(&hpfs_i(dir)->i_mutex);
        iput(result);
 bail1:
        brelse(bh);
@@ -382,8 +383,8 @@ static int hpfs_unlink(struct inode *dir, struct dentry *dentry)
        lock_kernel();
        hpfs_adjust_length((char *)name, &len);
 again:
-       down(&hpfs_i(inode)->i_parent);
-       down(&hpfs_i(dir)->i_sem);
+       mutex_lock(&hpfs_i(inode)->i_parent_mutex);
+       mutex_lock(&hpfs_i(dir)->i_mutex);
        err = -ENOENT;
        de = map_dirent(dir, hpfs_i(dir)->i_dno, (char *)name, len, &dno, &qbh);
        if (!de)
@@ -410,12 +411,12 @@ again:
                if (rep++)
                        break;
 
-               up(&hpfs_i(dir)->i_sem);
-               up(&hpfs_i(inode)->i_parent);
+               mutex_unlock(&hpfs_i(dir)->i_mutex);
+               mutex_unlock(&hpfs_i(inode)->i_parent_mutex);
                d_drop(dentry);
                spin_lock(&dentry->d_lock);
                if (atomic_read(&dentry->d_count) > 1 ||
-                   permission(inode, MAY_WRITE, NULL) ||
+                   generic_permission(inode, MAY_WRITE, NULL) ||
                    !S_ISREG(inode->i_mode) ||
                    get_write_access(inode)) {
                        spin_unlock(&dentry->d_lock);
@@ -434,7 +435,7 @@ again:
                unlock_kernel();
                return -ENOSPC;
        default:
-               inode->i_nlink--;
+               drop_nlink(inode);
                err = 0;
        }
        goto out;
@@ -442,8 +443,8 @@ again:
 out1:
        hpfs_brelse4(&qbh);
 out:
-       up(&hpfs_i(dir)->i_sem);
-       up(&hpfs_i(inode)->i_parent);
+       mutex_unlock(&hpfs_i(dir)->i_mutex);
+       mutex_unlock(&hpfs_i(inode)->i_parent_mutex);
        unlock_kernel();
        return err;
 }
@@ -463,8 +464,8 @@ static int hpfs_rmdir(struct inode *dir, struct dentry *dentry)
 
        hpfs_adjust_length((char *)name, &len);
        lock_kernel();
-       down(&hpfs_i(inode)->i_parent);
-       down(&hpfs_i(dir)->i_sem);
+       mutex_lock(&hpfs_i(inode)->i_parent_mutex);
+       mutex_lock(&hpfs_i(dir)->i_mutex);
        err = -ENOENT;
        de = map_dirent(dir, hpfs_i(dir)->i_dno, (char *)name, len, &dno, &qbh);
        if (!de)
@@ -494,16 +495,16 @@ static int hpfs_rmdir(struct inode *dir, struct dentry *dentry)
                err = -ENOSPC;
                break;
        default:
-               dir->i_nlink--;
-               inode->i_nlink = 0;
+               drop_nlink(dir);
+               clear_nlink(inode);
                err = 0;
        }
        goto out;
 out1:
        hpfs_brelse4(&qbh);
 out:
-       up(&hpfs_i(dir)->i_sem);
-       up(&hpfs_i(inode)->i_parent);
+       mutex_unlock(&hpfs_i(dir)->i_mutex);
+       mutex_unlock(&hpfs_i(inode)->i_parent_mutex);
        unlock_kernel();
        return err;
 }
@@ -538,7 +539,7 @@ fail:
        return err;
 }
 
-struct address_space_operations hpfs_symlink_aops = {
+const struct address_space_operations hpfs_symlink_aops = {
        .readpage       = hpfs_symlink_readpage
 };
        
@@ -565,12 +566,12 @@ static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry,
 
        lock_kernel();
        /* order doesn't matter, due to VFS exclusion */
-       down(&hpfs_i(i)->i_parent);
+       mutex_lock(&hpfs_i(i)->i_parent_mutex);
        if (new_inode)
-               down(&hpfs_i(new_inode)->i_parent);
-       down(&hpfs_i(old_dir)->i_sem);
+               mutex_lock(&hpfs_i(new_inode)->i_parent_mutex);
+       mutex_lock(&hpfs_i(old_dir)->i_mutex);
        if (new_dir != old_dir)
-               down(&hpfs_i(new_dir)->i_sem);
+               mutex_lock(&hpfs_i(new_dir)->i_mutex);
        
        /* Erm? Moving over the empty non-busy directory is perfectly legal */
        if (new_inode && S_ISDIR(new_inode->i_mode)) {
@@ -590,7 +591,7 @@ static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry,
                int r;
                if ((r = hpfs_remove_dirent(old_dir, dno, dep, &qbh, 1)) != 2) {
                        if ((nde = map_dirent(new_dir, hpfs_i(new_dir)->i_dno, (char *)new_name, new_len, NULL, &qbh1))) {
-                               new_inode->i_nlink = 0;
+                               clear_nlink(new_inode);
                                copy_de(nde, &de);
                                memcpy(nde->name, new_name, new_len);
                                hpfs_mark_4buffers_dirty(&qbh1);
@@ -635,8 +636,8 @@ static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry,
        end:
        hpfs_i(i)->i_parent_dir = new_dir->i_ino;
        if (S_ISDIR(i->i_mode)) {
-               new_dir->i_nlink++;
-               old_dir->i_nlink--;
+               inc_nlink(new_dir);
+               drop_nlink(old_dir);
        }
        if ((fnode = hpfs_map_fnode(i->i_sb, i->i_ino, &bh))) {
                fnode->up = new_dir->i_ino;
@@ -650,16 +651,16 @@ static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry,
        hpfs_decide_conv(i, (char *)new_name, new_len);
 end1:
        if (old_dir != new_dir)
-               up(&hpfs_i(new_dir)->i_sem);
-       up(&hpfs_i(old_dir)->i_sem);
-       up(&hpfs_i(i)->i_parent);
+               mutex_unlock(&hpfs_i(new_dir)->i_mutex);
+       mutex_unlock(&hpfs_i(old_dir)->i_mutex);
+       mutex_unlock(&hpfs_i(i)->i_parent_mutex);
        if (new_inode)
-               up(&hpfs_i(new_inode)->i_parent);
+               mutex_unlock(&hpfs_i(new_inode)->i_parent_mutex);
        unlock_kernel();
        return err;
 }
 
-struct inode_operations hpfs_dir_iops =
+const struct inode_operations hpfs_dir_iops =
 {
        .create         = hpfs_create,
        .lookup         = hpfs_lookup,
@@ -669,5 +670,5 @@ struct inode_operations hpfs_dir_iops =
        .rmdir          = hpfs_rmdir,
        .mknod          = hpfs_mknod,
        .rename         = hpfs_rename,
-       .setattr        = hpfs_notify_change,
+       .setattr        = hpfs_setattr,
 };