This commit was manufactured by cvs2svn to create branch 'vserver'.
[linux-2.6.git] / fs / libfs.c
index 5d3f82b..5015689 100644 (file)
@@ -122,7 +122,8 @@ static inline unsigned char dt_type(struct inode *inode)
  * both impossible due to the lock on directory.
  */
 
-int dcache_readdir(struct file * filp, void * dirent, filldir_t filldir)
+static inline int do_dcache_readdir_filter(struct file * filp,
+       void * dirent, filldir_t filldir, int (*filter)(struct dentry *dentry))
 {
        struct dentry *dentry = filp->f_dentry;
        struct dentry *cursor = filp->private_data;
@@ -156,6 +157,8 @@ int dcache_readdir(struct file * filp, void * dirent, filldir_t filldir)
                                next = list_entry(p, struct dentry, d_child);
                                if (d_unhashed(next) || !next->d_inode)
                                        continue;
+                               if (filter && !filter(next))
+                                       continue;
 
                                spin_unlock(&dcache_lock);
                                if (filldir(dirent, next->d_name.name, next->d_name.len, filp->f_pos, next->d_inode->i_ino, dt_type(next->d_inode)) < 0)
@@ -172,6 +175,18 @@ int dcache_readdir(struct file * filp, void * dirent, filldir_t filldir)
        return 0;
 }
 
+int dcache_readdir(struct file * filp, void * dirent, filldir_t filldir)
+{
+       return do_dcache_readdir_filter(filp, dirent, filldir, NULL);
+}
+
+int dcache_readdir_filter(struct file * filp, void * dirent, filldir_t filldir,
+       int (*filter)(struct dentry *))
+{
+       return do_dcache_readdir_filter(filp, dirent, filldir, filter);
+}
+
+
 ssize_t generic_read_dir(struct file *filp, char __user *buf, size_t siz, loff_t *ppos)
 {
        return -EISDIR;
@@ -212,6 +227,7 @@ get_sb_pseudo(struct file_system_type *fs_type, char *name,
        s->s_blocksize_bits = 10;
        s->s_magic = magic;
        s->s_op = ops ? ops : &default_ops;
+       s->s_time_gran = 1;
        root = new_inode(s);
        if (!root)
                goto Enomem;
@@ -374,6 +390,7 @@ int simple_fill_super(struct super_block *s, int magic, struct tree_descr *files
        s->s_blocksize_bits = PAGE_CACHE_SHIFT;
        s->s_magic = magic;
        s->s_op = &s_ops;
+       s->s_time_gran = 1;
 
        inode = new_inode(s);
        if (!inode)
@@ -391,13 +408,9 @@ int simple_fill_super(struct super_block *s, int magic, struct tree_descr *files
                return -ENOMEM;
        }
        for (i = 0; !files->name || files->name[0]; i++, files++) {
-               struct qstr name;
                if (!files->name)
                        continue;
-               name.name = files->name;
-               name.len = strlen(name.name);
-               name.hash = full_name_hash(name.name, name.len);
-               dentry = d_alloc(root, &name);
+               dentry = d_alloc_name(root, files->name);
                if (!dentry)
                        goto out;
                inode = new_inode(s);
@@ -420,7 +433,7 @@ out:
        return -ENOMEM;
 }
 
-static spinlock_t pin_fs_lock = SPIN_LOCK_UNLOCKED;
+static DEFINE_SPINLOCK(pin_fs_lock);
 
 int simple_pin_fs(char *name, struct vfsmount **mount, int *count)
 {
@@ -478,7 +491,7 @@ ssize_t simple_read_from_buffer(void __user *to, size_t count, loff_t *ppos,
 char *simple_transaction_get(struct file *file, const char __user *buf, size_t size)
 {
        struct simple_transaction_argresp *ar;
-       static spinlock_t simple_transaction_lock = SPIN_LOCK_UNLOCKED;
+       static DEFINE_SPINLOCK(simple_transaction_lock);
 
        if (size > SIMPLE_TRANSACTION_LIMIT - 1)
                return ERR_PTR(-EFBIG);
@@ -525,11 +538,14 @@ EXPORT_SYMBOL(dcache_dir_close);
 EXPORT_SYMBOL(dcache_dir_lseek);
 EXPORT_SYMBOL(dcache_dir_open);
 EXPORT_SYMBOL(dcache_readdir);
+EXPORT_SYMBOL(dcache_readdir_filter);
 EXPORT_SYMBOL(generic_read_dir);
+EXPORT_SYMBOL(get_sb_pseudo);
 EXPORT_SYMBOL(simple_commit_write);
 EXPORT_SYMBOL(simple_dir_inode_operations);
 EXPORT_SYMBOL(simple_dir_operations);
 EXPORT_SYMBOL(simple_empty);
+EXPORT_SYMBOL(d_alloc_name);
 EXPORT_SYMBOL(simple_fill_super);
 EXPORT_SYMBOL(simple_getattr);
 EXPORT_SYMBOL(simple_link);