]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
vos: convertROtoRW may create 2nd RW on a fileserver
authorMark Vitale <mvitale@sinenomine.net>
Thu, 2 Aug 2012 22:37:05 +0000 (18:37 -0400)
committerDerrick Brashear <shadow@your-file-system.com>
Sun, 7 Oct 2012 13:00:15 +0000 (06:00 -0700)
If an RW is already present on disk on the target server (any partition),
'vos convertROtoRW' will still convert the RO, creating a second RW on the server.
Detect this and refuse to convert the RO by returning EXDEV (invalid cross-device link).

Change-Id: Ide15a7c39f2a975fd8597e497094b6a67b448e4f
Reviewed-on: http://gerrit.openafs.org/7934
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementix.org>
(cherry picked from commit 0c77c0acabe0a0588ab0a9efab0124ee1e15ef6a)
Reviewed-on: http://gerrit.openafs.org/8213
Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
src/vol/namei_ops.c

index 89d740b3d23a162f4526fe5ac0f747c79e43cda5..254e9a05808c54f22f80cb946d7ae04685971dde 100644 (file)
@@ -2840,6 +2840,8 @@ namei_ConvertROtoRWvolume(char *pname, afs_uint32 volumeId)
     struct DiskPartition64 *partP;
     struct ViceInodeInfo info;
     struct VolumeDiskHeader h;
+    char *rwpart, *rwname;
+    Error ec;
 # ifdef AFS_DEMAND_ATTACH_FS
     int locktype = 0;
 # endif /* AFS_DEMAND_ATTACH_FS */
@@ -2869,6 +2871,19 @@ namei_ConvertROtoRWvolume(char *pname, afs_uint32 volumeId)
        goto done;
     }
 
+    /* check for existing RW on any partition on this server; */
+    /* if found, return EXDEV - invalid cross-device link */
+    VOL_LOCK;
+    VGetVolumePath(&ec, h.parent, &rwpart, &rwname);
+    if (ec == 0) {
+       Log("1 namei_ConvertROtoRWvolume: RW volume %lu already exists on server partition %s.\n",
+           afs_printable_uint32_lu(h.parent), rwpart);
+       code = EXDEV;
+       VOL_UNLOCK;
+       goto done;
+    }
+    VOL_UNLOCK;
+
     FSYNC_VolOp(volumeId, pname, FSYNC_VOL_BREAKCBKS, 0, NULL);
 
     ino = namei_MakeSpecIno(h.parent, VI_LINKTABLE);