4 * Copyright (c) 1999 Al Smith
6 * Portions derived from work (c) 1995,1996 Christian Vogelgsang.
9 #include <linux/buffer_head.h>
10 #include <linux/string.h>
11 #include <linux/exportfs.h>
15 static efs_ino_t
efs_find_entry(struct inode
*inode
, const char *name
, int len
) {
16 struct buffer_head
*bh
;
20 struct efs_dir
*dirblock
;
21 struct efs_dentry
*dirslot
;
25 if (inode
->i_size
& (EFS_DIRBSIZE
-1))
26 pr_warn("%s(): directory size not a multiple of EFS_DIRBSIZE\n",
29 for(block
= 0; block
< inode
->i_blocks
; block
++) {
31 bh
= sb_bread(inode
->i_sb
, efs_bmap(inode
, block
));
33 pr_err("%s(): failed to read dir block %d\n",
38 dirblock
= (struct efs_dir
*) bh
->b_data
;
40 if (be16_to_cpu(dirblock
->magic
) != EFS_DIRBLK_MAGIC
) {
41 pr_err("%s(): invalid directory block\n", __func__
);
46 for(slot
= 0; slot
< dirblock
->slots
; slot
++) {
47 dirslot
= (struct efs_dentry
*) (((char *) bh
->b_data
) + EFS_SLOTAT(dirblock
, slot
));
49 namelen
= dirslot
->namelen
;
50 nameptr
= dirslot
->name
;
52 if ((namelen
== len
) && (!memcmp(name
, nameptr
, len
))) {
53 inodenum
= be32_to_cpu(dirslot
->inode
);
63 struct dentry
*efs_lookup(struct inode
*dir
, struct dentry
*dentry
, unsigned int flags
)
66 struct inode
*inode
= NULL
;
68 inodenum
= efs_find_entry(dir
, dentry
->d_name
.name
, dentry
->d_name
.len
);
70 inode
= efs_iget(dir
->i_sb
, inodenum
);
72 return d_splice_alias(inode
, dentry
);
75 static struct inode
*efs_nfs_get_inode(struct super_block
*sb
, u64 ino
,
81 return ERR_PTR(-ESTALE
);
82 inode
= efs_iget(sb
, ino
);
84 return ERR_CAST(inode
);
86 if (generation
&& inode
->i_generation
!= generation
) {
88 return ERR_PTR(-ESTALE
);
94 struct dentry
*efs_fh_to_dentry(struct super_block
*sb
, struct fid
*fid
,
95 int fh_len
, int fh_type
)
97 return generic_fh_to_dentry(sb
, fid
, fh_len
, fh_type
,
101 struct dentry
*efs_fh_to_parent(struct super_block
*sb
, struct fid
*fid
,
102 int fh_len
, int fh_type
)
104 return generic_fh_to_parent(sb
, fid
, fh_len
, fh_type
,
108 struct dentry
*efs_get_parent(struct dentry
*child
)
110 struct dentry
*parent
= ERR_PTR(-ENOENT
);
113 ino
= efs_find_entry(child
->d_inode
, "..", 2);
115 parent
= d_obtain_alias(efs_iget(child
->d_inode
->i_sb
, ino
));
This page took 0.033829 seconds and 5 git commands to generate.