]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - mm/shmem.c
pageflags: standardize comment inclusion in asm-offsets.h and fix MIPS
[linux-2.6-omap-h63xx.git] / mm / shmem.c
index f514dd392cd93570e108ba5a489a28975d85034a..177c7a7d2bb38c8e3a52719e3f1e0ca8f9c4deb8 100644 (file)
@@ -1079,9 +1079,11 @@ redirty:
 
 #ifdef CONFIG_NUMA
 #ifdef CONFIG_TMPFS
-static int shmem_parse_mpol(char *value, int *policy, nodemask_t *policy_nodes)
+static int shmem_parse_mpol(char *value, unsigned short *policy,
+                       unsigned short *mode_flags, nodemask_t *policy_nodes)
 {
        char *nodelist = strchr(value, ':');
+       char *flags = strchr(value, '=');
        int err = 1;
 
        if (nodelist) {
@@ -1092,6 +1094,8 @@ static int shmem_parse_mpol(char *value, int *policy, nodemask_t *policy_nodes)
                if (!nodes_subset(*policy_nodes, node_states[N_HIGH_MEMORY]))
                        goto out;
        }
+       if (flags)
+               *flags++ = '\0';
        if (!strcmp(value, "default")) {
                *policy = MPOL_DEFAULT;
                /* Don't allow a nodelist */
@@ -1121,15 +1125,31 @@ static int shmem_parse_mpol(char *value, int *policy, nodemask_t *policy_nodes)
                        *policy_nodes = node_states[N_HIGH_MEMORY];
                err = 0;
        }
+
+       *mode_flags = 0;
+       if (flags) {
+               /*
+                * Currently, we only support two mutually exclusive
+                * mode flags.
+                */
+               if (!strcmp(flags, "static"))
+                       *mode_flags |= MPOL_F_STATIC_NODES;
+               else if (!strcmp(flags, "relative"))
+                       *mode_flags |= MPOL_F_RELATIVE_NODES;
+               else
+                       err = 1;        /* unrecognized flag */
+       }
 out:
        /* Restore string for error message */
        if (nodelist)
                *--nodelist = ':';
+       if (flags)
+               *--flags = '=';
        return err;
 }
 
-static void shmem_show_mpol(struct seq_file *seq, int policy,
-                           const nodemask_t policy_nodes)
+static void shmem_show_mpol(struct seq_file *seq, unsigned short policy,
+                       unsigned short flags, const nodemask_t policy_nodes)
 {
        char *policy_string;
 
@@ -1197,14 +1217,14 @@ static struct page *shmem_alloc_page(gfp_t gfp,
 }
 #else /* !CONFIG_NUMA */
 #ifdef CONFIG_TMPFS
-static inline int shmem_parse_mpol(char *value, int *policy,
-                                               nodemask_t *policy_nodes)
+static inline int shmem_parse_mpol(char *value, unsigned short *policy,
+                       unsigned short *mode_flags, nodemask_t *policy_nodes)
 {
        return 1;
 }
 
-static inline void shmem_show_mpol(struct seq_file *seq, int policy,
-                           const nodemask_t policy_nodes)
+static inline void shmem_show_mpol(struct seq_file *seq, unsigned short policy,
+                       unsigned short flags, const nodemask_t policy_nodes)
 {
 }
 #endif /* CONFIG_TMPFS */
@@ -1577,7 +1597,7 @@ shmem_get_inode(struct super_block *sb, int mode, dev_t dev)
                        inode->i_op = &shmem_inode_operations;
                        inode->i_fop = &shmem_file_operations;
                        mpol_shared_policy_init(&info->policy, sbinfo->policy,
-                                                       &sbinfo->policy_nodes);
+                                       sbinfo->flags, &sbinfo->policy_nodes);
                        break;
                case S_IFDIR:
                        inc_nlink(inode);
@@ -1591,7 +1611,7 @@ shmem_get_inode(struct super_block *sb, int mode, dev_t dev)
                         * Must not load anything in the rbtree,
                         * mpol_free_shared_policy will not be called.
                         */
-                       mpol_shared_policy_init(&info->policy, MPOL_DEFAULT,
+                       mpol_shared_policy_init(&info->policy, MPOL_DEFAULT, 0,
                                                NULL);
                        break;
                }
@@ -2208,7 +2228,7 @@ static int shmem_parse_options(char *options, struct shmem_sb_info *sbinfo,
                                goto bad_val;
                } else if (!strcmp(this_char,"mpol")) {
                        if (shmem_parse_mpol(value, &sbinfo->policy,
-                                            &sbinfo->policy_nodes))
+                               &sbinfo->flags, &sbinfo->policy_nodes))
                                goto bad_val;
                } else {
                        printk(KERN_ERR "tmpfs: Bad mount option %s\n",
@@ -2260,6 +2280,7 @@ static int shmem_remount_fs(struct super_block *sb, int *flags, char *data)
        sbinfo->max_inodes  = config.max_inodes;
        sbinfo->free_inodes = config.max_inodes - inodes;
        sbinfo->policy      = config.policy;
+       sbinfo->flags       = config.flags;
        sbinfo->policy_nodes = config.policy_nodes;
 out:
        spin_unlock(&sbinfo->stat_lock);
@@ -2281,7 +2302,8 @@ static int shmem_show_options(struct seq_file *seq, struct vfsmount *vfs)
                seq_printf(seq, ",uid=%u", sbinfo->uid);
        if (sbinfo->gid != 0)
                seq_printf(seq, ",gid=%u", sbinfo->gid);
-       shmem_show_mpol(seq, sbinfo->policy, sbinfo->policy_nodes);
+       shmem_show_mpol(seq, sbinfo->policy, sbinfo->flags,
+                       sbinfo->policy_nodes);
        return 0;
 }
 #endif /* CONFIG_TMPFS */
@@ -2312,6 +2334,7 @@ static int shmem_fill_super(struct super_block *sb,
        sbinfo->uid = current->fsuid;
        sbinfo->gid = current->fsgid;
        sbinfo->policy = MPOL_DEFAULT;
+       sbinfo->flags = 0;
        sbinfo->policy_nodes = node_states[N_HIGH_MEMORY];
        sb->s_fs_info = sbinfo;