]> git.karo-electronics.de Git - linux-beck.git/commitdiff
Merge branch 'cleanups' into next
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 29 Feb 2008 07:48:05 +0000 (23:48 -0800)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 29 Feb 2008 07:48:05 +0000 (23:48 -0800)
1  2 
fs/nfs/write.c
net/sunrpc/clnt.c

diff --combined fs/nfs/write.c
index 30513029c00cb630ef5f78dd2afb270a0d0983f5,7be42e6eb63a52cd18d1fd1f3b8ce7927d9304b3..1667e398441811cf073fe234e529ea20ada10bbc
@@@ -58,13 -58,19 +58,13 @@@ struct nfs_write_data *nfs_commit_alloc
        return p;
  }
  
 -static void nfs_commit_rcu_free(struct rcu_head *head)
 +void nfs_commit_free(struct nfs_write_data *p)
  {
 -      struct nfs_write_data *p = container_of(head, struct nfs_write_data, task.u.tk_rcu);
        if (p && (p->pagevec != &p->page_array[0]))
                kfree(p->pagevec);
        mempool_free(p, nfs_commit_mempool);
  }
  
 -void nfs_commit_free(struct nfs_write_data *wdata)
 -{
 -      call_rcu_bh(&wdata->task.u.tk_rcu, nfs_commit_rcu_free);
 -}
 -
  struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount)
  {
        struct nfs_write_data *p = mempool_alloc(nfs_wdata_mempool, GFP_NOFS);
        return p;
  }
  
 -static void nfs_writedata_rcu_free(struct rcu_head *head)
 +static void nfs_writedata_free(struct nfs_write_data *p)
  {
 -      struct nfs_write_data *p = container_of(head, struct nfs_write_data, task.u.tk_rcu);
        if (p && (p->pagevec != &p->page_array[0]))
                kfree(p->pagevec);
        mempool_free(p, nfs_wdata_mempool);
  }
  
 -static void nfs_writedata_free(struct nfs_write_data *wdata)
 +void nfs_writedata_release(void *data)
  {
 -      call_rcu_bh(&wdata->task.u.tk_rcu, nfs_writedata_rcu_free);
 -}
 +      struct nfs_write_data *wdata = data;
  
 -void nfs_writedata_release(void *wdata)
 -{
 +      put_nfs_open_context(wdata->args.context);
        nfs_writedata_free(wdata);
  }
  
@@@ -351,15 -360,13 +351,13 @@@ int nfs_writepages(struct address_spac
  /*
   * Insert a write request into an inode
   */
- static int nfs_inode_add_request(struct inode *inode, struct nfs_page *req)
+ static void nfs_inode_add_request(struct inode *inode, struct nfs_page *req)
  {
        struct nfs_inode *nfsi = NFS_I(inode);
        int error;
  
        error = radix_tree_insert(&nfsi->nfs_page_tree, req->wb_index, req);
-       BUG_ON(error == -EEXIST);
-       if (error)
-               return error;
+       BUG_ON(error);
        if (!nfsi->npages) {
                igrab(inode);
                if (nfs_have_delegation(inode, FMODE_WRITE))
        set_page_private(req->wb_page, (unsigned long)req);
        nfsi->npages++;
        kref_get(&req->wb_kref);
-       radix_tree_tag_set(&nfsi->nfs_page_tree, req->wb_index, NFS_PAGE_TAG_LOCKED);
-       return 0;
+       radix_tree_tag_set(&nfsi->nfs_page_tree, req->wb_index,
+                               NFS_PAGE_TAG_LOCKED);
  }
  
  /*
@@@ -582,6 -589,13 +580,13 @@@ static struct nfs_page * nfs_update_req
                /* Loop over all inode entries and see if we find
                 * A request for the page we wish to update
                 */
+               if (new) {
+                       if (radix_tree_preload(GFP_NOFS)) {
+                               nfs_release_request(new);
+                               return ERR_PTR(-ENOMEM);
+                       }
+               }
                spin_lock(&inode->i_lock);
                req = nfs_page_find_request_locked(page);
                if (req) {
                                error = nfs_wait_on_request(req);
                                nfs_release_request(req);
                                if (error < 0) {
-                                       if (new)
+                                       if (new) {
+                                               radix_tree_preload_end();
                                                nfs_release_request(new);
+                                       }
                                        return ERR_PTR(error);
                                }
                                continue;
                        }
                        spin_unlock(&inode->i_lock);
-                       if (new)
+                       if (new) {
+                               radix_tree_preload_end();
                                nfs_release_request(new);
+                       }
                        break;
                }
  
                if (new) {
-                       int error;
                        nfs_lock_request_dontget(new);
-                       error = nfs_inode_add_request(inode, new);
-                       if (error) {
-                               spin_unlock(&inode->i_lock);
-                               nfs_unlock_request(new);
-                               return ERR_PTR(error);
-                       }
+                       nfs_inode_add_request(inode, new);
                        spin_unlock(&inode->i_lock);
+                       radix_tree_preload_end();
                        req = new;
                        goto zero_page;
                }
@@@ -725,7 -738,7 +729,7 @@@ int nfs_updatepage(struct file *file, s
         */
        if (nfs_write_pageuptodate(page, inode) &&
                        inode->i_flock == NULL &&
 -                      !(file->f_mode & O_SYNC)) {
 +                      !(file->f_flags & O_SYNC)) {
                count = max(count + offset, nfs_page_length(page));
                offset = 0;
        }
@@@ -791,7 -804,6 +795,7 @@@ static void nfs_write_rpcsetup(struct n
                .rpc_message = &msg,
                .callback_ops = call_ops,
                .callback_data = data,
 +              .workqueue = nfsiod_workqueue,
                .flags = flags,
                .priority = priority,
        };
        data->args.pgbase = req->wb_pgbase + offset;
        data->args.pages  = data->pagevec;
        data->args.count  = count;
 -      data->args.context = req->wb_context;
 +      data->args.context = get_nfs_open_context(req->wb_context);
        data->args.stable  = NFS_UNSTABLE;
        if (how & FLUSH_STABLE) {
                data->args.stable = NFS_DATA_SYNC;
@@@ -1145,11 -1157,8 +1149,11 @@@ int nfs_writeback_done(struct rpc_task 
  
  
  #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
 -void nfs_commit_release(void *wdata)
 +void nfs_commit_release(void *data)
  {
 +      struct nfs_write_data *wdata = data;
 +
 +      put_nfs_open_context(wdata->args.context);
        nfs_commit_free(wdata);
  }
  
@@@ -1176,7 -1185,6 +1180,7 @@@ static void nfs_commit_rpcsetup(struct 
                .rpc_message = &msg,
                .callback_ops = &nfs_commit_ops,
                .callback_data = data,
 +              .workqueue = nfsiod_workqueue,
                .flags = flags,
                .priority = priority,
        };
        /* Note: we always request a commit of the entire inode */
        data->args.offset = 0;
        data->args.count  = 0;
 +      data->args.context = get_nfs_open_context(first->wb_context);
        data->res.count   = 0;
        data->res.fattr   = &data->fattr;
        data->res.verf    = &data->verf;
diff --combined net/sunrpc/clnt.c
index 0e209af39797bd4ecc64b28b070679d80535513d,a23512bb240d423e74d5033610deb50d646b2820..ea14314331b08b2ee2556e9d5be05c520a375b35
@@@ -548,7 -548,7 +548,7 @@@ EXPORT_SYMBOL_GPL(rpc_run_task)
   * @msg: RPC call parameters
   * @flags: RPC call flags
   */
- int rpc_call_sync(struct rpc_clnt *clnt, struct rpc_message *msg, int flags)
+ int rpc_call_sync(struct rpc_clnt *clnt, const struct rpc_message *msg, int flags)
  {
        struct rpc_task *task;
        struct rpc_task_setup task_setup_data = {
@@@ -579,7 -579,7 +579,7 @@@ EXPORT_SYMBOL_GPL(rpc_call_sync)
   * @data: user call data
   */
  int
- rpc_call_async(struct rpc_clnt *clnt, struct rpc_message *msg, int flags,
+ rpc_call_async(struct rpc_clnt *clnt, const struct rpc_message *msg, int flags,
               const struct rpc_call_ops *tk_ops, void *data)
  {
        struct rpc_task *task;
@@@ -1066,7 -1066,7 +1066,7 @@@ call_transmit(struct rpc_task *task
        if (task->tk_msg.rpc_proc->p_decode != NULL)
                return;
        task->tk_action = rpc_exit_task;
 -      rpc_wake_up_task(task);
 +      rpc_wake_up_queued_task(&task->tk_xprt->pending, task);
  }
  
  /*
@@@ -1535,7 -1535,7 +1535,7 @@@ void rpc_show_tasks(void
                                proc = -1;
  
                        if (RPC_IS_QUEUED(t))
 -                              rpc_waitq = rpc_qname(t->u.tk_wait.rpc_waitq);
 +                              rpc_waitq = rpc_qname(t->tk_waitqueue);
  
                        printk("%5u %04d %04x %6d %8p %6d %8p %8ld %8s %8p %8p\n",
                                t->tk_pid, proc,