]> git.neil.brown.name Git - LaFS.git/commitdiff
Give subset objects their own operations
authorNeilBrown <neilb@suse.de>
Fri, 13 Aug 2010 09:36:06 +0000 (19:36 +1000)
committerNeilBrown <neilb@suse.de>
Fri, 13 Aug 2010 09:36:06 +0000 (19:36 +1000)
And make sure they 'stat' like the sort of directory
that can be used to create them.

Signed-off-by: NeilBrown <neilb@suse.de>
dir.c
file.c
inode.c
lafs.h
link.c
super.c
test/go

diff --git a/dir.c b/dir.c
index 4977503fbfd871c53b86969d5f90d5cc1227116c..0985428040acb41af4aec51b1606dbc1ea678a67 100644 (file)
--- a/dir.c
+++ b/dir.c
@@ -1597,7 +1597,7 @@ const struct file_operations lafs_dir_file_operations = {
 #endif
 };
 
-struct inode_operations lafs_dir_ino_operations = {
+const struct inode_operations lafs_dir_ino_operations = {
        .lookup         = lafs_lookup,
        .create         = lafs_create,
        .link           = lafs_link,
diff --git a/file.c b/file.c
index fcbf9bdd1ca50c62ec1665810b7fd6b73ccbf93c..d311dcc4c14f86dcc332099cdd4a08a3c32c1be5 100644 (file)
--- a/file.c
+++ b/file.c
@@ -461,11 +461,11 @@ const struct file_operations lafs_file_file_operations = {
        .splice_write   = generic_file_splice_write,
 };
 
-struct inode_operations lafs_file_ino_operations = {
+const struct inode_operations lafs_file_ino_operations = {
        .setattr        = lafs_setattr,
 };
 
-struct address_space_operations lafs_file_aops = {
+const struct address_space_operations lafs_file_aops = {
        .readpage       = lafs_readpage,
        .readpages      = lafs_readpages,
        .writepage      = lafs_writepage,
diff --git a/inode.c b/inode.c
index ffb1b742081ceb792e40e1b2fd123700d1f54d07..f47f99ea5a403ac77c666032c40766db4e52c331 100644 (file)
--- a/inode.c
+++ b/inode.c
@@ -296,6 +296,14 @@ lafs_import_inode(struct inode *ino, struct datablock *b)
                        = i->quota_inodes[2] = NULL;
                memcpy(i->name, l->name, 64);
                i->name[64] = 0;
+
+               /* Make this look like a directory */
+               ino->i_mode = S_IFDIR;
+               ino->i_uid = 0;
+               ino->i_gid = 0;
+               ino->i_size = 0;
+               ino->i_op = &lafs_subset_ino_operations;
+               ino->i_fop = &lafs_subset_file_operations;
                break;
        }
 
@@ -1684,7 +1692,7 @@ void lafs_truncate(struct inode *ino)
        putdref(db, MKREF(trunc));
 }
 
-struct inode_operations lafs_special_ino_operations = {
+const struct inode_operations lafs_special_ino_operations = {
        .setattr        = lafs_setattr,
        .truncate       = lafs_truncate,
 };
diff --git a/lafs.h b/lafs.h
index 48bb2609413bcb35ed35d79f60feef49e6ba05eb..3542a1aaa6df817fe88efccf6061a27ab0d4c76b 100644 (file)
--- a/lafs.h
+++ b/lafs.h
@@ -74,15 +74,16 @@ u32_after(u32 a, u32 b)
        return a-b>0;
 }
 
-extern struct inode_operations lafs_file_ino_operations;
-extern struct inode_operations lafs_dir_ino_operations;
-extern struct inode_operations lafs_link_ino_operations;
-extern struct inode_operations lafs_special_ino_operations;
+const extern struct inode_operations lafs_file_ino_operations;
+const extern struct inode_operations lafs_dir_ino_operations;
+const extern struct inode_operations lafs_subset_ino_operations;
+const extern struct inode_operations lafs_link_ino_operations;
+const extern struct inode_operations lafs_special_ino_operations;
 const extern struct file_operations lafs_file_file_operations;
 const extern struct file_operations lafs_dir_file_operations;
-extern struct address_space_operations lafs_file_aops;
-
-extern struct address_space_operations lafs_index_operations;
+const extern struct file_operations lafs_subset_file_operations;
+const extern struct address_space_operations lafs_file_aops;
+const extern struct address_space_operations lafs_index_operations;
 
 #define SYNC 0
 #define ASYNC 1
diff --git a/link.c b/link.c
index 31fd5654519522dc97c9a757597cdc973e44ac07..677ebb306bbc5a936ccb4a83f40b56a664c06163 100644 (file)
--- a/link.c
+++ b/link.c
@@ -10,7 +10,7 @@
 
 #include       "lafs.h"
 
-struct inode_operations lafs_link_ino_operations = {
+const struct inode_operations lafs_link_ino_operations = {
        .readlink       = generic_readlink,
        .follow_link    = page_follow_link_light,
        .put_link       = page_put_link,
diff --git a/super.c b/super.c
index a15c25d30abf3b5bc28793b6444551cc046f19db..f11820bf011c492ebec8f3dc3155db0a061c173e 100644 (file)
--- a/super.c
+++ b/super.c
@@ -995,6 +995,9 @@ lafs_get_subset(struct file_system_type *fs_type,
                        LAFSI(ino)->type = TypeInodeFile;
                        LAFSI(ino)->metadata_size = (sizeof(struct la_inode) +
                                                     sizeof(struct fs_metadata));
+                       ino->i_op = &lafs_subset_ino_operations;
+                       ino->i_fop = &lafs_subset_file_operations;
+                       /* FIXME we lose md->parent here - what to do?? */
                        md = &LAFSI(ino)->md.fs;
                        md->usagetable = 0;
                        md->update_time = CURRENT_TIME.tv_sec;
@@ -1087,6 +1090,13 @@ static void lafs_kill_subset(struct super_block *sb)
        kfree(k);
 }
 
+const struct file_operations lafs_subset_file_operations = {
+};
+
+const struct inode_operations lafs_subset_ino_operations = {
+};
+
+
 struct file_system_type lafs_fs_type = {
        .owner          = THIS_MODULE,
        .name           = "lafs",
diff --git a/test/go b/test/go
index 56e2d510eb8bb768388ce7df0af9752471e9bb97..3e970928f03ecd1d430405134de3a3bd60ada332 100644 (file)
--- a/test/go
+++ b/test/go
@@ -204,6 +204,7 @@ umount /mnt2
 mount -t lafs_subset /mnt/1/foo /mnt/2
 rm /mnt/2/foo1
 ls -lai /mnt/2
+ls -lai /mnt/1/foo
 umount /mnt/2
 cd /
 (sleep 20 ; echo t > /proc/sysrq-trigger ; sleep 2 ; echo b > /proc/sysrq-trigger; ) &