static int VHold(Volume * vp);
static int VHold_r(Volume * vp);
static void GetBitmap(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);
+void VGetVolumePath(Error * ec, VolId volumeId, char **partitionp, char **namep);
int LogLevel; /* Vice loglevel--not defined as extern so that it will be
* defined when not linked with vice, XXXX */
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;
#endif /* BITMAP_LATER */
}
-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 VolumeHeaderToDisk(VolumeDiskHeader_t * dh, VolumeHeader_t * h);
extern void VTakeOffline_r(register Volume * vp);
extern void VTakeOffline(register Volume * vp);
-
+extern void VGetVolumePath(Error * ec, VolId volumeId, char **partitionp,
+ char **namep);
/* Naive formula relating number of file size to number of 1K blocks in file */
/* Note: we charge 1 block for 0 length files so the user can't store
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;