]> git.neil.brown.name Git - lafs-utils.git/commitdiff
lafs: Add creation of special inodes to newfs/add_device
authorNeilBrown <neilb@suse.de>
Mon, 14 Mar 2011 01:21:55 +0000 (12:21 +1100)
committerNeilBrown <neilb@suse.de>
Mon, 14 Mar 2011 01:21:55 +0000 (12:21 +1100)
Also add "lafs_get_inode" to library.

Signed-off-by: NeilBrown <neilb@suse.de>
include/lafs/lafs.h
include/lafs/struct.h
lib/lafs_add_device.c
lib/lafs_add_inode.c
lib/lafs_get_inode.c [new file with mode: 0644]
tools/lafs.c

index dc2696f352a4577966b25d2c94bde95bb0c86628..420834a3c8e50663c066fd06d3f0493c425627d6 100644 (file)
@@ -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);
index 70bfcfc801db423b8015c49f5f4a0d62af9073a7..88c9f5563f48e6edf066567ccd73a582c8bff7a2 100644 (file)
@@ -17,6 +17,7 @@ struct lafs {
 
        int     flags;
 #define LAFS_DELAY_UPDATES     1
+#define        LAFS_NEED_CHECK         2
 
        int checkpointing;
 #define CHECKPOINTING 1
index 3f5e702529eb1c65b2f7de9692fc8195244e8ba4..f8aab6be2e76d368731cfc62b2216b7f819c2e1f 100644 (file)
@@ -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 */
index a494f4f6b56c4a9b2c8e089aa1c7baeabb22ab57..205761339640e315433706b581a2f70ffb825a70 100644 (file)
@@ -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 (file)
index 0000000..819438f
--- /dev/null
@@ -0,0 +1,18 @@
+
+/* Find or load a given inode */
+#include <lafs/lafs.h>
+
+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;
+}
+
index 102732ce8697f564d85ea3981005c00a5c4c0f0c..3c0ee7103b6fdfb3be7fef34b902bf4c6dd8bf06 100644 (file)
@@ -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,