aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Whitehouse <swhiteho@redhat.com>2009-07-31 06:07:29 -0400
committerSteven Whitehouse <swhiteho@redhat.com>2009-08-17 06:04:42 -0400
commit8633ecfaba4ce53c094f8db92dbd7ac474a7aa36 (patch)
treebadd46586f0d33184e42e3091f510c21f063d7de
parent894ef820b10d77e2d6d717342fc408bdd9825139 (diff)
GFS2: Add online uevent to GFS2
We already have an offline uevent (used when a withdraw occurs) but no online uevent. This adds an online uevent so that userspace will be able to detect a successful mount by means other than not receiving a remove event after the add & recovery (change) uevents. It has also been added to the remount path as well - we can't use a change uevent there as older GFS2 userspace acts on change uevents according to the state that it thinks the fs is in, so we can't easily add any new ones. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
-rw-r--r--fs/gfs2/ops_fstype.c13
-rw-r--r--fs/gfs2/super.c1
-rw-r--r--fs/gfs2/super.h4
3 files changed, 15 insertions, 3 deletions
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
index 7bc3c45cd676..39021c020176 100644
--- a/fs/gfs2/ops_fstype.c
+++ b/fs/gfs2/ops_fstype.c
@@ -1133,6 +1133,17 @@ void gfs2_lm_unmount(struct gfs2_sbd *sdp)
1133 lm->lm_unmount(sdp); 1133 lm->lm_unmount(sdp);
1134} 1134}
1135 1135
1136void gfs2_online_uevent(struct gfs2_sbd *sdp)
1137{
1138 struct super_block *sb = sdp->sd_vfs;
1139 char ro[20];
1140 char spectator[20];
1141 char *envp[] = { ro, spectator, NULL };
1142 sprintf(ro, "RDONLY=%d", (sb->s_flags & MS_RDONLY) ? 1 : 0);
1143 sprintf(spectator, "SPECTATOR=%d", sdp->sd_args.ar_spectator ? 1 : 0);
1144 kobject_uevent_env(&sdp->sd_kobj, KOBJ_ONLINE, envp);
1145}
1146
1136/** 1147/**
1137 * fill_super - Read in superblock 1148 * fill_super - Read in superblock
1138 * @sb: The VFS superblock 1149 * @sb: The VFS superblock
@@ -1236,7 +1247,7 @@ static int fill_super(struct super_block *sb, void *data, int silent)
1236 } 1247 }
1237 1248
1238 gfs2_glock_dq_uninit(&mount_gh); 1249 gfs2_glock_dq_uninit(&mount_gh);
1239 1250 gfs2_online_uevent(sdp);
1240 return 0; 1251 return 0;
1241 1252
1242fail_threads: 1253fail_threads:
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c
index f522bb017973..85bd2bc8c1de 100644
--- a/fs/gfs2/super.c
+++ b/fs/gfs2/super.c
@@ -1084,6 +1084,7 @@ static int gfs2_remount_fs(struct super_block *sb, int *flags, char *data)
1084 gt->gt_log_flush_secs = args.ar_commit; 1084 gt->gt_log_flush_secs = args.ar_commit;
1085 spin_unlock(&gt->gt_spin); 1085 spin_unlock(&gt->gt_spin);
1086 1086
1087 gfs2_online_uevent(sdp);
1087 return 0; 1088 return 0;
1088} 1089}
1089 1090
diff --git a/fs/gfs2/super.h b/fs/gfs2/super.h
index 22e0417ed996..911c954cefbd 100644
--- a/fs/gfs2/super.h
+++ b/fs/gfs2/super.h
@@ -25,7 +25,7 @@ static inline unsigned int gfs2_jindex_size(struct gfs2_sbd *sdp)
25 return x; 25 return x;
26} 26}
27 27
28void gfs2_jindex_free(struct gfs2_sbd *sdp); 28extern void gfs2_jindex_free(struct gfs2_sbd *sdp);
29 29
30extern int gfs2_mount_args(struct gfs2_sbd *sdp, struct gfs2_args *args, char *data); 30extern int gfs2_mount_args(struct gfs2_sbd *sdp, struct gfs2_args *args, char *data);
31 31
@@ -36,7 +36,7 @@ extern int gfs2_lookup_in_master_dir(struct gfs2_sbd *sdp, char *filename,
36 struct gfs2_inode **ipp); 36 struct gfs2_inode **ipp);
37 37
38extern int gfs2_make_fs_rw(struct gfs2_sbd *sdp); 38extern int gfs2_make_fs_rw(struct gfs2_sbd *sdp);
39 39extern void gfs2_online_uevent(struct gfs2_sbd *sdp);
40extern int gfs2_statfs_init(struct gfs2_sbd *sdp); 40extern int gfs2_statfs_init(struct gfs2_sbd *sdp);
41extern void gfs2_statfs_change(struct gfs2_sbd *sdp, s64 total, s64 free, 41extern void gfs2_statfs_change(struct gfs2_sbd *sdp, s64 total, s64 free,
42 s64 dinodes); 42 s64 dinodes);