nfsd4: eliminate struct nfs4_cb_recall
[safe/jmp/linux-2.6] / fs / nfsd / nfscache.c
index 119e4d4..5bfc2ac 100644 (file)
@@ -29,7 +29,7 @@
  */
 #define CACHESIZE              1024
 #define HASHSIZE               64
-#define REQHASH(xid)           ((((xid) >> 24) ^ (xid)) & (HASHSIZE-1))
+#define REQHASH(xid)           (((((__force __u32)xid) >> 24) ^ ((__force __u32)xid)) & (HASHSIZE-1))
 
 static struct hlist_head *     hash_list;
 static struct list_head        lru_head;
@@ -44,17 +44,17 @@ static int  nfsd_cache_append(struct svc_rqst *rqstp, struct kvec *vec);
  */
 static DEFINE_SPINLOCK(cache_lock);
 
-void
-nfsd_cache_init(void)
+int nfsd_reply_cache_init(void)
 {
        struct svc_cacherep     *rp;
        int                     i;
 
        INIT_LIST_HEAD(&lru_head);
        i = CACHESIZE;
-       while(i) {
+       while (i) {
                rp = kmalloc(sizeof(*rp), GFP_KERNEL);
-               if (!rp) break;
+               if (!rp)
+                       goto out_nomem;
                list_add(&rp->c_lru, &lru_head);
                rp->c_state = RC_UNUSED;
                rp->c_type = RC_NOCACHE;
@@ -62,24 +62,19 @@ nfsd_cache_init(void)
                i--;
        }
 
-       if (i)
-               printk (KERN_ERR "nfsd: cannot allocate all %d cache entries, only got %d\n",
-                       CACHESIZE, CACHESIZE-i);
-
-       hash_list = kmalloc (HASHSIZE * sizeof(struct hlist_head), GFP_KERNEL);
-       if (!hash_list) {
-               nfsd_cache_shutdown();
-               printk (KERN_ERR "nfsd: cannot allocate %Zd bytes for hash list\n",
-                       HASHSIZE * sizeof(struct hlist_head));
-               return;
-       }
-       memset(hash_list, 0, HASHSIZE * sizeof(struct hlist_head));
+       hash_list = kcalloc (HASHSIZE, sizeof(struct hlist_head), GFP_KERNEL);
+       if (!hash_list)
+               goto out_nomem;
 
        cache_disabled = 0;
+       return 0;
+out_nomem:
+       printk(KERN_ERR "nfsd: failed to allocate reply cache\n");
+       nfsd_reply_cache_shutdown();
+       return -ENOMEM;
 }
 
-void
-nfsd_cache_shutdown(void)
+void nfsd_reply_cache_shutdown(void)
 {
        struct svc_cacherep     *rp;
 
@@ -93,8 +88,7 @@ nfsd_cache_shutdown(void)
 
        cache_disabled = 1;
 
-       if (hash_list)
-               kfree (hash_list);
+       kfree (hash_list);
        hash_list = NULL;
 }
 
@@ -104,8 +98,7 @@ nfsd_cache_shutdown(void)
 static void
 lru_put_end(struct svc_cacherep *rp)
 {
-       list_del(&rp->c_lru);
-       list_add_tail(&rp->c_lru, &lru_head);
+       list_move_tail(&rp->c_lru, &lru_head);
 }
 
 /*
@@ -129,8 +122,8 @@ nfsd_cache_lookup(struct svc_rqst *rqstp, int type)
        struct hlist_node       *hn;
        struct hlist_head       *rh;
        struct svc_cacherep     *rp;
-       u32                     xid = rqstp->rq_xid,
-                               proto =  rqstp->rq_prot,
+       __be32                  xid = rqstp->rq_xid;
+       u32                     proto =  rqstp->rq_prot,
                                vers = rqstp->rq_vers,
                                proc = rqstp->rq_proc;
        unsigned long           age;
@@ -188,7 +181,7 @@ nfsd_cache_lookup(struct svc_rqst *rqstp, int type)
        rp->c_state = RC_INPROG;
        rp->c_xid = xid;
        rp->c_proc = proc;
-       rp->c_addr = rqstp->rq_addr;
+       memcpy(&rp->c_addr, svc_addr_in(rqstp), sizeof(rp->c_addr));
        rp->c_prot = proto;
        rp->c_vers = vers;
        rp->c_timestamp = jiffies;
@@ -260,7 +253,7 @@ found_entry:
  * In this case, nfsd_cache_update is called with statp == NULL.
  */
 void
-nfsd_cache_update(struct svc_rqst *rqstp, int cachetype, u32 *statp)
+nfsd_cache_update(struct svc_rqst *rqstp, int cachetype, __be32 *statp)
 {
        struct svc_cacherep *rp;
        struct kvec     *resv = &rqstp->rq_res.head[0], *cachv;