Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
[linux-2.6-microblaze.git] / net / sunrpc / cache.c
index d996bf8..bd843a8 100644 (file)
@@ -77,6 +77,22 @@ static struct cache_head *sunrpc_cache_find_rcu(struct cache_detail *detail,
        return NULL;
 }
 
+static void sunrpc_begin_cache_remove_entry(struct cache_head *ch,
+                                           struct cache_detail *cd)
+{
+       /* Must be called under cd->hash_lock */
+       hlist_del_init_rcu(&ch->cache_list);
+       set_bit(CACHE_CLEANED, &ch->flags);
+       cd->entries --;
+}
+
+static void sunrpc_end_cache_remove_entry(struct cache_head *ch,
+                                         struct cache_detail *cd)
+{
+       cache_fresh_unlocked(ch, cd);
+       cache_put(ch, cd);
+}
+
 static struct cache_head *sunrpc_cache_add_entry(struct cache_detail *detail,
                                                 struct cache_head *key,
                                                 int hash)
@@ -100,8 +116,7 @@ static struct cache_head *sunrpc_cache_add_entry(struct cache_detail *detail,
        hlist_for_each_entry_rcu(tmp, head, cache_list) {
                if (detail->match(tmp, key)) {
                        if (cache_is_expired(detail, tmp)) {
-                               hlist_del_init_rcu(&tmp->cache_list);
-                               detail->entries --;
+                               sunrpc_begin_cache_remove_entry(tmp, detail);
                                freeme = tmp;
                                break;
                        }
@@ -117,10 +132,8 @@ static struct cache_head *sunrpc_cache_add_entry(struct cache_detail *detail,
        cache_get(new);
        spin_unlock(&detail->hash_lock);
 
-       if (freeme) {
-               cache_fresh_unlocked(freeme, detail);
-               cache_put(freeme, detail);
-       }
+       if (freeme)
+               sunrpc_end_cache_remove_entry(freeme, detail);
        return new;
 }
 
@@ -454,8 +467,7 @@ static int cache_clean(void)
                        if (!cache_is_expired(current_detail, ch))
                                continue;
 
-                       hlist_del_init_rcu(&ch->cache_list);
-                       current_detail->entries--;
+                       sunrpc_begin_cache_remove_entry(ch, current_detail);
                        rv = 1;
                        break;
                }
@@ -465,11 +477,8 @@ static int cache_clean(void)
                if (!ch)
                        current_index ++;
                spin_unlock(&cache_list_lock);
-               if (ch) {
-                       set_bit(CACHE_CLEANED, &ch->flags);
-                       cache_fresh_unlocked(ch, d);
-                       cache_put(ch, d);
-               }
+               if (ch)
+                       sunrpc_end_cache_remove_entry(ch, d);
        } else
                spin_unlock(&cache_list_lock);
 
@@ -525,13 +534,9 @@ void cache_purge(struct cache_detail *detail)
        for (i = 0; i < detail->hash_size; i++) {
                head = &detail->hash_table[i];
                hlist_for_each_entry_safe(ch, tmp, head, cache_list) {
-                       hlist_del_init_rcu(&ch->cache_list);
-                       detail->entries--;
-
-                       set_bit(CACHE_CLEANED, &ch->flags);
+                       sunrpc_begin_cache_remove_entry(ch, detail);
                        spin_unlock(&detail->hash_lock);
-                       cache_fresh_unlocked(ch, detail);
-                       cache_put(ch, detail);
+                       sunrpc_end_cache_remove_entry(ch, detail);
                        spin_lock(&detail->hash_lock);
                }
        }
@@ -1571,15 +1576,14 @@ static int cache_release_procfs(struct inode *inode, struct file *filp)
        return cache_release(inode, filp, cd);
 }
 
-static const struct file_operations cache_file_operations_procfs = {
-       .owner          = THIS_MODULE,
-       .llseek         = no_llseek,
-       .read           = cache_read_procfs,
-       .write          = cache_write_procfs,
-       .poll           = cache_poll_procfs,
-       .unlocked_ioctl = cache_ioctl_procfs, /* for FIONREAD */
-       .open           = cache_open_procfs,
-       .release        = cache_release_procfs,
+static const struct proc_ops cache_channel_proc_ops = {
+       .proc_lseek     = no_llseek,
+       .proc_read      = cache_read_procfs,
+       .proc_write     = cache_write_procfs,
+       .proc_poll      = cache_poll_procfs,
+       .proc_ioctl     = cache_ioctl_procfs, /* for FIONREAD */
+       .proc_open      = cache_open_procfs,
+       .proc_release   = cache_release_procfs,
 };
 
 static int content_open_procfs(struct inode *inode, struct file *filp)
@@ -1596,11 +1600,11 @@ static int content_release_procfs(struct inode *inode, struct file *filp)
        return content_release(inode, filp, cd);
 }
 
-static const struct file_operations content_file_operations_procfs = {
-       .open           = content_open_procfs,
-       .read           = seq_read,
-       .llseek         = seq_lseek,
-       .release        = content_release_procfs,
+static const struct proc_ops content_proc_ops = {
+       .proc_open      = content_open_procfs,
+       .proc_read      = seq_read,
+       .proc_lseek     = seq_lseek,
+       .proc_release   = content_release_procfs,
 };
 
 static int open_flush_procfs(struct inode *inode, struct file *filp)
@@ -1634,12 +1638,12 @@ static ssize_t write_flush_procfs(struct file *filp,
        return write_flush(filp, buf, count, ppos, cd);
 }
 
-static const struct file_operations cache_flush_operations_procfs = {
-       .open           = open_flush_procfs,
-       .read           = read_flush_procfs,
-       .write          = write_flush_procfs,
-       .release        = release_flush_procfs,
-       .llseek         = no_llseek,
+static const struct proc_ops cache_flush_proc_ops = {
+       .proc_open      = open_flush_procfs,
+       .proc_read      = read_flush_procfs,
+       .proc_write     = write_flush_procfs,
+       .proc_release   = release_flush_procfs,
+       .proc_lseek     = no_llseek,
 };
 
 static void remove_cache_proc_entries(struct cache_detail *cd)
@@ -1662,19 +1666,19 @@ static int create_cache_proc_entries(struct cache_detail *cd, struct net *net)
                goto out_nomem;
 
        p = proc_create_data("flush", S_IFREG | 0600,
-                            cd->procfs, &cache_flush_operations_procfs, cd);
+                            cd->procfs, &cache_flush_proc_ops, cd);
        if (p == NULL)
                goto out_nomem;
 
        if (cd->cache_request || cd->cache_parse) {
                p = proc_create_data("channel", S_IFREG | 0600, cd->procfs,
-                                    &cache_file_operations_procfs, cd);
+                                    &cache_channel_proc_ops, cd);
                if (p == NULL)
                        goto out_nomem;
        }
        if (cd->cache_show) {
                p = proc_create_data("content", S_IFREG | 0400, cd->procfs,
-                                    &content_file_operations_procfs, cd);
+                                    &content_proc_ops, cd);
                if (p == NULL)
                        goto out_nomem;
        }
@@ -1886,10 +1890,9 @@ void sunrpc_cache_unhash(struct cache_detail *cd, struct cache_head *h)
 {
        spin_lock(&cd->hash_lock);
        if (!hlist_unhashed(&h->cache_list)){
-               hlist_del_init_rcu(&h->cache_list);
-               cd->entries--;
+               sunrpc_begin_cache_remove_entry(h, cd);
                spin_unlock(&cd->hash_lock);
-               cache_put(h, cd);
+               sunrpc_end_cache_remove_entry(h, cd);
        } else
                spin_unlock(&cd->hash_lock);
 }