/*
* Copyright (c) 2013, Coraid, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Coraid nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL CORAID BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
enum {
// BlkSize = 65536,
BlkSize = 32768,
NPerBlk = BlkSize / sizeof(uvlong),
BlobQuan = 64, /* must be a power of 2 */
TFile = 0,
TObject,
TLun,
Magicθ = 0x4207abcddcba0742LL,
FSClean = 1,
MTnone = 0, /* must be 0 */
MTint = 1,
MTistring = 2,
MTstring = 3,
MTblob = 4,
};
typedef struct Blob Blob;
typedef struct GMeta GMeta;
typedef union MVal MVal;
typedef struct PQMap PQMap;
typedef struct Super Super;
#pragma pack on
struct Blob {
short len;
union {
uvlong next;
char data[1];
};
};
union MVal {
uvlong val;
char str[8];
};
struct GMeta {
uvlong next;
uchar type;
char name[15];
MVal m;
};
struct PQMap {
uvlong qpath;
ushort plen;
char pname[1];
};
#pragma pack off
struct Super {
uvlong magic;
uvlong version;
uvlong qgen;
uvlong nblk;
uvlong nfreemap;
uvlong freemap;
uvlong state;
uvlong firstdat;
uvlong nfree;
uvlong firstlun;
uvlong nmeta;
uvlong firstmeta;
uvlong ffmeta;
uvlong nblob;
uvlong firstblob;
uvlong ffblob;
uvlong lfblob;
uvlong nht;
uvlong nhashblk;
uvlong snaptime;
};
/* aoe.c */
extern void haltaoe(void);
extern void initaoe(void);
extern void rmtarget(int, int);
extern void starttarget(int, int, uvlong);
/* cache.c */
extern int brelease(uvlong);
extern void *cbclean(uvlong);
extern void *cbread(uvlong);
extern void cbwrite(uvlong);
extern int ccanfree(uvlong);
extern int cread(void *, int, uvlong);
extern void csync(void);
extern int cwrite(void *, int, uvlong);
extern void haltcache(void);
extern void initcache(char *, int);
extern char *prcstat(void);
extern void resetcache(void);
/* cons.c */
extern void docons(void *);
extern void initcons(int);
extern int allow;
extern int rootallow;
/* free.c */
extern uvlong allocblock(void);
extern void freeblock(uvlong);
extern void haltfree(void);
extern void initfree(void);
/* fs.c */
extern void halt9p(void);
extern void θstart(Srv *);
extern char *ddir, *dname;
extern uvlong starttime;
extern int doatimes;
extern int shutdown;
/* hash.c */
extern void fixpaths(int);
extern uvlong p2q(int, char *, int);
extern char *prhstat(void);
extern uvlong q2m(int, uvlong, int);
extern void rehashpath(uvlong, char *, char *);
extern void rmp(char *);
extern void rmq(uvlong, uvlong);
extern void setqhash(uvlong, uvlong);
extern void showphash(int, char *);
/* meta.c */
extern void blockuse(int, uvlong);
extern void checkalloc(int);
extern void fixfamilies(int);
extern void freedata(uvlong);
extern void *getblob(int, uvlong, int *);
extern int getmeta(int, uvlong, char *, MVal *);
extern int getmetaint(int, uvlong, char *, uvlong *);
extern char *getmetastr(int, uvlong, char *);
extern uvlong locate(int, uvlong, uvlong, int);
extern void mpred(int, uvlong);
extern void mprint(int, uvlong);
extern void prmeta(int, uvlong);
extern char *prmstat(void);
extern void reammeta(int);
extern void recovermeta(int);
extern void resetmeta(void);
extern uvlong rmmeta(uvlong, uvlong);
extern void rmmlist(uvlong);
extern uvlong setblob(void *, int, uvlong);
extern uvlong setmeta(uvlong, char *, char *, uvlong, int);
extern uvlong setmetaint(uvlong, char *, char *, uvlong);
extern uvlong setmetablob(uvlong, char *, char *, uchar *, int, uvlong);
extern uvlong setmetastr(uvlong, char *, char *, char *, uvlong);
extern void setmstruct(uvlong, uvlong, char *, int, uvlong);
/* nfs.c */
extern void haltnfs(void);
extern void initnfs(void);
extern int debugnfs;
/* super.c */
extern void loadsuper(void);
extern char *prsuper(void);
extern void ream(char *);
extern void savesuper(void);
extern Super super;
/* uid.c */
extern void dumpusers(int);
extern int gname2id(char *, char *);
extern char *id2gname(char *, int);
extern char *id2uname(char *, int);
extern int ingroup(char *, char *);
extern void inituid(void);
extern int isleader(char *, char *);
extern int uname2id(char *, char *);
/* util.c */
extern void *θmalloc(ulong);
extern long θpread(int, uvlong, void *, long, uvlong);
extern long θpwrite(uvlong, void *, long, uvlong, int);
extern void rmdlist(uvlong, uvlong);
extern long spread(int, void *, long, uvlong);
/* platform specific */
extern void conspost(int [], int []);
extern uvlong devsize(char *);
|