Skip to content

Commit

Permalink
GFS2: Fix metafs mounts
Browse files Browse the repository at this point in the history
This patch is intended to fix the issues reported in bz #457798. Instead
of having the metafs as a separate filesystem, it becomes a second root
of gfs2. As a result it will appear as type gfs2 in /proc/mounts, but it
is still possible (for backwards compatibility purposes) to mount it as
type gfs2meta. A new mount flag "meta" is introduced so that its possible
to tell the two cases apart in /proc/mounts.

As a result it becomes possible to mount type gfs2 with -o meta and
get the same result as mounting type gfs2meta. So it is possible to
mount just the metafs on its own. Currently if you do this, its then
impossible to mount the "normal" root of the gfs2 filesystem without
first unmounting the metafs root. I'm not sure if thats a feature or
a bug :-)

Either way, this is a great improvement on the previous scheme and I've
verified that it works ok with bind mounts on both the "normal" root
and the metafs root in various combinations.

There were also a bunch of functions in super.c which didn't belong there,
so this moves them into ops_fstype.c where they can be static. Hopefully
the mount/umount sequence is now more obvious as a result.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Cc: Alexander Viro <aviro@redhat.com>
  • Loading branch information
Steven Whitehouse committed Aug 13, 2008
1 parent c1e817d commit 9b8df98
Show file tree
Hide file tree
Showing 6 changed files with 448 additions and 535 deletions.
7 changes: 4 additions & 3 deletions fs/gfs2/incore.h
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,7 @@ struct gfs2_args {
int ar_quota; /* off/account/on */
int ar_suiddir; /* suiddir support */
int ar_data; /* ordered/writeback */
int ar_meta; /* mount metafs */
};

struct gfs2_tune {
Expand Down Expand Up @@ -461,7 +462,6 @@ struct gfs2_sb_host {

struct gfs2_sbd {
struct super_block *sd_vfs;
struct super_block *sd_vfs_meta;
struct kobject sd_kobj;
unsigned long sd_flags; /* SDF_... */
struct gfs2_sb_host sd_sb;
Expand Down Expand Up @@ -499,7 +499,9 @@ struct gfs2_sbd {

/* Inode Stuff */

struct inode *sd_master_dir;
struct dentry *sd_master_dir;
struct dentry *sd_root_dir;

struct inode *sd_jindex;
struct inode *sd_inum_inode;
struct inode *sd_statfs_inode;
Expand Down Expand Up @@ -634,7 +636,6 @@ struct gfs2_sbd {
/* Debugging crud */

unsigned long sd_last_warning;
struct vfsmount *sd_gfs2mnt;
struct dentry *debugfs_dir; /* debugfs directory */
struct dentry *debugfs_dentry_glocks; /* for debugfs */
};
Expand Down
7 changes: 7 additions & 0 deletions fs/gfs2/mount.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ enum {
Opt_nosuiddir,
Opt_data_writeback,
Opt_data_ordered,
Opt_meta,
Opt_err,
};

Expand All @@ -66,6 +67,7 @@ static match_table_t tokens = {
{Opt_nosuiddir, "nosuiddir"},
{Opt_data_writeback, "data=writeback"},
{Opt_data_ordered, "data=ordered"},
{Opt_meta, "meta"},
{Opt_err, NULL}
};

Expand Down Expand Up @@ -239,6 +241,11 @@ int gfs2_mount_args(struct gfs2_sbd *sdp, char *data_arg, int remount)
case Opt_data_ordered:
args->ar_data = GFS2_DATA_ORDERED;
break;
case Opt_meta:
if (remount && args->ar_meta != 1)
goto cant_remount;
args->ar_meta = 1;
break;
case Opt_err:
default:
fs_info(sdp, "unknown option: %s\n", o);
Expand Down
Loading

0 comments on commit 9b8df98

Please sign in to comment.