/*
- * $Id: file.c,v 1.124 2009-11-27 12:37:24 didg Exp $
+ * $Id: file.c,v 1.125 2009-11-27 15:45:40 franklahm Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
/* -------------------------- */
u_int32_t get_id(struct vol *vol, struct adouble *adp, const struct stat *st,
- const cnid_t did, char *upath, const int len)
+ const cnid_t did, char *upath, const int len)
{
-u_int32_t aint = 0;
-
-#if AD_VERSION > AD_VERSION1
-
- if ((aint = ad_getid(adp, st->st_dev, st->st_ino, did, vol->v_stamp))) {
- return aint;
- }
-#endif
+ u_int32_t aint = 0;
if (vol->v_cdb != NULL) {
aint = cnid_add(vol->v_cdb, st, did, upath, len, aint);
return CNID_INVALID;
}
}
-#if AD_VERSION > AD_VERSION1
else if (adp ) {
/* update the ressource fork
* for a folder adp is always null
ad_flush(adp);
}
}
-#endif
}
return aint;
}
/*
- * $Id: dbd_lookup.c,v 1.11 2009-11-25 14:59:15 franklahm Exp $
+ * $Id: dbd_lookup.c,v 1.12 2009-11-27 15:45:41 franklahm Exp $
*
* Copyright (C) Joerg Lenneis 2003
* Copyright (C) Frank Lahm 2009
Possible solution:
strcmp names, if they match keep CNID.
-3) Restore from backup
-----------------------
+3) Restore from backup ie change of inode number -- or emacs
+------------------------------------------------------------
+
15 2 f 1 1 file
-->
15 2 f 1 2 file
+ didname
Possible fixup solution:
-Update.
-
-4) emacs
---------
-emacs uses a backup file (file~). When saving because of inode reusage of the fs,
-both files exchange inodes.
-
-General case for inode reusage:
-15 2 f 1 1 file
--->
-16 2 f 1 1 new_file_with_reused_inode
+test-suite test235 tests and ensures that the CNID is _changed_. The reason for
+this is somewhat lost in time, but nevertheless we believe our test suite.
-Result in dbd_lookup:
-+ devino
-- didname
+Similar things happen with emas: emacs uses a backup file (file~). When saving
+because of inode reusage of the fs, both files most likely exchange inodes.
-Emacs case:
15 2 f 1 1 file
16 2 f 1 2 file~
--> this would be nice:
15 2 f 1 2 file
16 2 f 1 1 file~
---> but because we must follow the general case you get this:
+--> but for the reasons described above we must implement
17 2 f 1 2 file
18 2 f 1 1 file~
devino search and didname search result in different CNIDs !!
Possible fixup solution:
-to be safe we must implement the general case, sorry emacs.
+to be safe we must assign new CNIDs to both files.
*/
#ifdef HAVE_CONFIG_H
/* Check for type (file/dir) mismatch */
if (devino && (type_devino != rqst->type)) {
/* one is a dir one is a file, remove from db */
- rqst->cnid = id_devino;
- if (! roflag)
+ if (! roflag) {
+ rqst->cnid = id_devino;
if (dbd_delete(dbd, rqst, rply, DBIF_CNID) < 0)
return -1;
+ }
rply->result = CNID_DBD_RES_NOTFOUND;
return 1;
} else if (didname && (type_didname != rqst->type)) {
/* same: one is a dir one is a file, remove from db */
- rqst->cnid = id_didname;
- if (! roflag)
+ if (! roflag) {
+ rqst->cnid = id_didname;
if (dbd_delete(dbd, rqst, rply, DBIF_CNID) < 0)
return -1;
+ }
rply->result = CNID_DBD_RES_NOTFOUND;
return 1;
}
}
if (devino && didname && id_devino != id_didname) {
- /* CNIDs don't match, something of a worst case! */
+ /* CNIDs don't match, something of a worst case, or possibly 3) emacs! */
LOG(log_debug, logtype_cnid, "dbd_lookup: CNID mismatch: (DID:%u/'%s') --> %u , (0x%llx/0x%llx) --> %u",
ntohl(rqst->did), rqst->name, ntohl(id_didname),
(unsigned long long)rqst->dev, (unsigned long long)rqst->ino, ntohl(id_devino));
- /* Something like 5), the emacs case (see above), remove it all */
if (! roflag) {
rqst->cnid = id_devino;
if (dbd_delete(dbd, rqst, rply, DBIF_CNID) < 0)
if ( ! didname) {
LOG(log_debug, logtype_cnid, "dbd_lookup(DID:%u/'%s',0x%llx/0x%llx): CNID resolve problem: server side rename oder reused inode",
ntohl(rqst->did), rqst->name, (unsigned long long)rqst->dev, (unsigned long long)rqst->ino);
- rqst->cnid = id_devino;
/* Case 2) ? */
if (strcmp(rqst->name, (char *)devdata.data + CNID_NAME_OFS) == 0) {
LOG(log_debug, logtype_cnid, "dbd_lookup: server side mv from one dir to another");
update = 1;
} else {
- if ( ! roflag)
+ if ( ! roflag) {
+ rqst->cnid = id_devino;
if (dbd_delete(dbd, rqst, rply, DBIF_CNID) < 0)
return -1;
+ }
rply->result = CNID_DBD_RES_NOTFOUND;
return 1;
}
if ( ! devino) {
LOG(log_debug, logtype_cnid, "dbd_lookup(DID:%u/'%s',0x%llx/0x%llx): CNID resolve problem: changed dev/ino",
ntohl(rqst->did), rqst->name, (unsigned long long)rqst->dev, (unsigned long long)rqst->ino);
- rqst->cnid = id_didname;
- update = 1;
+ if ( ! roflag) {
+ rqst->cnid = id_didname;
+ if (dbd_delete(dbd, rqst, rply, DBIF_CNID) < 0)
+ return -1;
+ }
+ rply->result = CNID_DBD_RES_NOTFOUND;
+ return 1;
}
/* This is also a catch all if we've forgot to catch some possibility with the preceding ifs*/