drop unused dentry argument to ->fsync
[safe/jmp/linux-2.6] / drivers / staging / pohmelfs / inode.c
index 882c619..e92595e 100644 (file)
@@ -36,6 +36,7 @@
 #define POHMELFS_MAGIC_NUM     0x504f482e
 
 static struct kmem_cache *pohmelfs_inode_cache;
+static atomic_t psb_bdi_num = ATOMIC_INIT(0);
 
 /*
  * Removes inode from all trees, drops local name cache and removes all queued
@@ -143,7 +144,6 @@ static int pohmelfs_writepages(struct address_space *mapping, struct writeback_c
        struct inode *inode = mapping->host;
        struct pohmelfs_inode *pi = POHMELFS_I(inode);
        struct pohmelfs_sb *psb = POHMELFS_SB(inode->i_sb);
-       struct backing_dev_info *bdi = mapping->backing_dev_info;
        int err = 0;
        int done = 0;
        int nr_pages;
@@ -152,11 +152,6 @@ static int pohmelfs_writepages(struct address_space *mapping, struct writeback_c
        int scanned = 0;
        int range_whole = 0;
 
-       if (wbc->nonblocking && bdi_write_congested(bdi)) {
-               wbc->encountered_congestion = 1;
-               return 0;
-       }
-
        if (wbc->range_cyclic) {
                index = mapping->writeback_index; /* Start from prev offset */
                end = -1;
@@ -248,10 +243,6 @@ retry:
 
                        if (wbc->nr_to_write <= 0)
                                done = 1;
-                       if (wbc->nonblocking && bdi_write_congested(bdi)) {
-                               wbc->encountered_congestion = 1;
-                               done = 1;
-                       }
 
                        continue;
 out_continue:
@@ -332,7 +323,7 @@ int pohmelfs_write_create_inode(struct pohmelfs_inode *pi)
        t = netfs_trans_alloc(psb, err + 1, 0, 0);
        if (!t) {
                err = -ENOMEM;
-               goto err_out_put;
+               goto err_out_exit;
        }
        t->complete = pohmelfs_write_inode_complete;
        t->private = igrab(inode);
@@ -405,7 +396,8 @@ int pohmelfs_remove_child(struct pohmelfs_inode *pi, struct pohmelfs_name *n)
 /*
  * Writeback for given inode.
  */
-static int pohmelfs_write_inode(struct inode *inode, int sync)
+static int pohmelfs_write_inode(struct inode *inode,
+                               struct writeback_control *wbc)
 {
        struct pohmelfs_inode *pi = POHMELFS_I(inode);
 
@@ -693,7 +685,7 @@ static int pohmelfs_readpages_trans_complete(struct page **__pages, unsigned int
                goto err_out_free;
        }
 
-       for (i=0; i<num; ++i) {
+       for (i = 0; i < num; ++i) {
                page = pages[i];
 
                if (err)
@@ -888,7 +880,7 @@ static struct inode *pohmelfs_alloc_inode(struct super_block *sb)
 /*
  * We want fsync() to work on POHMELFS.
  */
-static int pohmelfs_fsync(struct file *file, struct dentry *dentry, int datasync)
+static int pohmelfs_fsync(struct file *file, int datasync)
 {
        struct inode *inode = file->f_mapping->host;
        struct writeback_control wbc = {
@@ -921,16 +913,16 @@ ssize_t pohmelfs_write(struct file *file, const char __user *buf,
        if (ret)
                goto err_out_unlock;
 
-       ret = generic_file_aio_write_nolock(&kiocb, &iov, 1, pos);
+       ret = __generic_file_aio_write(&kiocb, &iov, 1, &kiocb.ki_pos);
        *ppos = kiocb.ki_pos;
 
        mutex_unlock(&inode->i_mutex);
        WARN_ON(ret < 0);
 
-       if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
+       if (ret > 0) {
                ssize_t err;
 
-               err = sync_page_range(inode, mapping, pos, ret);
+               err = generic_write_sync(file, pos, ret);
                if (err < 0)
                        ret = err;
                WARN_ON(ret < 0);
@@ -943,7 +935,7 @@ err_out_unlock:
        return ret;
 }
 
-const static struct file_operations pohmelfs_file_ops = {
+static const struct file_operations pohmelfs_file_ops = {
        .open           = generic_file_open,
        .fsync          = pohmelfs_fsync,
 
@@ -979,7 +971,7 @@ int pohmelfs_setattr_raw(struct inode *inode, struct iattr *attr)
 
        if ((attr->ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) ||
            (attr->ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) {
-               err = vfs_dq_transfer(inode, attr) ? -EDQUOT : 0;
+               err = dquot_transfer(inode, attr);
                if (err)
                        goto err_out_exit;
        }
@@ -1341,6 +1333,8 @@ static void pohmelfs_put_super(struct super_block *sb)
        pohmelfs_crypto_exit(psb);
        pohmelfs_state_exit(psb);
 
+       bdi_destroy(&psb->bdi);
+
        kfree(psb);
        sb->s_fs_info = NULL;
 }
@@ -1437,35 +1431,35 @@ static int pohmelfs_parse_options(char *options, struct pohmelfs_sb *psb, int re
                        continue;
 
                switch (token) {
-                       case pohmelfs_opt_idx:
-                               psb->idx = option;
-                               break;
-                       case pohmelfs_opt_trans_scan_timeout:
-                               psb->trans_scan_timeout = msecs_to_jiffies(option);
-                               break;
-                       case pohmelfs_opt_drop_scan_timeout:
-                               psb->drop_scan_timeout = msecs_to_jiffies(option);
-                               break;
-                       case pohmelfs_opt_wait_on_page_timeout:
-                               psb->wait_on_page_timeout = msecs_to_jiffies(option);
-                               break;
-                       case pohmelfs_opt_mcache_timeout:
-                               psb->mcache_timeout = msecs_to_jiffies(option);
-                               break;
-                       case pohmelfs_opt_trans_retries:
-                               psb->trans_retries = option;
-                               break;
-                       case pohmelfs_opt_crypto_thread_num:
-                               psb->crypto_thread_num = option;
-                               break;
-                       case pohmelfs_opt_trans_max_pages:
-                               psb->trans_max_pages = option;
-                               break;
-                       case pohmelfs_opt_crypto_fail_unsupported:
-                               psb->crypto_fail_unsupported = 1;
-                               break;
-                       default:
-                               return -EINVAL;
+               case pohmelfs_opt_idx:
+                       psb->idx = option;
+                       break;
+               case pohmelfs_opt_trans_scan_timeout:
+                       psb->trans_scan_timeout = msecs_to_jiffies(option);
+                       break;
+               case pohmelfs_opt_drop_scan_timeout:
+                       psb->drop_scan_timeout = msecs_to_jiffies(option);
+                       break;
+               case pohmelfs_opt_wait_on_page_timeout:
+                       psb->wait_on_page_timeout = msecs_to_jiffies(option);
+                       break;
+               case pohmelfs_opt_mcache_timeout:
+                       psb->mcache_timeout = msecs_to_jiffies(option);
+                       break;
+               case pohmelfs_opt_trans_retries:
+                       psb->trans_retries = option;
+                       break;
+               case pohmelfs_opt_crypto_thread_num:
+                       psb->crypto_thread_num = option;
+                       break;
+               case pohmelfs_opt_trans_max_pages:
+                       psb->trans_max_pages = option;
+                       break;
+               case pohmelfs_opt_crypto_fail_unsupported:
+                       psb->crypto_fail_unsupported = 1;
+                       break;
+               default:
+                       return -EINVAL;
                }
        }
 
@@ -1504,7 +1498,9 @@ static void pohmelfs_flush_inode(struct pohmelfs_inode *pi, unsigned int count)
                inode->i_sb->s_op->write_inode(inode, 0);
        }
 
+#ifdef POHMELFS_TRUNCATE_ON_INODE_FLUSH
        truncate_inode_pages(inode->i_mapping, 0);
+#endif
 
        pohmelfs_data_unlock(pi, 0, ~0, POHMELFS_WRITE_LOCK);
        mutex_unlock(&inode->i_mutex);
@@ -1743,11 +1739,10 @@ static int pohmelfs_root_handshake(struct pohmelfs_sb *psb)
        err = wait_event_interruptible_timeout(psb->wait,
                        (psb->flags != ~0),
                        psb->wait_on_page_timeout);
-       if (!err) {
+       if (!err)
                err = -ETIMEDOUT;
-       } else {
+       else if (err > 0)
                err = -psb->flags;
-       }
 
        if (err)
                goto err_out_exit;
@@ -1776,14 +1771,13 @@ static int pohmelfs_show_stats(struct seq_file *m, struct vfsmount *mnt)
                seq_printf(m, "%u ", ctl->idx);
                if (ctl->addr.sa_family == AF_INET) {
                        struct sockaddr_in *sin = (struct sockaddr_in *)&st->ctl.addr;
-                       /* seq_printf(m, "%pi4:%u", &sin->sin_addr.s_addr, ntohs(sin->sin_port)); */
-                       seq_printf(m, "%u.%u.%u.%u:%u", NIPQUAD(sin->sin_addr.s_addr), ntohs(sin->sin_port));
+                       seq_printf(m, "%pI4:%u", &sin->sin_addr.s_addr, ntohs(sin->sin_port));
                } else if (ctl->addr.sa_family == AF_INET6) {
                        struct sockaddr_in6 *sin = (struct sockaddr_in6 *)&st->ctl.addr;
                        seq_printf(m, "%pi6:%u", &sin->sin6_addr, ntohs(sin->sin6_port));
                } else {
                        unsigned int i;
-                       for (i=0; i<ctl->addrlen; ++i)
+                       for (i = 0; i < ctl->addrlen; ++i)
                                seq_printf(m, "%02x.", ctl->addr.addr[i]);
                }
 
@@ -1824,11 +1818,22 @@ static int pohmelfs_fill_super(struct super_block *sb, void *data, int silent)
        if (!psb)
                goto err_out_exit;
 
+       err = bdi_init(&psb->bdi);
+       if (err)
+               goto err_out_free_sb;
+
+       err = bdi_register(&psb->bdi, NULL, "pfs-%d", atomic_inc_return(&psb_bdi_num));
+       if (err) {
+               bdi_destroy(&psb->bdi);
+               goto err_out_free_sb;
+       }
+
        sb->s_fs_info = psb;
        sb->s_op = &pohmelfs_sb_ops;
        sb->s_magic = POHMELFS_MAGIC_NUM;
        sb->s_maxbytes = MAX_LFS_FILESIZE;
        sb->s_blocksize = PAGE_SIZE;
+       sb->s_bdi = &psb->bdi;
 
        psb->sb = sb;
 
@@ -1865,18 +1870,18 @@ static int pohmelfs_fill_super(struct super_block *sb, void *data, int silent)
        INIT_LIST_HEAD(&psb->crypto_active_list);
 
        atomic_set(&psb->trans_gen, 1);
-       atomic_set(&psb->total_inodes, 0);
+       atomic_long_set(&psb->total_inodes, 0);
 
        mutex_init(&psb->state_lock);
        INIT_LIST_HEAD(&psb->state_list);
 
        err = pohmelfs_parse_options((char *) data, psb, 0);
        if (err)
-               goto err_out_free_sb;
+               goto err_out_free_bdi;
 
        err = pohmelfs_copy_crypto(psb);
        if (err)
-               goto err_out_free_sb;
+               goto err_out_free_bdi;
 
        err = pohmelfs_state_init(psb);
        if (err)
@@ -1925,6 +1930,8 @@ err_out_state_exit:
 err_out_free_strings:
        kfree(psb->cipher_string);
        kfree(psb->hash_string);
+err_out_free_bdi:
+       bdi_destroy(&psb->bdi);
 err_out_free_sb:
        kfree(psb);
 err_out_exit:
@@ -1950,14 +1957,7 @@ static int pohmelfs_get_sb(struct file_system_type *fs_type,
  */
 static void pohmelfs_kill_super(struct super_block *sb)
 {
-       struct writeback_control wbc = {
-               .sync_mode      = WB_SYNC_ALL,
-               .range_start    = 0,
-               .range_end      = LLONG_MAX,
-               .nr_to_write    = LONG_MAX,
-       };
-       generic_sync_sb_inodes(sb, &wbc);
-
+       sync_inodes_sb(sb);
        kill_anon_super(sb);
 }
 
@@ -2035,7 +2035,7 @@ err_out_exit:
 
 static void __exit exit_pohmel_fs(void)
 {
-        unregister_filesystem(&pohmel_fs_type);
+       unregister_filesystem(&pohmel_fs_type);
        pohmelfs_destroy_inodecache();
        pohmelfs_mcache_exit();
        pohmelfs_config_exit();