GFS2: Improve journal allocation via sysfs
Recently a feature was added to GFS2 to allow journal id allocation via sysfs. This patch builds upon that so that a negative journal id will be treated as an error code to be passed back as the return code from mount. This allows termination of the mount process if there is a failure. Also, the process has been updated so that the kernel will wait for a journal id, even in the "spectator" case. This is required in order to avoid mounting a filesystem in case there is an error while joining the cluster. In the spectator case, 0 is written into the file to indicate that all is well, and that mount should continue. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
This commit is contained in:
@ -399,31 +399,32 @@ static ssize_t recover_status_show(struct gfs2_sbd *sdp, char *buf)
|
||||
|
||||
static ssize_t jid_show(struct gfs2_sbd *sdp, char *buf)
|
||||
{
|
||||
return sprintf(buf, "%u\n", sdp->sd_lockstruct.ls_jid);
|
||||
return sprintf(buf, "%d\n", sdp->sd_lockstruct.ls_jid);
|
||||
}
|
||||
|
||||
static ssize_t jid_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
|
||||
{
|
||||
unsigned jid;
|
||||
int jid;
|
||||
int rv;
|
||||
|
||||
rv = sscanf(buf, "%u", &jid);
|
||||
rv = sscanf(buf, "%d", &jid);
|
||||
if (rv != 1)
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock(&sdp->sd_jindex_spin);
|
||||
rv = -EINVAL;
|
||||
if (sdp->sd_args.ar_spectator)
|
||||
goto out;
|
||||
if (sdp->sd_lockstruct.ls_ops->lm_mount == NULL)
|
||||
goto out;
|
||||
rv = -EBUSY;
|
||||
if (test_and_clear_bit(SDF_NOJOURNALID, &sdp->sd_flags) == 0)
|
||||
if (test_bit(SDF_NOJOURNALID, &sdp->sd_flags) == 0)
|
||||
goto out;
|
||||
rv = 0;
|
||||
if (sdp->sd_args.ar_spectator && jid > 0)
|
||||
rv = jid = -EINVAL;
|
||||
sdp->sd_lockstruct.ls_jid = jid;
|
||||
clear_bit(SDF_NOJOURNALID, &sdp->sd_flags);
|
||||
smp_mb__after_clear_bit();
|
||||
wake_up_bit(&sdp->sd_flags, SDF_NOJOURNALID);
|
||||
rv = 0;
|
||||
out:
|
||||
spin_unlock(&sdp->sd_jindex_spin);
|
||||
return rv ? rv : len;
|
||||
@ -617,7 +618,7 @@ static int gfs2_uevent(struct kset *kset, struct kobject *kobj,
|
||||
add_uevent_var(env, "LOCKTABLE=%s", sdp->sd_table_name);
|
||||
add_uevent_var(env, "LOCKPROTO=%s", sdp->sd_proto_name);
|
||||
if (!test_bit(SDF_NOJOURNALID, &sdp->sd_flags))
|
||||
add_uevent_var(env, "JOURNALID=%u", sdp->sd_lockstruct.ls_jid);
|
||||
add_uevent_var(env, "JOURNALID=%d", sdp->sd_lockstruct.ls_jid);
|
||||
if (gfs2_uuid_valid(uuid))
|
||||
add_uevent_var(env, "UUID=%pUB", uuid);
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user