static int VHold(Volume * vp);
static int VHold_r(Volume * vp);
static void VGetBitmap_r(Error * ec, Volume * vp, VnodeClass class);
-static void GetVolumePath(Error * ec, VolId volumeId, char **partitionp,
- char **namep);
static void VReleaseVolumeHandles_r(Volume * vp);
static void VCloseVolumeHandles_r(Volume * vp);
static void LoadVolumeHeader(Error * ec, Volume * vp);
VAttachVolume_r(Error * ec, VolumeId volumeId, int mode)
{
char *part, *name;
- GetVolumePath(ec, volumeId, &part, &name);
+ VGetVolumePath(ec, volumeId, &part, &name);
if (*ec) {
register Volume *vp;
Error error;
* on a vice partition, it is possible for callers to get the wrong one,
* depending on the order of the disk partition linked list.
*
- * @internal volume package internal use only.
*/
-static void
-GetVolumePath(Error * ec, VolId volumeId, char **partitionp, char **namep)
+void
+VGetVolumePath(Error * ec, VolId volumeId, char **partitionp, char **namep)
{
static char partition[VMAXPATHLEN], name[VMAXPATHLEN];
char path[VMAXPATHLEN];
extern void VTakeOffline_r(register Volume * vp);
extern void VTakeOffline(register Volume * vp);
extern Volume * VLookupVolume_r(Error * ec, VolId volumeId, Volume * hint);
-
+extern void VGetVolumePath(Error * ec, VolId volumeId, char **partitionp,
+ char **namep);
#ifdef AFS_DEMAND_ATTACH_FS
extern Volume *VPreAttachVolumeByName(Error * ec, char *partition, char *name);
extern Volume *VPreAttachVolumeByName_r(Error * ec, char *partition, char *name);
IHandle_t *handle;
FdHandle_t *fdP;
Inode nearInode = 0;
+ char *part, *name;
*ec = 0;
memset(&vol, 0, sizeof(vol));
nearInodeHash(volumeId, nearInode);
nearInode %= partition->f_files;
#endif
+ VGetVolumePath(ec, vol.id, &part, &name);
+ if (*ec == VNOVOL || !strcmp(partition->name, part)) {
+ /* this case is ok */
+ } else {
+ /* return EXDEV if it's a clone to an alternate partition
+ * otherwise assume it's a move */
+ if (vol.parentId != vol.id) {
+ *ec = EXDEV;
+ return NULL;
+ }
+ }
VLockPartition_r(partname);
memset(&tempHeader, 0, sizeof(tempHeader));
tempHeader.stamp.magic = VOLUMEHEADERMAGIC;