simplify get_cramfs_inode()

simply don't hash the inodes that don't have real inumber instead of
skipping them during iget5_locked(); as the result, simple iget_locked()
would do and we can get rid of cramfs ->drop_inode() as well.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2010-06-04 21:19:01 -04:00
parent b69257f250
commit 77b8a75f5b

View file

@ -39,66 +39,55 @@ static DEFINE_MUTEX(read_mutex);
#define CRAMINO(x) (((x)->offset && (x)->size)?(x)->offset<<2:1) #define CRAMINO(x) (((x)->offset && (x)->size)?(x)->offset<<2:1)
#define OFFSET(x) ((x)->i_ino) #define OFFSET(x) ((x)->i_ino)
static void setup_inode(struct inode *inode, struct cramfs_inode * cramfs_inode)
static int cramfs_iget5_test(struct inode *inode, void *opaque)
{ {
struct cramfs_inode *cramfs_inode = opaque; static struct timespec zerotime;
return inode->i_ino == CRAMINO(cramfs_inode) && inode->i_ino != 1; inode->i_mode = cramfs_inode->mode;
} inode->i_uid = cramfs_inode->uid;
inode->i_size = cramfs_inode->size;
static int cramfs_iget5_set(struct inode *inode, void *opaque) inode->i_blocks = (cramfs_inode->size - 1) / 512 + 1;
{ inode->i_gid = cramfs_inode->gid;
struct cramfs_inode *cramfs_inode = opaque; /* Struct copy intentional */
inode->i_ino = CRAMINO(cramfs_inode); inode->i_mtime = inode->i_atime = inode->i_ctime = zerotime;
return 0; /* inode->i_nlink is left 1 - arguably wrong for directories,
but it's the best we can do without reading the directory
contents. 1 yields the right result in GNU find, even
without -noleaf option. */
if (S_ISREG(inode->i_mode)) {
inode->i_fop = &generic_ro_fops;
inode->i_data.a_ops = &cramfs_aops;
} else if (S_ISDIR(inode->i_mode)) {
inode->i_op = &cramfs_dir_inode_operations;
inode->i_fop = &cramfs_directory_operations;
} else if (S_ISLNK(inode->i_mode)) {
inode->i_op = &page_symlink_inode_operations;
inode->i_data.a_ops = &cramfs_aops;
} else {
init_special_inode(inode, inode->i_mode,
old_decode_dev(cramfs_inode->size));
}
} }
static struct inode *get_cramfs_inode(struct super_block *sb, static struct inode *get_cramfs_inode(struct super_block *sb,
struct cramfs_inode * cramfs_inode) struct cramfs_inode * cramfs_inode)
{ {
struct inode *inode = iget5_locked(sb, CRAMINO(cramfs_inode), struct inode *inode;
cramfs_iget5_test, cramfs_iget5_set, if (CRAMINO(cramfs_inode) == 1) {
cramfs_inode); inode = new_inode(sb);
static struct timespec zerotime; if (inode) {
inode->i_ino = 1;
if (inode && (inode->i_state & I_NEW)) { setup_inode(inode, cramfs_inode);
inode->i_mode = cramfs_inode->mode; }
inode->i_uid = cramfs_inode->uid; } else {
inode->i_size = cramfs_inode->size; inode = iget_locked(sb, CRAMINO(cramfs_inode));
inode->i_blocks = (cramfs_inode->size - 1) / 512 + 1; if (inode) {
inode->i_gid = cramfs_inode->gid; setup_inode(inode, cramfs_inode);
/* Struct copy intentional */ unlock_new_inode(inode);
inode->i_mtime = inode->i_atime = inode->i_ctime = zerotime;
/* inode->i_nlink is left 1 - arguably wrong for directories,
but it's the best we can do without reading the directory
contents. 1 yields the right result in GNU find, even
without -noleaf option. */
if (S_ISREG(inode->i_mode)) {
inode->i_fop = &generic_ro_fops;
inode->i_data.a_ops = &cramfs_aops;
} else if (S_ISDIR(inode->i_mode)) {
inode->i_op = &cramfs_dir_inode_operations;
inode->i_fop = &cramfs_directory_operations;
} else if (S_ISLNK(inode->i_mode)) {
inode->i_op = &page_symlink_inode_operations;
inode->i_data.a_ops = &cramfs_aops;
} else {
init_special_inode(inode, inode->i_mode,
old_decode_dev(cramfs_inode->size));
} }
unlock_new_inode(inode);
} }
return inode; return inode;
} }
static void cramfs_drop_inode(struct inode *inode)
{
if (inode->i_ino == 1)
generic_delete_inode(inode);
else
generic_drop_inode(inode);
}
/* /*
* We have our own block cache: don't fill up the buffer cache * We have our own block cache: don't fill up the buffer cache
* with the rom-image, because the way the filesystem is set * with the rom-image, because the way the filesystem is set
@ -542,7 +531,6 @@ static const struct super_operations cramfs_ops = {
.put_super = cramfs_put_super, .put_super = cramfs_put_super,
.remount_fs = cramfs_remount, .remount_fs = cramfs_remount,
.statfs = cramfs_statfs, .statfs = cramfs_statfs,
.drop_inode = cramfs_drop_inode,
}; };
static int cramfs_get_sb(struct file_system_type *fs_type, static int cramfs_get_sb(struct file_system_type *fs_type,