socsvn commit: r240245 - in soc2012/gpf/pefs_kmod: sbin/pefs
sys/fs/pefs
gpf at FreeBSD.org
gpf at FreeBSD.org
Fri Aug 10 15:51:37 UTC 2012
Author: gpf
Date: Fri Aug 10 15:51:34 2012
New Revision: 240245
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=240245
Log:
rework how nameids are used by the codebase.
Modified:
soc2012/gpf/pefs_kmod/sbin/pefs/pefs_checksum.c
soc2012/gpf/pefs_kmod/sbin/pefs/pefs_ctl.c
soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_checksum.c
soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_checksum.h
soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_mac.c
Modified: soc2012/gpf/pefs_kmod/sbin/pefs/pefs_checksum.c
==============================================================================
--- soc2012/gpf/pefs_kmod/sbin/pefs/pefs_checksum.c Fri Aug 10 14:51:41 2012 (r240244)
+++ soc2012/gpf/pefs_kmod/sbin/pefs/pefs_checksum.c Fri Aug 10 15:51:34 2012 (r240245)
@@ -127,12 +127,17 @@
TAILQ_ENTRY(checksum) checksum_entries;
};
+union file_id {
+ uint64_t fid_num;
+ uint8_t fid_str[8];
+};
+
/* XXXgpf: [TODO] turns offsets to uint64_t? */
struct file_header {
/* on disk information */
uint32_t nhashes; /* the number of hashes for the file */
uint32_t offset_to_checksums; /* in file offset to start of checksums */
- uint64_t file_id; /* id is MAC tweak from filename (first 64 bits) */
+ union file_id fid; /* id is MAC tweak from filename (first 64 bits) */
/* in memory information */
char path[MAXPATHLEN + 1]; /* fullpath for this file */
@@ -472,7 +477,7 @@
fhp->nhashes = 0;
fhp->offset_to_checksums = 0;
- fhp->file_id = 0;
+ fhp->fid.fid_num = 0;
fhp->fd = -1;
fhp->pfd = -1;
fhp->found = 0;
@@ -545,7 +550,7 @@
{
uint32_t nbucket;
- nbucket = fhp->file_id % chtp->size;
+ nbucket = fhp->fid.fid_num % chtp->size;
dprintf(("hash1: goto bucket %d\n", nbucket));
return (nbucket);
}
@@ -555,8 +560,8 @@
{
uint32_t nbucket;
- nbucket = fnv_64_buf(&(fhp->file_id), sizeof(fhp->file_id), FNV1_64_INIT) %
- chtp->size;
+ nbucket = fnv_64_buf(&(fhp->fid.fid_num), sizeof(fhp->fid.fid_num),
+ FNV1_64_INIT) % chtp->size;
dprintf(("hash2: goto bucket %d\n", nbucket));
return (nbucket);
@@ -572,7 +577,7 @@
pos1 = pefs_hash1(chtp, elem);
elem1 = chtp->buckets1[pos1].fhp;
if (elem1 != NULL) {
- if (elem1->file_id == elem->file_id) {
+ if (elem1->fid.fid_num == elem->fid.fid_num) {
return (elem1);
}
}
@@ -580,7 +585,7 @@
pos2 = pefs_hash2(chtp, elem);
elem2 = chtp->buckets2[pos2].fhp;
if (elem2 != NULL) {
- if (elem2->file_id == elem->file_id) {
+ if (elem2->fid.fid_num == elem->fid.fid_num) {
return (elem2);
}
}
@@ -648,7 +653,8 @@
fhp = chtp->buckets1[i].fhp;
dprintf(("\nbucket %d with element: %d\n", i, fhp == NULL ? 0 : 1));
if (fhp != NULL) {
- dprintf(("\tid = %llu\tnhashes = %d\n", fhp->file_id, fhp->nhashes));
+ dprintf(("\tid = %llu\tnhashes = %d\n", fhp->fid.fid_num,
+ fhp->nhashes));
if (fhp->path[0] == '/')
dprintf(("\tpath = %s\n", fhp->path));
TAILQ_FOREACH(csp, &(fhp->checksums), checksum_entries) {
@@ -665,7 +671,8 @@
fhp = chtp->buckets2[i].fhp;
dprintf(("\nbucket %d with element: %d\n", i, fhp == NULL ? 0 : 1));
if (fhp != NULL) {
- dprintf(("\tid = %llu\tnhashes = %d\n", fhp->file_id, fhp->nhashes));
+ dprintf(("\tid = %llu\tnhashes = %d\n", fhp->fid.fid_num,
+ fhp->nhashes));
if (fhp->path[0] == '/')
dprintf(("\tpath = %s\n", fhp->path));
TAILQ_FOREACH(csp, &(fhp->checksums), checksum_entries) {
@@ -715,8 +722,7 @@
error = PEFS_ERR_GENERIC;
}
else {
- memcpy(&temp, buf, sizeof(temp));
- fhp->file_id = be64toh(temp);
+ memcpy(fhp->fid.fid_str, buf, sizeof(temp));
error = 0;
}
@@ -730,10 +736,8 @@
/* feed parent directory to ioctl() */
error = ioctl(fhp->pfd, PEFS_GETNAMECSUM, &xncs);
- if (error == 0) {
- memcpy(&temp, xncs.pxnc_csum, sizeof(xncs.pxnc_csum));
- fhp->file_id = be64toh(temp);
- }
+ if (error == 0)
+ memcpy(fhp->fid.fid_str, xncs.pxnc_csum, sizeof(xncs.pxnc_csum));
else
pefs_warn("failed to fetch file id from kernel for filename: %s",
fhp->filename);
@@ -1267,7 +1271,6 @@
pefs_write_file_header(int fdout, struct file_header *fhp,
uint32_t *buckets_offset)
{
- uint64_t file_id;
uint32_t nhashes, offset_to_checksums;
int bytes;
@@ -1288,13 +1291,13 @@
}
(*buckets_offset)+= sizeof(offset_to_checksums);
- file_id = htole64(fhp->file_id);
- bytes = pwrite(fdout, &file_id, sizeof(file_id), *buckets_offset);
- if (bytes != sizeof(file_id)) {
+ bytes = pwrite(fdout, fhp->fid.fid_str, sizeof(fhp->fid.fid_str),
+ *buckets_offset);
+ if (bytes != sizeof(fhp->fid.fid_str)) {
warn("error writing to .pefs.checksum");
return (PEFS_ERR_IO);
}
- (*buckets_offset)+= sizeof(file_id);
+ (*buckets_offset)+= sizeof(fhp->fid.fid_str);
return (0);
}
@@ -1309,7 +1312,7 @@
/* Empty files aren't allowed so nhashes == 0 symbolizes an empty bucket */
if (fhp == NULL) {
emptyfh.nhashes = 0;
- emptyfh.file_id = 0;
+ emptyfh.fid.fid_num = 0;
emptyfh.offset_to_checksums = 0;
fhp = &emptyfh;
}
@@ -1335,12 +1338,13 @@
/*
* All data member writes are done separately so as to avoid alignment problems.
- * Writes are always in little endian byte order.
+ * Writes are always in little endian byte order, except file_id which is
+ * always treated as big endian.
*
- * First 512 bytes of .pefs.checksum are reserved for the file's digital
+ * First 512 bytes of .pefs.checksum are reserved for the file's digital
* signature.
- *
- * After that, the next 16 bytes of .pefs.checksum are filled with
+ *
+ * After that, the next 16 bytes of .pefs.checksum are filled with
* .pefs.checksum's global file header. Right after this header lies the
* 'index' part of our database.
* This index is later kept in kernel memory.
@@ -1827,7 +1831,6 @@
pefs_read_file_header(int fdin, struct file_header *fhp,
uint32_t *buckets_offset)
{
- uint64_t file_id;
uint32_t nhashes, offset_to_checksums;
int bytes;
@@ -1848,13 +1851,13 @@
fhp->offset_to_checksums = le32toh(offset_to_checksums);
(*buckets_offset)+= sizeof(offset_to_checksums);
- bytes = pread(fdin, &file_id, sizeof(file_id), *buckets_offset);
- if (bytes != sizeof(file_id)) {
+ bytes = pread(fdin, fhp->fid.fid_str, sizeof(fhp->fid.fid_str),
+ *buckets_offset);
+ if (bytes != sizeof(fhp->fid.fid_str)) {
warn("error reading from .pefs.checksum");
return (PEFS_ERR_IO);
}
- fhp->file_id = le64toh(file_id);
- (*buckets_offset)+= sizeof(file_id);
+ (*buckets_offset)+= sizeof(fhp->fid.fid_str);
//dprintf(("\nfile header offset = %d\n", *fh_offset));
//dprintf(("\n++priting file header info++\n"));
@@ -2005,7 +2008,8 @@
uint32_t i;
int error, cmp;
- dprintf(("comparing hashes for file with fid: %llu\n", fhp->file_id));
+ dprintf(("comparing hashes for file with fid: %llu\n",
+ fhp->fid.fid_num));
error = 0;
if (fhp->nhashes != indexfhp->nhashes) {
@@ -2187,7 +2191,7 @@
if (fhp->found != 1) {
pefs_warn("file with file id %llu was not found in "
"filesystem but exists in %s",
- fhp->file_id, PEFS_FILE_CHECKSUM);
+ fhp->fid.fid_num, PEFS_FILE_CHECKSUM);
error = PEFS_ERR_NOENT;
}
}
@@ -2198,7 +2202,7 @@
if (fhp->found != 1) {
pefs_warn("file with file id %llu was not found in "
"filesystem but exists in %s",
- fhp->file_id, PEFS_FILE_CHECKSUM);
+ fhp->fid.fid_num, PEFS_FILE_CHECKSUM);
error = PEFS_ERR_NOENT;
}
}
@@ -2313,7 +2317,7 @@
if (error != 0)
goto out;
- printf("id: %llu\n", fhp->file_id);
+ printf("id: %llu\n", fhp->fid.fid_num);
out:
pefs_free_file_header(fhp);
Modified: soc2012/gpf/pefs_kmod/sbin/pefs/pefs_ctl.c
==============================================================================
--- soc2012/gpf/pefs_kmod/sbin/pefs/pefs_ctl.c Fri Aug 10 14:51:41 2012 (r240244)
+++ soc2012/gpf/pefs_kmod/sbin/pefs/pefs_ctl.c Fri Aug 10 15:51:34 2012 (r240245)
@@ -1023,7 +1023,7 @@
* path defines where .pefs.checksum should be created. By default,
* .pefs.checksum is created under $PWD. path should be a directory,
* outside of target pefs filesystem.
- *
+ *
* pkey_file is the file that contains the private key that will be used
* by the DSA signing algorithm. Key should be in PEM format.
*
Modified: soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_checksum.c
==============================================================================
--- soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_checksum.c Fri Aug 10 14:51:41 2012 (r240244)
+++ soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_checksum.c Fri Aug 10 15:51:34 2012 (r240245)
@@ -77,7 +77,6 @@
//offset = le32toh(offset);
//p+=sizeof(offset);
//memcpy(&file_id, p, sizeof(file_id));
- //file_id = le64toh(file_id);
//printf("cell %d:\n", i);
//printf("\thashes = %d\n\toffset = %d\n\tfile id = %llu\n",
//nhashes, offset, file_id);
@@ -99,7 +98,6 @@
//offset = le32toh(offset);
//p+=sizeof(offset);
//memcpy(&file_id, p, sizeof(file_id));
- //file_id = le64toh(file_id);
//printf("cell %d:\n", i);
//printf("\thashes = %d\n\toffset = %d\n\tfile id = %llu\n",
//nhashes, offset, file_id);
@@ -147,7 +145,7 @@
{
uint32_t nbucket;
- nbucket = pcie->pcie_file_id % pc->pcs_hash_table_size;
+ nbucket = pcie->pcie_fid.pcfi_num % pc->pcs_hash_table_size;
dprintf(("hash1: goto bucket %d\n", nbucket));
return (nbucket);
}
@@ -158,8 +156,9 @@
{
uint32_t nbucket;
- nbucket = fnv_64_buf(&(pcie->pcie_file_id), sizeof(pcie->pcie_file_id),
- FNV1_64_INIT) % pc->pcs_hash_table_size;
+ nbucket = fnv_64_buf(&(pcie->pcie_fid.pcfi_num),
+ sizeof(pcie->pcie_fid.pcfi_num), FNV1_64_INIT) %
+ pc->pcs_hash_table_size;
dprintf(("hash2: goto bucket %d\n", nbucket));
return (nbucket);
@@ -180,8 +179,7 @@
pcie->pcie_offset = le32toh(pcie->pcie_offset);
p+=sizeof(pcie->pcie_offset);
- memcpy(&(pcie->pcie_file_id), p, sizeof(pcie->pcie_file_id));
- pcie->pcie_file_id = le64toh(pcie->pcie_file_id);
+ memcpy(pcie->pcie_fid.pcfi_str, p, sizeof(pcie->pcie_fid.pcfi_str));
}
}
@@ -204,9 +202,9 @@
dprintf(("cell %d:\n", pos));
dprintf(("\thashes = %d\n\toffset = %d\n\tfile id = %llu\n",
target_pcie.pcie_nhashes, target_pcie.pcie_offset,
- target_pcie.pcie_file_id));
+ target_pcie.pcie_fid.pcfi_num));
- if (target_pcie.pcie_file_id == pcie->pcie_file_id) {
+ if (target_pcie.pcie_fid.pcfi_num == pcie->pcie_fid.pcfi_num) {
pn->pn_checksum_index_entry = start;
dprintf(("checksum lookup: found1!\n"));
return (0);
@@ -221,9 +219,9 @@
dprintf(("cell %d:\n", pos));
dprintf(("\thashes = %d\n\toffset = %d\n\tfile id = %llu\n",
target_pcie.pcie_nhashes, target_pcie.pcie_offset,
- target_pcie.pcie_file_id));
+ target_pcie.pcie_fid.pcfi_num));
- if (target_pcie.pcie_file_id == pcie->pcie_file_id) {
+ if (target_pcie.pcie_fid.pcfi_num == pcie->pcie_fid.pcfi_num) {
pn->pn_checksum_index_entry = start;
dprintf(("checksum lookup: found2!\n"));
return (0);
@@ -273,9 +271,8 @@
dprintf(("name_pton error: %d\n", error));
}
else {
- memcpy(&(pcie.pcie_file_id), buf, sizeof(pcie.pcie_file_id));
- pcie.pcie_file_id = be64toh(pcie.pcie_file_id);
- dprintf(("id to lookup: %llu\n", pcie.pcie_file_id));
+ memcpy(pcie.pcie_fid.pcfi_str, buf, sizeof(pcie.pcie_fid.pcfi_str));
+ dprintf(("id to lookup: %llu\n", pcie.pcie_fid.pcfi_num));
error = pefs_checksum_index_lookup(&pcie, vp);
if (error != 0) {
free(buf, M_TEMP);
@@ -288,12 +285,13 @@
*/
error = VOP_GETATTR(vp, &va, cred);
if (error != 0) {
- dprintf(("unable to retrieve attributes of %llu\n", pcie.pcie_file_id));
+ dprintf(("unable to retrieve attributes of %llu\n",
+ pcie.pcie_fid.pcfi_num));
pn->pn_flags|= PN_WRONG_CHECKSUM;
}
else {
if ((va.va_flags & SF_IMMUTABLE) == 0) {
- dprintf(("schg not set for %llu\n", pcie.pcie_file_id));
+ dprintf(("schg not set for %llu\n", pcie.pcie_fid.pcfi_num));
pn->pn_flags|= PN_WRONG_CHECKSUM;
}
}
@@ -417,7 +415,7 @@
pefs_get_index_entry(pn->pn_checksum_index_entry, &pcie);
- dprintf(("id: %llu\n", pcie.pcie_file_id));
+ dprintf(("id: %llu\n", pcie.pcie_fid.pcfi_num));
buf = (char *)pc->pc_base;
end = buf + pc->pc_size;
Modified: soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_checksum.h
==============================================================================
--- soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_checksum.h Fri Aug 10 14:51:41 2012 (r240244)
+++ soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_checksum.h Fri Aug 10 15:51:34 2012 (r240245)
@@ -49,10 +49,15 @@
#define dprintf(a) (void)0
#endif
+union pefs_checksum_file_id {
+ uint64_t pcfi_num;
+ uint8_t pcfi_str[8];
+};
+
struct pefs_checksum_index_entry {
uint32_t pcie_nhashes;
uint32_t pcie_offset;
- uint64_t pcie_file_id;
+ union pefs_checksum_file_id pcie_fid;
};
static __inline int
Modified: soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_mac.c
==============================================================================
--- soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_mac.c Fri Aug 10 14:51:41 2012 (r240244)
+++ soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_mac.c Fri Aug 10 15:51:34 2012 (r240245)
@@ -166,10 +166,10 @@
* mprotect(2).
*
* I did notice the existance of mac_vnode_check_mprotect(), but unfortunately
- * it's not used anywhere in the kernel for some reason(?)! If it ever comes
+ * it's not used anywhere in the kernel for some reason(?)! If it ever comes
* back into action, I believe it would be preferable to the following solution.
- *
- * My alternative solution was to set the MAXPROT flag of the mapped area
+ *
+ * My alternative solution was to set the MAXPROT flag of the mapped area
* during mmap(). If we are mapping a file and we need schg protection, we
* remove VM_PROT_EXECUTE from MAXPROT which in turn causes following attempts
* to mprotect() with PROT_EXEC to fail.
More information about the svn-soc-all
mailing list