EXPORT_SYMBOL(d_obtain_alias) rather than EXPORT_SYMBOL_GPL
[safe/jmp/linux-2.6] / fs / autofs4 / inode.c
index cd81f08..716e12b 100644 (file)
 
 static void ino_lnkfree(struct autofs_info *ino)
 {
-       kfree(ino->u.symlink);
-       ino->u.symlink = NULL;
+       if (ino->u.symlink) {
+               kfree(ino->u.symlink);
+               ino->u.symlink = NULL;
+       }
 }
 
 struct autofs_info *autofs4_init_ino(struct autofs_info *ino,
@@ -41,16 +43,20 @@ struct autofs_info *autofs4_init_ino(struct autofs_info *ino,
        if (ino == NULL)
                return NULL;
 
-       ino->flags = 0;
-       ino->mode = mode;
-       ino->inode = NULL;
-       ino->dentry = NULL;
-       ino->size = 0;
-
-       INIT_LIST_HEAD(&ino->rehash);
+       if (!reinit) {
+               ino->flags = 0;
+               ino->inode = NULL;
+               ino->dentry = NULL;
+               ino->size = 0;
+               INIT_LIST_HEAD(&ino->active);
+               INIT_LIST_HEAD(&ino->expiring);
+               atomic_set(&ino->count, 0);
+       }
 
+       ino->uid = 0;
+       ino->gid = 0;
+       ino->mode = mode;
        ino->last_used = jiffies;
-       atomic_set(&ino->count, 0);
 
        ino->sbi = sbi;
 
@@ -159,8 +165,8 @@ void autofs4_kill_sb(struct super_block *sb)
        if (!sbi)
                goto out_kill_sb;
 
-       if (!sbi->catatonic)
-               autofs4_catatonic_mode(sbi); /* Free wait queues, close pipe */
+       /* Free wait queues, close pipe */
+       autofs4_catatonic_mode(sbi);
 
        /* Clean up and release dangling references */
        autofs4_force_release(sbi);
@@ -176,19 +182,24 @@ out_kill_sb:
 static int autofs4_show_options(struct seq_file *m, struct vfsmount *mnt)
 {
        struct autofs_sb_info *sbi = autofs4_sbi(mnt->mnt_sb);
+       struct inode *root_inode = mnt->mnt_sb->s_root->d_inode;
 
        if (!sbi)
                return 0;
 
        seq_printf(m, ",fd=%d", sbi->pipefd);
+       if (root_inode->i_uid != 0)
+               seq_printf(m, ",uid=%u", root_inode->i_uid);
+       if (root_inode->i_gid != 0)
+               seq_printf(m, ",gid=%u", root_inode->i_gid);
        seq_printf(m, ",pgrp=%d", sbi->oz_pgrp);
        seq_printf(m, ",timeout=%lu", sbi->exp_timeout/HZ);
        seq_printf(m, ",minproto=%d", sbi->min_proto);
        seq_printf(m, ",maxproto=%d", sbi->max_proto);
 
-       if (sbi->type & AUTOFS_TYPE_OFFSET)
+       if (autofs_type_offset(sbi->type))
                seq_printf(m, ",offset");
-       else if (sbi->type & AUTOFS_TYPE_DIRECT)
+       else if (autofs_type_direct(sbi->type))
                seq_printf(m, ",direct");
        else
                seq_printf(m, ",indirect");
@@ -204,7 +215,7 @@ static const struct super_operations autofs4_sops = {
 enum {Opt_err, Opt_fd, Opt_uid, Opt_gid, Opt_pgrp, Opt_minproto, Opt_maxproto,
        Opt_indirect, Opt_direct, Opt_offset};
 
-static match_table_t tokens = {
+static const match_table_t tokens = {
        {Opt_fd, "fd=%u"},
        {Opt_uid, "uid=%u"},
        {Opt_gid, "gid=%u"},
@@ -224,9 +235,9 @@ static int parse_options(char *options, int *pipefd, uid_t *uid, gid_t *gid,
        substring_t args[MAX_OPT_ARGS];
        int option;
 
-       *uid = current->uid;
-       *gid = current->gid;
-       *pgrp = process_group(current);
+       *uid = current_uid();
+       *gid = current_gid();
+       *pgrp = task_pgrp_nr(current);
 
        *minproto = AUTOFS_MIN_PROTO_VERSION;
        *maxproto = AUTOFS_MAX_PROTO_VERSION;
@@ -273,13 +284,13 @@ static int parse_options(char *options, int *pipefd, uid_t *uid, gid_t *gid,
                        *maxproto = option;
                        break;
                case Opt_indirect:
-                       *type = AUTOFS_TYPE_INDIRECT;
+                       set_autofs_type_indirect(type);
                        break;
                case Opt_direct:
-                       *type = AUTOFS_TYPE_DIRECT;
+                       set_autofs_type_direct(type);
                        break;
                case Opt_offset:
-                       *type = AUTOFS_TYPE_DIRECT | AUTOFS_TYPE_OFFSET;
+                       set_autofs_type_offset(type);
                        break;
                default:
                        return 1;
@@ -323,18 +334,19 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent)
        sbi->pipe = NULL;
        sbi->catatonic = 1;
        sbi->exp_timeout = 0;
-       sbi->oz_pgrp = process_group(current);
+       sbi->oz_pgrp = task_pgrp_nr(current);
        sbi->sb = s;
        sbi->version = 0;
        sbi->sub_version = 0;
-       sbi->type = 0;
+       set_autofs_type_indirect(&sbi->type);
        sbi->min_proto = 0;
        sbi->max_proto = 0;
        mutex_init(&sbi->wq_mutex);
        spin_lock_init(&sbi->fs_lock);
        sbi->queues = NULL;
-       spin_lock_init(&sbi->rehash_lock);
-       INIT_LIST_HEAD(&sbi->rehash_list);
+       spin_lock_init(&sbi->lookup_lock);
+       INIT_LIST_HEAD(&sbi->active_list);
+       INIT_LIST_HEAD(&sbi->expiring_list);
        s->s_blocksize = 1024;
        s->s_blocksize_bits = 10;
        s->s_magic = AUTOFS_SUPER_MAGIC;
@@ -368,7 +380,7 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent)
        }
 
        root_inode->i_fop = &autofs4_root_operations;
-       root_inode->i_op = sbi->type & AUTOFS_TYPE_DIRECT ?
+       root_inode->i_op = autofs_type_trigger(sbi->type) ?
                        &autofs4_direct_root_inode_operations :
                        &autofs4_indirect_root_inode_operations;
 
@@ -443,11 +455,7 @@ struct inode *autofs4_get_inode(struct super_block *sb,
        if (sb->s_root) {
                inode->i_uid = sb->s_root->d_inode->i_uid;
                inode->i_gid = sb->s_root->d_inode->i_gid;
-       } else {
-               inode->i_uid = 0;
-               inode->i_gid = 0;
        }
-       inode->i_blocks = 0;
        inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
 
        if (S_ISDIR(inf->mode)) {