Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1fba5868 authored by Marc Dionne's avatar Marc Dionne Committed by David Howells
Browse files

afs: Fix mounting of backup volumes



In theory the AFS_VLSF_BACKVOL flag for a server in a vldb entry
would indicate the presence of a backup volume on that server.

In practice however, this flag is never set, and the presence of
a backup volume is implied by the entry having AFS_VLF_BACKEXISTS set,
for the server that hosts the read-write volume (has AFS_VLSF_RWVOL).

Signed-off-by: default avatarMarc Dionne <marc.dionne@auristor.com>
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
parent 378831e4
Loading
Loading
Loading
Loading
+10 −9
Original line number Original line Diff line number Diff line
@@ -23,7 +23,7 @@ static int afs_deliver_vl_get_entry_by_name_u(struct afs_call *call)
	struct afs_uvldbentry__xdr *uvldb;
	struct afs_uvldbentry__xdr *uvldb;
	struct afs_vldb_entry *entry;
	struct afs_vldb_entry *entry;
	bool new_only = false;
	bool new_only = false;
	u32 tmp, nr_servers;
	u32 tmp, nr_servers, vlflags;
	int i, ret;
	int i, ret;


	_enter("");
	_enter("");
@@ -55,6 +55,7 @@ static int afs_deliver_vl_get_entry_by_name_u(struct afs_call *call)
			new_only = true;
			new_only = true;
	}
	}


	vlflags = ntohl(uvldb->flags);
	for (i = 0; i < nr_servers; i++) {
	for (i = 0; i < nr_servers; i++) {
		struct afs_uuid__xdr *xdr;
		struct afs_uuid__xdr *xdr;
		struct afs_uuid *uuid;
		struct afs_uuid *uuid;
@@ -64,12 +65,13 @@ static int afs_deliver_vl_get_entry_by_name_u(struct afs_call *call)
		if (tmp & AFS_VLSF_DONTUSE ||
		if (tmp & AFS_VLSF_DONTUSE ||
		    (new_only && !(tmp & AFS_VLSF_NEWREPSITE)))
		    (new_only && !(tmp & AFS_VLSF_NEWREPSITE)))
			continue;
			continue;
		if (tmp & AFS_VLSF_RWVOL)
		if (tmp & AFS_VLSF_RWVOL) {
			entry->fs_mask[i] |= AFS_VOL_VTM_RW;
			entry->fs_mask[i] |= AFS_VOL_VTM_RW;
			if (vlflags & AFS_VLF_BACKEXISTS)
				entry->fs_mask[i] |= AFS_VOL_VTM_BAK;
		}
		if (tmp & AFS_VLSF_ROVOL)
		if (tmp & AFS_VLSF_ROVOL)
			entry->fs_mask[i] |= AFS_VOL_VTM_RO;
			entry->fs_mask[i] |= AFS_VOL_VTM_RO;
		if (tmp & AFS_VLSF_BACKVOL)
			entry->fs_mask[i] |= AFS_VOL_VTM_BAK;
		if (!entry->fs_mask[i])
		if (!entry->fs_mask[i])
			continue;
			continue;


@@ -89,15 +91,14 @@ static int afs_deliver_vl_get_entry_by_name_u(struct afs_call *call)
	for (i = 0; i < AFS_MAXTYPES; i++)
	for (i = 0; i < AFS_MAXTYPES; i++)
		entry->vid[i] = ntohl(uvldb->volumeId[i]);
		entry->vid[i] = ntohl(uvldb->volumeId[i]);


	tmp = ntohl(uvldb->flags);
	if (vlflags & AFS_VLF_RWEXISTS)
	if (tmp & AFS_VLF_RWEXISTS)
		__set_bit(AFS_VLDB_HAS_RW, &entry->flags);
		__set_bit(AFS_VLDB_HAS_RW, &entry->flags);
	if (tmp & AFS_VLF_ROEXISTS)
	if (vlflags & AFS_VLF_ROEXISTS)
		__set_bit(AFS_VLDB_HAS_RO, &entry->flags);
		__set_bit(AFS_VLDB_HAS_RO, &entry->flags);
	if (tmp & AFS_VLF_BACKEXISTS)
	if (vlflags & AFS_VLF_BACKEXISTS)
		__set_bit(AFS_VLDB_HAS_BAK, &entry->flags);
		__set_bit(AFS_VLDB_HAS_BAK, &entry->flags);


	if (!(tmp & (AFS_VLF_RWEXISTS | AFS_VLF_ROEXISTS | AFS_VLF_BACKEXISTS))) {
	if (!(vlflags & (AFS_VLF_RWEXISTS | AFS_VLF_ROEXISTS | AFS_VLF_BACKEXISTS))) {
		entry->error = -ENOMEDIUM;
		entry->error = -ENOMEDIUM;
		__set_bit(AFS_VLDB_QUERY_ERROR, &entry->flags);
		__set_bit(AFS_VLDB_QUERY_ERROR, &entry->flags);
	}
	}