afs: Fix mounting of backup volumes
authorMarc Dionne <marc.dionne@auristor.com>
Wed, 16 May 2018 14:04:23 +0000 (11:04 -0300)
committerDavid Howells <dhowells@redhat.com>
Wed, 16 May 2018 20:35:23 +0000 (21:35 +0100)
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: Marc Dionne <marc.dionne@auristor.com>
Signed-off-by: David Howells <dhowells@redhat.com>
fs/afs/vlclient.c

index 1ed7e2f..c3b7408 100644 (file)
@@ -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_vldb_entry *entry;
        bool new_only = false;
-       u32 tmp, nr_servers;
+       u32 tmp, nr_servers, vlflags;
        int i, ret;
 
        _enter("");
@@ -55,6 +55,7 @@ static int afs_deliver_vl_get_entry_by_name_u(struct afs_call *call)
                        new_only = true;
        }
 
+       vlflags = ntohl(uvldb->flags);
        for (i = 0; i < nr_servers; i++) {
                struct afs_uuid__xdr *xdr;
                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 ||
                    (new_only && !(tmp & AFS_VLSF_NEWREPSITE)))
                        continue;
-               if (tmp & AFS_VLSF_RWVOL)
+               if (tmp & AFS_VLSF_RWVOL) {
                        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)
                        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])
                        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++)
                entry->vid[i] = ntohl(uvldb->volumeId[i]);
 
-       tmp = ntohl(uvldb->flags);
-       if (tmp & AFS_VLF_RWEXISTS)
+       if (vlflags & AFS_VLF_RWEXISTS)
                __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);
-       if (tmp & AFS_VLF_BACKEXISTS)
+       if (vlflags & AFS_VLF_BACKEXISTS)
                __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;
                __set_bit(AFS_VLDB_QUERY_ERROR, &entry->flags);
        }