X-Git-Url: http://pilppa.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=mm%2Fshmem.c;h=177c7a7d2bb38c8e3a52719e3f1e0ca8f9c4deb8;hb=bf2ae2b37c06cc9fb6fc03d99617f1161939980f;hp=f514dd392cd93570e108ba5a489a28975d85034a;hpb=ca1a6ba57c5fca755b4ac7a13395bca2e2e371b1;p=linux-2.6-omap-h63xx.git diff --git a/mm/shmem.c b/mm/shmem.c index f514dd392cd..177c7a7d2bb 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -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;