From: NeilBrown Date: Fri, 13 Aug 2010 09:36:06 +0000 (+1000) Subject: Give subset objects their own operations X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=47d248f4841792ac018e34c459c9f539c3fe8402;p=LaFS.git Give subset objects their own operations And make sure they 'stat' like the sort of directory that can be used to create them. Signed-off-by: NeilBrown --- diff --git a/dir.c b/dir.c index 4977503..0985428 100644 --- 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 fcbf9bd..d311dcc 100644 --- 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 ffb1b74..f47f99e 100644 --- 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 48bb260..3542a1a 100644 --- 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 31fd565..677ebb3 100644 --- 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 a15c25d..f11820b 100644 --- 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 56e2d51..3e97092 100644 --- 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; ) &