From 87b9df1db6935d8ee6ba9a783d7bbe71b664a992 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Mon, 14 Mar 2011 12:21:55 +1100 Subject: [PATCH] lafs: Add creation of special inodes to newfs/add_device Also add "lafs_get_inode" to library. Signed-off-by: NeilBrown --- include/lafs/lafs.h | 1 + include/lafs/struct.h | 1 + lib/lafs_add_device.c | 2 +- lib/lafs_add_inode.c | 2 ++ lib/lafs_get_inode.c | 18 ++++++++++++++ tools/lafs.c | 55 ++++++++++++++++++++++++++++++++++++++++--- 6 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 lib/lafs_get_inode.c diff --git a/include/lafs/lafs.h b/include/lafs/lafs.h index dc2696f..420834a 100644 --- a/include/lafs/lafs.h +++ b/include/lafs/lafs.h @@ -25,6 +25,7 @@ struct lafs_device *lafs_add_device(struct lafs *, char *devname, int fd, struct lafs_ino *lafs_get_itable(struct lafs *); struct lafs_ino *lafs_add_inode(struct lafs_ino*, int inum, int type); +struct lafs_ino *lafs_get_inode(struct lafs_ino *fsys, int inum); int lafs_imap_set(struct lafs_ino *, int inum); int lafs_add_free_seg(struct lafs*, int dev, loff_t seg); diff --git a/include/lafs/struct.h b/include/lafs/struct.h index 70bfcfc..88c9f55 100644 --- a/include/lafs/struct.h +++ b/include/lafs/struct.h @@ -17,6 +17,7 @@ struct lafs { int flags; #define LAFS_DELAY_UPDATES 1 +#define LAFS_NEED_CHECK 2 int checkpointing; #define CHECKPOINTING 1 diff --git a/lib/lafs_add_device.c b/lib/lafs_add_device.c index 3f5e702..f8aab6b 100644 --- a/lib/lafs_add_device.c +++ b/lib/lafs_add_device.c @@ -137,7 +137,7 @@ struct lafs_device *lafs_add_device(struct lafs *fs, char *devname, int fd, /* Need to find a suitable offset */ dev->start = 0; for (d2 = dev->next; d2 ; d2 = d2->next) { - if (dev->start <= d2->start + d2->size && + if (dev->start < d2->start + d2->size && dev->start + dev->size > d2->start) { dev->start = d2->start + d2->size; /* start again from top */ diff --git a/lib/lafs_add_inode.c b/lib/lafs_add_inode.c index a494f4f..2057613 100644 --- a/lib/lafs_add_inode.c +++ b/lib/lafs_add_inode.c @@ -13,6 +13,8 @@ struct lafs_ino *lafs_add_inode(struct lafs_ino *fsys, int inum, int type) struct lafs_ino *ino; db = lafs_dblk(fsys, inum); + if (db->my_inode) + return NULL; lafs_inode_init(fsys->fs, db->b.data, type); diff --git a/lib/lafs_get_inode.c b/lib/lafs_get_inode.c new file mode 100644 index 0000000..819438f --- /dev/null +++ b/lib/lafs_get_inode.c @@ -0,0 +1,18 @@ + +/* Find or load a given inode */ +#include + +struct lafs_ino *lafs_get_inode(struct lafs_ino *fsys, int inum) +{ + struct lafs_dblk *db; + + db = lafs_dblk(fsys, inum); + + if (lafs_load_dblk(db)) + return NULL; + + if (db->my_inode == NULL) + lafs_import_inode(db); + return db->my_inode; +} + diff --git a/tools/lafs.c b/tools/lafs.c index 102732c..3c0ee71 100644 --- a/tools/lafs.c +++ b/tools/lafs.c @@ -767,8 +767,12 @@ static void c_newfs(struct state *st, void **args) char *err = NULL; char uuidstr[37]; uuid_t uu; + struct lafs_ino *ifile, *imfile, *rootdir; + int create_atime = 1; + if (st->lafs->blocksize) { - printf("newfs: Filesytem already has state - consider using \"reset\"\n"); + printf("newfs: Filesytem already has state" + " - consider using \"reset\"\n"); return; } @@ -800,6 +804,23 @@ static void c_newfs(struct state *st, void **args) if (args[4]) memcpy(st->lafs->uuid, uu, 16); + ifile = lafs_get_itable(st->lafs); + imfile = lafs_add_inode(ifile, 1, TypeInodeMap); + rootdir = lafs_add_inode(ifile, 2, TypeDir); + if (create_atime) + lafs_add_inode(ifile, 3, TypeAccessTime); + rootdir->md.file.linkcount = 2; + rootdir->md.file.mode = 0755; + rootdir->md.file.parent = 2; + lafs_dirty_inode(rootdir); + lafs_add_inode(ifile, 8, TypeOrphanList); + + lafs_imap_set(imfile, 1); + lafs_imap_set(imfile, 2); + lafs_imap_set(imfile, 8); + + lafs_cluster_init(st->lafs, 0, 0, 0, 1); + if (st->verbose) { uuid_unparse(st->lafs->uuid, uuidstr); printf("Filesystem has been initilised: block size %d, " @@ -832,18 +853,33 @@ static void c_add_device(struct state *st, void **args) char *devname = args[1]; int fd; struct lafs_device *dev; + struct lafs_ino *ifile, *imfile, *segmap; if (!devname) { printf("add_device: No device or file name given to add\n"); return; } - if (st->lafs->blocksize == 0) { + block_bytes = st->lafs->blocksize; + if (block_bytes == 0) { printf("add_device: filesystem is not ready for devices" " - consider \"newfs\".\n"); return; } - block_bytes = st->lafs->blocksize; + + ifile = st->lafs->ss.root; + if (!ifile) { + printf("add_device: filesystem has no root inode - strange" + " - consider \"newfs\" again.\n"); + return; + } + + imfile = lafs_get_inode(ifile, 1); + if (!imfile) { + printf("add_device: Cannot find inode-map\n"); + return; + } + if (args[3]) { device_bytes = parse_size_print(args[3], &err, "add_device", @@ -902,6 +938,19 @@ static void c_add_device(struct state *st, void **args) stride_bytes / block_bytes, width, usage_inum); + + segmap = lafs_add_inode(ifile, usage_inum, TypeSegmentMap); + if (segmap == NULL) { + printf("ERROR: could not allocate segusage file.\n"); + st->lafs->flags |= LAFS_NEED_CHECK; + return; + } + dev->segsum = segmap; + segmap->md.segmentusage.table_size = dev->tablesize * usage_inum; + dev->tablesize = segmap->md.segmentusage.table_size; + lafs_dirty_inode(segmap); + lafs_imap_set(imfile, usage_inum); + printf("Added device %s at %llu with %llu segments of %llu %dk blocks\n", devname, (unsigned long long)dev->start, (unsigned long long)dev->segment_count, -- 2.39.5