[prev in list] [next in list] [prev in thread] [next in thread] 

List:       intermezzo-cvs
Subject:    CVS: intermezzo/presto24 dcache.c,1.2,1.3 dir.c,1.19,1.20 journal.c,1.19,1.20 presto.c,1.4,1.5 super
From:       Phil Schwan <pschwan () users ! sourceforge ! net>
Date:       2001-09-11 18:25:56
[Download RAW message or body]

Update of /cvsroot/intermezzo/intermezzo/presto24
In directory usw-pr-cvs1:/tmp/cvs-serv28924

Modified Files:
	dcache.c dir.c journal.c presto.c super.c vfs.c 
Log Message:
Overview:

- removed overloaded uses of dentry->d_fsdata and dentry->d_time
- added struct presto_dentry_data in their places

dcache.c:
- presto_d_release(): cleans up unused presto_dentry_datas
- presto_set_dd(): allocates or reuses a presto_dentry_data for the given
  dentry
- presto_init_ddata_cache(): sets up the dentry_data slab at startup
- presto_cleanup_ddata_cache(): likewise at module cleanup time

dir.c:
- presto_lookup, presto_create, presto_link, presto_mkdir, presto_symlink,
  presto_unlink, presto_rmdir, presto_mknod, presto_rename: call presto_prep()
  on the parent dentry instead of the child
- presto_lookup(): call presto_set_dd() on new dentries
- presto_link(): disallow hard links between filesets
- presto_rename(): disallow renames between filesets

journal.c:
- replaced dentry->d_time with presto_d2d(dentry)->dd_kml_offset

presto.c:
- added presto_d2d() for accessing dentry->d_fsdata
- changed all uses of presto_dentry_is_fsetroot to presto_dentry2fset
- removed all overloaded uses of dentry->d_fsdata and fset->fset_data
- abstracted duplicated code into presto_cleanup_fset()

super.c:
- call presto_set_dd() on newly-created root dentry
- call presto_cleanup_ddata_cache() on module unload

vfs.c:
- replace some manual ops setting with presto_set_ops()

linux/intermezzo_fs.h:
- added presto_dentry_data and related prototypes


Index: dcache.c
===================================================================
RCS file: /cvsroot/intermezzo/intermezzo/presto24/dcache.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -U2 -r1.2 -r1.3
--- dcache.c	2001/06/10 07:52:28	1.2
+++ dcache.c	2001/09/11 18:25:54	1.3
@@ -16,4 +16,5 @@
 #include <linux/errno.h>
 #include <linux/locks.h>
+#include <linux/slab.h>
 #include <asm/segment.h>
 #include <asm/uaccess.h>
@@ -23,6 +24,6 @@
 
 static int presto_dentry_revalidate(struct dentry *de, int );
+static kmem_cache_t * presto_dentry_slab;
 
-
 /* called when a cache lookup succeeds */
 static int presto_dentry_revalidate(struct dentry *de, int flag)
@@ -49,18 +50,87 @@
 }
 
-static void presto_dentry_iput(struct dentry *dentry, struct inode *inode)
+static void presto_d_release(struct dentry *dentry)
 {
-	dentry->d_time = 0;
-	iput(inode);
+        if (!presto_d2d(dentry)) {
+                printk("VERY BAD: dentry: %p\n", dentry);
+                if (dentry->d_inode)
+                        printk("    inode: %ld\n", dentry->d_inode->i_ino);
+                return;
+        }
+
+        presto_d2d(dentry)->dd_count--;
+
+        if (! presto_d2d(dentry)->dd_count) {
+                kmem_cache_free(presto_dentry_slab, presto_d2d(dentry));
+		dentry->d_fsdata = NULL;
+        }
 }
 
 struct dentry_operations presto_dentry_ops = 
 {
-	presto_dentry_revalidate,	/* revalidate */
-	NULL,				/* hash */
-	NULL,				/* compare */
-	NULL,				/* delete */
-	NULL,				/* release */
-	presto_dentry_iput		/* iput */
+	d_revalidate: presto_dentry_revalidate,
+        d_release: presto_d_release
 };
 
+
+// XXX THIS DEPENDS ON THE KERNEL LOCK!
+
+void presto_set_dd(struct dentry * dentry)
+{
+        ENTRY;
+        if (dentry->d_fsdata) {
+                printk("VERY BAD: dentry: %p\n", dentry);
+                if (dentry->d_inode)
+                        printk("    inode: %ld\n", dentry->d_inode->i_ino);
+                return;
+        }
+
+        if (! dentry->d_inode) {
+                dentry->d_fsdata = kmem_cache_alloc(presto_dentry_slab,
+                                                    SLAB_KERNEL);
+                memset(dentry->d_fsdata, 0, sizeof(struct presto_dentry_data));
+                presto_d2d(dentry)->dd_count = 1;
+                EXIT;
+                return;
+        }
+
+        /* If there's already a dentry for this inode, share the data */
+        if (dentry->d_alias.next != &dentry->d_inode->i_dentry ||
+            dentry->d_alias.prev != &dentry->d_inode->i_dentry) {
+                struct dentry *de;
+
+                if (dentry->d_alias.next != &dentry->d_inode->i_dentry)
+                        de = list_entry(dentry->d_alias.next, struct dentry,
+                                        d_alias);
+                else
+                        de = list_entry(dentry->d_alias.prev, struct dentry,
+                                        d_alias);
+
+                dentry->d_fsdata = de->d_fsdata;
+                presto_d2d(dentry)->dd_count++;
+                EXIT;
+                return;
+        }
+
+        dentry->d_fsdata = kmem_cache_alloc(presto_dentry_slab, SLAB_KERNEL);
+        memset(dentry->d_fsdata, 0, sizeof(struct presto_dentry_data));
+        presto_d2d(dentry)->dd_count = 1;
+        EXIT;
+        return; 
+}
+
+void presto_init_ddata_cache(void)
+{
+        ENTRY;
+        presto_dentry_slab =
+                kmem_cache_create("presto_cache",
+                                  sizeof(struct presto_dentry_data), 0,
+                                  SLAB_HWCACHE_ALIGN|SLAB_POISON, NULL,
+                                  NULL);
+        EXIT;
+}
+
+void presto_cleanup_ddata_cache(void)
+{
+        kmem_cache_destroy(presto_dentry_slab);
+}

Index: dir.c
===================================================================
RCS file: /cvsroot/intermezzo/intermezzo/presto24/dir.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -U2 -r1.19 -r1.20
--- dir.c	2001/09/07 23:21:03	1.19
+++ dir.c	2001/09/11 18:25:54	1.20
@@ -190,5 +190,6 @@
 
 cleanup_iput:
-        if (inode) iput(inode);
+        if (inode)
+                iput(inode);
         return ERR_PTR(error);
 }
@@ -207,5 +208,6 @@
 
         ENTRY;
-        error = presto_prep(dentry, &cache, &fset);
+        CDEBUG(D_CACHE, "calling presto_prep on dentry %p\n", dentry);
+        error = presto_prep(dentry->d_parent, &cache, &fset);
         if ( error  ) {
                 EXIT;
@@ -235,6 +237,5 @@
                         de = iops->lookup(dir, dentry);
                 else {
-                        CDEBUG(D_CACHE, "iops %p lookup %p\n", iops, 
-                               iops->lookup);
+		        printk("filesystem has no lookup\n");
                         EXIT;
                         goto exit;
@@ -248,23 +249,10 @@
                 rc = PTR_ERR(de);
                 CDEBUG(D_CACHE, "dentry lookup error %d\n", rc);
+                EXIT;
+                goto exit;
         }
 
-#if 0
-        /* get all entries and attrs for a new directory */
-        if (!ISLENTO(minor) && dentry->d_inode &&
-            !rc && !presto_chk(dentry, PRESTO_DATA) &&
-            S_ISDIR(dentry->d_inode->i_mode)) {
-                rc = presto_opendir_upcall(minor, dentry, 
-                                           fset->fset_mtpt, SYNCHRONOUS);
-                if ( rc == EISFSETROOT )
-                        presto_set(dentry, PRESTO_FSETROOT);
-                /* XXX what do we do with other errors ? */
-                CDEBUG(D_CACHE, "setting ATTR & DATA for %ld\n",
-                               dentry->d_inode->i_ino);
-                presto_set(dentry, PRESTO_DATA | PRESTO_ATTR);
-        } else if ( !rc || rc == -ENOENT ) {
-                presto_set(dentry, PRESTO_ATTR);
-        }
-#endif
+        presto_set_dd(dentry);
+
         /* some file systems set the methods in lookup, not in
            read_inode, as a result we should set the methods here 
@@ -356,5 +344,5 @@
 
         ENTRY;
-        error = presto_prep(dentry, &cache, &fset);
+        error = presto_prep(dentry->d_parent, &cache, &fset);
         if ( error ) {
                 EXIT;
@@ -390,6 +378,6 @@
 {
         int error;
-        struct presto_cache *cache;
-        struct presto_file_set *fset;
+        struct presto_cache *cache, *new_cache;
+        struct presto_file_set *fset, *new_fset;
         struct dentry *parent = new_dentry->d_parent;
         struct lento_vfs_context info;
@@ -402,4 +390,15 @@
         }
 
+        error = presto_prep(new_dentry->d_parent, &new_cache, &new_fset);
+        if ( error ) {
+                EXIT;
+                return error;
+        }
+
+        if (fset != new_fset) { 
+                EXIT;
+                return -EXDEV;
+        }
+
         presto_unlock(dir);
         if ( presto_get_permit(old_dentry->d_inode) < 0 ) {
@@ -440,5 +439,5 @@
         ENTRY;
 
-        error = presto_prep(dentry, &cache, &fset);
+        error = presto_prep(dentry->d_parent, &cache, &fset);
         if ( error  ) {
                 EXIT;
@@ -478,5 +477,5 @@
 
         ENTRY;
-        error = presto_prep(dentry, &cache, &fset);
+        error = presto_prep(dentry->d_parent, &cache, &fset);
         if ( error ) {
                 EXIT;
@@ -512,5 +511,5 @@
 
         ENTRY;
-        error = presto_prep(dentry, &cache, &fset);
+        error = presto_prep(dentry->d_parent, &cache, &fset);
         if ( error  ) {
                 EXIT;
@@ -547,5 +546,5 @@
         ENTRY;
         CDEBUG(D_FILE, "prepping presto\n");
-        error = presto_prep(dentry, &cache, &fset);
+        error = presto_prep(dentry->d_parent, &cache, &fset);
         if ( error ) {
                 EXIT;
@@ -596,5 +595,5 @@
 
         ENTRY;
-        error = presto_prep(dentry, &cache, &fset);
+        error = presto_prep(dentry->d_parent, &cache, &fset);
         if ( error  ) {
                 EXIT;
@@ -696,10 +695,14 @@
 		double_down(&old_dir->i_zombie, &new_dir->i_zombie);
 }
+
+
+// XXX this can be optimized: renamtes across filesets only require 
+//     multiple KML records, but can locally be executed normally. 
 int presto_rename(struct inode *old_dir, struct dentry *old_dentry,
                   struct inode *new_dir, struct dentry *new_dentry)
 {
         int error;
-        struct presto_cache *cache;
-        struct presto_file_set *fset;
+        struct presto_cache *cache, *new_cache;
+        struct presto_file_set *fset, *new_fset;
         struct lento_vfs_context info;
         struct dentry *old_parent = old_dentry->d_parent;
@@ -712,4 +715,14 @@
                 EXIT;
                 return error;
+        }
+        error = presto_prep(new_parent, &new_cache, &new_fset);
+        if ( error ) {
+                EXIT;
+                return error;
+        }
+
+        if ( fset != new_fset ) {
+                EXIT;
+                return -EXDEV;
         }
 

Index: journal.c
===================================================================
RCS file: /cvsroot/intermezzo/intermezzo/presto24/journal.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -U2 -r1.19 -r1.20
--- journal.c	2001/09/07 23:21:03	1.19
+++ journal.c	2001/09/11 18:25:54	1.20
@@ -301,6 +301,7 @@
 	   disable ths until version 1.2 */
         if ( dentry ) { 
-                s.prevrec = cpu_to_le32(rec->offset - dentry->d_time);
-                dentry->d_time = (unsigned long) rec->offset;
+                s.prevrec = cpu_to_le32(rec->offset - 
+                                        presto_d2d(dentry)->dd_kml_offset);
+                presto_d2d(dentry)->dd_kml_offset = rec->offset;
         } else { 
                 s.prevrec = -1;

Index: presto.c
===================================================================
RCS file: /cvsroot/intermezzo/intermezzo/presto24/presto.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -U2 -r1.4 -r1.5
--- presto.c	2001/09/07 23:21:03	1.4
+++ presto.c	2001/09/11 18:25:54	1.5
@@ -51,14 +51,16 @@
 }
 
-
-static inline int presto_dentry_is_fsetroot(struct dentry *dentry)
+inline struct presto_dentry_data *presto_d2d(struct dentry *dentry)
 {
-        return ((long) dentry->d_fsdata) & PRESTO_FSETROOT;
+        return (struct presto_dentry_data *)dentry->d_fsdata;
 }
 
 static inline struct presto_file_set *presto_dentry2fset(struct dentry *dentry)
 {
-        return (struct presto_file_set *)
-                (((long) dentry->d_fsdata) - PRESTO_FSETROOT);
+        if (dentry->d_fsdata == NULL) {
+                printk("fucked dentry: %p\n", dentry);
+                BUG();
+        }
+        return presto_d2d(dentry)->dd_fset;
 }
 
@@ -113,5 +115,5 @@
         fsde = de;
         for ( ; ; ) {
-                if ( presto_dentry_is_fsetroot(fsde) ) {
+                if ( presto_dentry2fset(fsde) ) {
                         EXIT;
                         return presto_dentry2fset(fsde);
@@ -184,12 +186,6 @@
         }
 
-        /* if it is a fsetroot, it's stored in the fset_flags */
-        if ( fset && presto_dentry_is_fsetroot(dentry) ) {
-                EXIT;
-                return fset->fset_data & flag;
-        }
-
         EXIT;
-        return ((int)dentry->d_fsdata & flag);
+        return (presto_d2d(dentry)->dd_flags & flag);
 }
 
@@ -198,20 +194,11 @@
 {
 
+        ENTRY;
         if ( dentry->d_inode ) {
                 CDEBUG(D_INODE, "SET ino %ld, flag %x\n",
                        dentry->d_inode->i_ino, flag);
-        }
-
-        if ( presto_dentry_is_fsetroot(dentry)) {
-                struct presto_file_set *fset = presto_dentry2fset(dentry);
-                if (fset) {
-                        fset->fset_data |= flag;
-                        CDEBUG(D_INODE, "Setting fset->fset_data: now %x\n",
-                               fset->fset_data);
-                }
-        } else {
-                CDEBUG(D_INODE, "Setting dentry->d_fsdata\n");
-                ((int)dentry->d_fsdata) |= flag;
         }
+        presto_d2d(dentry)->dd_flags |= flag;
+        EXIT;
 }
 
@@ -465,12 +452,12 @@
         int error;
 
-        CDEBUG(D_INODE, "name: %s, and flag %x, or flag %x\n",
-               name, and_flag, or_flag);
-
         error = presto_walk(name, &nd);
         if (error)
                 return error;
         dentry = nd.dentry;
-        CDEBUG(D_INODE, "dentry at %p, d_fsdata %p\n", dentry, dentry->d_fsdata);
+
+        CDEBUG(D_INODE, "name: %s, and flag %x, or flag %x, dd_flags %x\n",
+               name, and_flag, or_flag, presto_d2d(dentry)->dd_flags);
+
 
         error = -ENXIO;
@@ -479,23 +466,11 @@
 
         error = 0;
-        if ( presto_dentry_is_fsetroot(dentry) ) {
-                struct presto_file_set *fset = presto_dentry2fset(dentry);
-                CDEBUG(D_INODE, "Setting fset fset_data: fset %p\n", fset);
-                if ( fset ) {
-                        fset->fset_data &= and_flag;
-                        fset->fset_data |= or_flag;
-                        if (res) {
-                                *res = fset->fset_data;
-                        }
-                }
-                CDEBUG(D_INODE, "fset %p, flags %x data %x\n", 
-                       fset, fset->fset_flags, fset->fset_data);
-        } else {
-                ((int)dentry->d_fsdata) &= and_flag;
-                ((int)dentry->d_fsdata) |= or_flag;
-                if (res) 
-                        *res = (int)dentry->d_fsdata;
-        }
 
+        presto_d2d(dentry)->dd_flags  &= and_flag;
+        presto_d2d(dentry)->dd_flags  |= or_flag;
+        if (res) 
+                *res = presto_d2d(dentry)->dd_flags;
+
+        // XXX this check makes no sense as d_count can change anytime.
         /* indicate if we were the only users while changing the flag */
         if ( atomic_read(&dentry->d_count) > 1 )
@@ -836,4 +811,5 @@
         error = -EEXIST;
         CDEBUG(D_INODE, "\n");
+
         fset2 = presto_fset(dentry);
         if (fset2 && (fset2->fset_mtpt == dentry) ) { 
@@ -850,5 +826,5 @@
 	fset->fset_file_maxio = FSET_DEFAULT_MAX_FILEIO; 
 
-        dentry->d_fsdata = (void *) ( ((long)fset) + PRESTO_FSETROOT );
+        presto_d2d(dentry)->dd_fset = fset;
         list_add(&fset->fset_list, &cache->cache_fset_list);
 
@@ -894,6 +870,6 @@
         }
 
-        CDEBUG(D_PIOCTL, "-------> fset at %p, dentry at %p, mtpt %p, fset %s, cache \
                %p, d_fsdata %p\n",
-               fset, dentry, fset->fset_mtpt, fset->fset_name, cache, \
dentry->d_fsdata); +        CDEBUG(D_PIOCTL, "-------> fset at %p, dentry at %p, mtpt \
%p, fset %s, cache %p, presto_d2d(dentry)->dd_fset %p\n", +               fset, \
dentry, fset->fset_mtpt, fset->fset_name, cache, presto_d2d(dentry)->dd_fset);  
         EXIT;
@@ -902,5 +878,5 @@
  out_list_del:
         list_del(&fset->fset_list);
-        dentry->d_fsdata = 0;
+        presto_d2d(dentry)->dd_fset = NULL;
  out_dput:
         path_release(&fset->fset_nd); 
@@ -932,5 +908,5 @@
 
         error = -EINVAL;
-        if ( ! presto_dentry_is_fsetroot(dentry)) {
+        if ( ! presto_dentry2fset(dentry)) {
                 EXIT;
                 goto kml_out;
@@ -950,4 +926,37 @@
 }
 
+static void presto_cleanup_fset(struct presto_file_set *fset)
+{
+	int error;
+	struct presto_cache *cache;
+
+	ENTRY;
+#ifdef  CONFIG_KREINT
+        error = kml_cleanup (fset);
+        if ( error ) {
+                printk("InterMezzo: Closing kml for fset %s: %d\n",
+                       fset->fset_name, error);
+        }
+#endif
+
+        error = presto_close_journal_file(fset);
+        if ( error ) {
+                printk("InterMezzo: Closing journal for fset %s: %d\n",
+                       fset->fset_name, error);
+        }
+        cache = fset->fset_cache;
+        cache->cache_flags &= ~CACHE_FSETROOT_SET;
+
+        list_del(&fset->fset_list);
+
+	presto_d2d(fset->fset_mtpt)->dd_fset = NULL;
+        path_release(&fset->fset_nd);
+
+        fset->fset_mtpt = NULL;
+        PRESTO_FREE(fset->fset_name, strlen(fset->fset_name) + 1);
+        PRESTO_FREE(fset, sizeof(*fset));
+        EXIT;
+}
+
 int presto_clear_fsetroot(char *path)
 {
@@ -955,5 +964,4 @@
         struct presto_file_set *fset;
         struct dentry *dentry;
-        struct presto_cache *cache;
         int error;
 
@@ -973,5 +981,5 @@
 
         error = -EINVAL;
-        if ( ! presto_dentry_is_fsetroot(dentry)) {
+        if ( ! presto_dentry2fset(dentry)) {
                 EXIT;
                 goto put_out;
@@ -984,26 +992,5 @@
         }
 
-#ifdef  CONFIG_KREINT
-        error = kml_cleanup (fset);
-        if ( error ) {
-                printk("InterMezzo: Closing kml for fset %s: %d\n",
-                       fset->fset_name, error);
-        }
-#endif
-
-        error = presto_close_journal_file(fset);
-        if ( error ) {
-                printk("InterMezzo: Closing journal for fset %s: %d\n",
-                       fset->fset_name, error);
-        }
-        cache = fset->fset_cache;
-        cache->cache_flags &= ~CACHE_FSETROOT_SET;
-
-        list_del(&fset->fset_list);
-        dentry->d_fsdata = 0;
-        path_release(&fset->fset_nd);
-        fset->fset_mtpt = NULL;
-        PRESTO_FREE(fset->fset_name, strlen(fset->fset_name) + 1);
-        PRESTO_FREE(fset, sizeof(*fset));
+	presto_cleanup_fset(fset);
         EXIT;
 
@@ -1038,5 +1025,5 @@
 
         error = -EINVAL;
-        if ( ! presto_dentry_is_fsetroot(dentry)) {
+        if ( ! presto_dentry2fset(dentry)) {
                 EXIT;
                 goto put_out;
@@ -1050,5 +1037,4 @@
 
         cache = fset->fset_cache;
-        cache = fset->fset_cache;
         cache->cache_flags &= ~CACHE_FSETROOT_SET;
 
@@ -1056,20 +1042,9 @@
         tmpnext = tmp->next;
         while ( tmpnext != &cache->cache_fset_list) {
-		tmp=tmpnext;
-                tmpnext=tmp->next;
+		tmp = tmpnext;
+                tmpnext = tmp->next;
                 fset = list_entry(tmp, struct presto_file_set, fset_list);
 
-                
-                error = presto_close_journal_file(fset);
-                if ( error ) {
-                        printk("InterMezzo: Closing journal for fset %s: %d\n",
-                               fset->fset_name, error);
-                }
-                list_del(&fset->fset_list);
-                fset->fset_mtpt->d_fsdata = 0;
-                path_release(&fset->fset_nd);
-                fset->fset_mtpt = NULL;
-                PRESTO_FREE(fset->fset_name, strlen(fset->fset_name) +1);
-                PRESTO_FREE(fset, sizeof(*fset));
+		presto_cleanup_fset(fset);
         }
 
@@ -1104,5 +1079,5 @@
 
         error = -EINVAL;
-        if ( ! presto_dentry_is_fsetroot(dentry)) {
+        if ( ! presto_dentry2fset(dentry)) {
                 EXIT;
                 goto kml_out;

Index: super.c
===================================================================
RCS file: /cvsroot/intermezzo/intermezzo/presto24/super.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -U2 -r1.9 -r1.10
--- super.c	2001/08/15 17:02:12	1.9
+++ super.c	2001/09/11 18:25:54	1.10
@@ -320,5 +320,4 @@
         }
 
-	
 	cache->cache_sb = mysb;
         ops = filter_get_filter_fs(cache_type);
@@ -349,4 +348,5 @@
                 presto_sb->s_root->d_op = filter_c2udops(cache->cache_filter);
                 cache->cache_mtde = mysb->s_root;
+                presto_set_dd(mysb->s_root);
         }
 
@@ -482,4 +482,5 @@
 
         presto_init_cache_hash();
+        presto_init_ddata_cache();
 
         status = register_filesystem(&presto_fs_type);
@@ -513,5 +514,5 @@
         presto_psdev_cleanup();
         cleanup_intermezzo_sysctl();
-
+        presto_cleanup_ddata_cache();
 
 #ifdef PRESTO_DEVEL

Index: vfs.c
===================================================================
RCS file: /cvsroot/intermezzo/intermezzo/presto24/vfs.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -U2 -r1.31 -r1.32
--- vfs.c	2001/09/07 23:21:03	1.31
+++ vfs.c	2001/09/11 18:25:54	1.32
@@ -506,15 +506,6 @@
                 struct presto_cache *cache = fset->fset_cache;
                 /* was this already done? */
-                if ( !filter_c2cfiops(cache->cache_filter) )
-                        filter_setup_file_ops(cache->cache_filter, 
-                                              dentry->d_inode,
-                                              &presto_file_iops,
-                                              &presto_file_fops);
-
-                /* make the new inode ours */
-                dentry->d_inode->i_op = 
-                        filter_c2ufiops(cache->cache_filter);
-                dentry->d_inode->i_fop = 
-                        filter_c2uffops(cache->cache_filter);
+                presto_set_ops(dentry->d_inode, cache->cache_filter);
+
                 filter_setup_dentry_ops(cache->cache_filter, 
                                         dentry->d_op, 
@@ -1002,13 +993,6 @@
                 struct presto_cache *cache = fset->fset_cache;
                 
-                /* was this already done? */
-                if ( !filter_c2csiops(cache->cache_filter) )
-                        filter_setup_symlink_ops(cache->cache_filter, 
-                                                 dentry->d_inode,
-                                                 &presto_sym_iops,
-                                                 NULL);
+                presto_set_ops(dentry->d_inode, cache->cache_filter);
 
-                /* make the new inode ours */
-                dentry->d_inode->i_op = filter_c2usiops(cache->cache_filter);
                 filter_setup_dentry_ops(cache->cache_filter, dentry->d_op, 
                                         &presto_dentry_ops);
@@ -1171,6 +1155,7 @@
              dentry->d_inode->i_gid != presto_excluded_gid) {
                 struct presto_cache *cache = fset->fset_cache;
-                /* make it ours */
-                dentry->d_inode->i_op = filter_c2udiops(cache->cache_filter);
+
+                presto_set_ops(dentry->d_inode, cache->cache_filter);
+
                 filter_setup_dentry_ops(cache->cache_filter, 
                                         dentry->d_op, 
@@ -1473,6 +1458,7 @@
              dentry->d_inode->i_gid != presto_excluded_gid) {
                 struct presto_cache *cache = fset->fset_cache;
-                /* make it ours */
-                dentry->d_inode->i_op = filter_c2udiops(cache->cache_filter);
+
+                presto_set_ops(dentry->d_inode, cache->cache_filter);
+
                 filter_setup_dentry_ops(cache->cache_filter, dentry->d_op, 
                                         &presto_dentry_ops);


_______________________________________________
intermezzo-commit mailing list
intermezzo-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/intermezzo-commit


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic