From: Christoph Hellwig <hch@infradead.org>
To: "Theodore Ts'o" <tytso@mit.edu>,
Christoph Hellwig <hch@infradead.org>,
torvalds@transmeta.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/4] Add extended attributes to ext2/3
Date: Tue, 15 Oct 2002 16:31:21 +0100 [thread overview]
Message-ID: <20021015163121.B27906@infradead.org> (raw)
In-Reply-To: <20021015131507.GC31235@think.thunk.org>; from tytso@mit.edu on Tue, Oct 15, 2002 at 09:15:07AM -0400
On Tue, Oct 15, 2002 at 09:15:07AM -0400, Theodore Ts'o wrote:
> Actually, I did, for those comments that made sense. The fs/Config.in
> logic has been cleaned up, as well as removing excess header files,
> stray LINUX_VERSION_CODE #ifdef's that I had missed the first time
> around, etc.
>
> fs/mbcache.c is still there because it applies to both ext2 and ext3
> filesystems, and so your suggestion of moving it into the ext2 and
> ext3 directories would cause code duplication and maintenance
> headaches. It also *can* be used by other filesystems, as it is
> written in a generic way. The fs/Config.in only compiles it in if
> necessary (i.e., if ext2/3 extended attribute is enabled) so it won't
> cause code bloat for other filesystems if it is not needed.
>
> The superblock fields are more of an issue with the posix acl changes
> than for the extended attribute patches. I had wanted to get the
> extended attribute changes in first, since they stand alone, and so I
> have fewer patches to juggle.
Patch 2: mbcache (all against 2.5.42-mm3):
o remove LINUX_VERSION_CODE mess
o cleanup mb_cache_lock/mb_cache_unlock mess
o use list_move
o use list_del_init/list_empty instead of messing with .prev directly
o remove useless MOD_INC_USE_COUNT/MOD_DEC_USE_COUNT
--- linux-2.5.42-mm3-plain/fs/mbcache.c Tue Oct 15 17:05:09 2002
+++ linux-2.5.42-mm3/fs/mbcache.c Tue Oct 15 17:26:53 2002
@@ -27,12 +27,10 @@
#include <linux/kernel.h>
#include <linux/module.h>
-
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/slab.h>
#include <linux/sched.h>
-#include <linux/version.h>
#include <linux/init.h>
#include <linux/mbcache.h>
@@ -56,9 +54,7 @@
MODULE_AUTHOR("Andreas Gruenbacher <a.gruenbacher@computer.org>");
MODULE_DESCRIPTION("Meta block cache (for extended attributes)");
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
MODULE_LICENSE("GPL");
-#endif
EXPORT_SYMBOL(mb_cache_create);
EXPORT_SYMBOL(mb_cache_shrink);
@@ -87,18 +83,6 @@
static spinlock_t mb_cache_spinlock = SPIN_LOCK_UNLOCKED;
static struct shrinker *mb_shrinker;
-static inline void
-mb_cache_lock(void)
-{
- spin_lock(&mb_cache_spinlock);
-}
-
-static inline void
-mb_cache_unlock(void)
-{
- spin_unlock(&mb_cache_spinlock);
-}
-
static inline int
mb_cache_indexes(struct mb_cache *cache)
{
@@ -118,10 +102,8 @@
static inline void
__mb_cache_entry_takeout_lru(struct mb_cache_entry *ce)
{
- if (ce->e_lru_list.prev) {
- list_del(&ce->e_lru_list);
- ce->e_lru_list.prev = NULL;
- }
+ if (!list_empty(&ce->e_lru_list))
+ list_del_init(&ce->e_lru_list);
}
@@ -135,7 +117,7 @@
static inline int
__mb_cache_entry_in_lru(struct mb_cache_entry *ce)
{
- return (ce->e_lru_list.prev != NULL);
+ return (!list_empty(&ce->e_lru_list));
}
@@ -167,9 +149,8 @@
{
int n;
- list_del(&ce->e_block_list);
- ce->e_block_list.prev = NULL;
- for (n=0; n<mb_cache_indexes(ce->e_cache); n++)
+ list_del_init(&ce->e_block_list);
+ for (n = 0; n < mb_cache_indexes(ce->e_cache); n++)
list_del(&ce->e_indexes[n].o_list);
}
@@ -177,7 +158,7 @@
static inline int
__mb_cache_entry_is_linked(struct mb_cache_entry *ce)
{
- return (ce->e_block_list.prev != NULL);
+ return (!list_empty(&ce->e_block_list));
}
@@ -207,15 +188,15 @@
__mb_cache_entry_release_unlock(struct mb_cache_entry *ce)
{
if (atomic_dec_and_test(&ce->e_used)) {
- if (__mb_cache_entry_is_linked(ce))
- __mb_cache_entry_into_lru(ce);
- else {
- mb_cache_unlock();
- __mb_cache_entry_forget(ce);
- return;
- }
+ if (!__mb_cache_entry_is_linked(ce))
+ goto forget;
}
- mb_cache_unlock();
+
+ spin_unlock(&mb_cache_spinlock);
+ return;
+ forget:
+ spin_unlock(&mb_cache_spinlock);
+ __mb_cache_entry_forget(ce);
}
@@ -237,7 +218,7 @@
struct list_head *l;
int count = 0;
- mb_cache_lock();
+ spin_lock(&mb_cache_spinlock);
list_for_each_prev(l, &mb_cache_list) {
struct mb_cache *cache =
list_entry(l, struct mb_cache, c_cache_list);
@@ -247,20 +228,20 @@
}
mb_debug("trying to free %d entries", nr_to_scan);
if (nr_to_scan == 0) {
- mb_cache_unlock();
+ spin_unlock(&mb_cache_spinlock);
goto out;
}
while (nr_to_scan && !list_empty(&mb_cache_lru_list)) {
struct mb_cache_entry *ce =
list_entry(mb_cache_lru_list.prev,
struct mb_cache_entry, e_lru_list);
- list_del(&ce->e_lru_list);
- list_add(&ce->e_lru_list, &free_list);
+ list_move(&ce->e_lru_list, &free_list);
if (__mb_cache_entry_is_linked(ce))
__mb_cache_entry_unlink(ce);
nr_to_scan--;
}
- mb_cache_unlock();
+ spin_unlock(&mb_cache_spinlock);
+
l = free_list.prev;
while (l != &free_list) {
struct mb_cache_entry *ce = list_entry(l,
@@ -303,7 +284,6 @@
indexes_count * sizeof(struct mb_cache_entry_index))
return NULL;
- MOD_INC_USE_COUNT;
cache = kmalloc(sizeof(struct mb_cache) +
indexes_count * sizeof(struct list_head), GFP_KERNEL);
if (!cache)
@@ -340,7 +320,7 @@
if (!cache->c_entry_cache)
goto fail;
- mb_cache_lock();
+ spin_lock(&mb_cache_spinlock);
if (list_empty(&mb_cache_list)) {
if (mb_shrinker) {
printk(KERN_ERR "%s: already have a shrinker!\n",
@@ -350,7 +330,7 @@
mb_shrinker = set_shrinker(DEFAULT_SEEKS, mb_cache_shrink_fn);
}
list_add(&cache->c_cache_list, &mb_cache_list);
- mb_cache_unlock();
+ spin_unlock(&mb_cache_spinlock);
return cache;
fail:
@@ -361,7 +341,6 @@
kfree(cache->c_block_hash);
kfree(cache);
}
- MOD_DEC_USE_COUNT;
return NULL;
}
@@ -382,20 +361,19 @@
LIST_HEAD(free_list);
struct list_head *l;
- mb_cache_lock();
+ spin_lock(&mb_cache_spinlock);
l = mb_cache_lru_list.prev;
while (l != &mb_cache_lru_list) {
struct mb_cache_entry *ce =
list_entry(l, struct mb_cache_entry, e_lru_list);
l = l->prev;
if (ce->e_dev == dev) {
- list_del(&ce->e_lru_list);
- list_add(&ce->e_lru_list, &free_list);
+ list_move(&ce->e_lru_list, &free_list);
if (__mb_cache_entry_is_linked(ce))
__mb_cache_entry_unlink(ce);
}
}
- mb_cache_unlock();
+ spin_unlock(&mb_cache_spinlock);
l = free_list.prev;
while (l != &free_list) {
struct mb_cache_entry *ce =
@@ -420,15 +398,14 @@
struct list_head *l;
int n;
- mb_cache_lock();
+ spin_lock(&mb_cache_spinlock);
l = mb_cache_lru_list.prev;
while (l != &mb_cache_lru_list) {
struct mb_cache_entry *ce =
list_entry(l, struct mb_cache_entry, e_lru_list);
l = l->prev;
if (ce->e_cache == cache) {
- list_del(&ce->e_lru_list);
- list_add(&ce->e_lru_list, &free_list);
+ list_move(&ce->e_lru_list, &free_list);
if (__mb_cache_entry_is_linked(ce))
__mb_cache_entry_unlink(ce);
}
@@ -438,7 +415,7 @@
remove_shrinker(mb_shrinker);
mb_shrinker = 0;
}
- mb_cache_unlock();
+ spin_unlock(&mb_cache_spinlock);
l = free_list.prev;
while (l != &free_list) {
@@ -454,19 +431,12 @@
atomic_read(&cache->c_entry_count));
}
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0))
- /* We don't have kmem_cache_destroy() in 2.2.x */
- kmem_cache_shrink(cache->c_entry_cache);
-#else
kmem_cache_destroy(cache->c_entry_cache);
-#endif
for (n=0; n < mb_cache_indexes(cache); n++)
kfree(cache->c_indexes_hash[n]);
kfree(cache->c_block_hash);
kfree(cache);
-
- MOD_DEC_USE_COUNT;
}
@@ -486,8 +456,8 @@
atomic_inc(&cache->c_entry_count);
ce = kmem_cache_alloc(cache->c_entry_cache, GFP_KERNEL);
if (ce) {
- ce->e_lru_list.prev = NULL;
- ce->e_block_list.prev = NULL;
+ INIT_LIST_HEAD(&ce->e_lru_list);
+ INIT_LIST_HEAD(&ce->e_block_list);
ce->e_cache = cache;
atomic_set(&ce->e_used, 1);
}
@@ -519,7 +489,7 @@
struct list_head *l;
int error = -EBUSY, n;
- mb_cache_lock();
+ spin_lock(&mb_cache_spinlock);
list_for_each_prev(l, &cache->c_block_hash[bucket]) {
struct mb_cache_entry *ce =
list_entry(l, struct mb_cache_entry, e_block_list);
@@ -533,7 +503,7 @@
ce->e_indexes[n].o_key = keys[n];
__mb_cache_entry_link(ce);
out:
- mb_cache_unlock();
+ spin_unlock(&mb_cache_spinlock);
return error;
}
@@ -548,7 +518,7 @@
void
mb_cache_entry_release(struct mb_cache_entry *ce)
{
- mb_cache_lock();
+ spin_lock(&mb_cache_spinlock);
__mb_cache_entry_release_unlock(ce);
}
@@ -563,11 +533,11 @@
void
mb_cache_entry_takeout(struct mb_cache_entry *ce)
{
- mb_cache_lock();
+ spin_lock(&mb_cache_spinlock);
mb_assert(!__mb_cache_entry_in_lru(ce));
if (__mb_cache_entry_is_linked(ce))
__mb_cache_entry_unlink(ce);
- mb_cache_unlock();
+ spin_unlock(&mb_cache_spinlock);
}
@@ -580,7 +550,7 @@
void
mb_cache_entry_free(struct mb_cache_entry *ce)
{
- mb_cache_lock();
+ spin_lock(&mb_cache_spinlock);
mb_assert(!__mb_cache_entry_in_lru(ce));
if (__mb_cache_entry_is_linked(ce))
__mb_cache_entry_unlink(ce);
@@ -616,7 +586,7 @@
struct list_head *l;
struct mb_cache_entry *ce;
- mb_cache_lock();
+ spin_lock(&mb_cache_spinlock);
list_for_each(l, &cache->c_block_hash[bucket]) {
ce = list_entry(l, struct mb_cache_entry, e_block_list);
if (ce->e_dev == dev && ce->e_block == block) {
@@ -627,7 +597,7 @@
ce = NULL;
cleanup:
- mb_cache_unlock();
+ spin_unlock(&mb_cache_spinlock);
return ce;
}
@@ -674,11 +644,12 @@
struct mb_cache_entry *ce;
mb_assert(index < mb_cache_indexes(cache));
- mb_cache_lock();
+
+ spin_lock(&mb_cache_spinlock);
l = cache->c_indexes_hash[index][bucket].next;
ce = __mb_cache_entry_find(l, &cache->c_indexes_hash[index][bucket],
index, dev, key);
- mb_cache_unlock();
+ spin_unlock(&mb_cache_spinlock);
return ce;
}
@@ -712,7 +683,8 @@
struct mb_cache_entry *ce;
mb_assert(index < mb_cache_indexes(cache));
- mb_cache_lock();
+
+ spin_lock(&mb_cache_spinlock);
l = prev->e_indexes[index].o_list.next;
ce = __mb_cache_entry_find(l, &cache->c_indexes_hash[index][bucket],
index, dev, key);
next prev parent reply other threads:[~2002-10-15 15:25 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-10-15 3:33 [PATCH 1/4] Add extended attributes to ext2/3 tytso
2002-10-15 4:46 ` Andrew Morton
2002-10-15 5:04 ` Theodore Ts'o
2002-10-15 5:31 ` Andreas Dilger
2002-10-15 13:05 ` Theodore Ts'o
2002-10-15 10:26 ` Olaf Dietsche
2002-10-15 11:58 ` Christoph Hellwig
2002-10-15 13:15 ` Theodore Ts'o
2002-10-15 15:25 ` Christoph Hellwig
2002-10-15 15:31 ` Christoph Hellwig [this message]
2002-10-15 16:04 ` Andreas Dilger
2002-10-15 16:16 ` Christoph Hellwig
2002-10-15 16:21 ` Andreas Dilger
2002-10-15 16:43 ` Andreas Gruenbacher
2002-10-15 16:41 ` Theodore Ts'o
2002-10-15 16:59 ` Christoph Hellwig
2002-10-15 15:33 ` Christoph Hellwig
2002-10-15 15:34 ` Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20021015163121.B27906@infradead.org \
--to=hch@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@transmeta.com \
--cc=tytso@mit.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).