Hi, I noticed that I also need to hook the cifs_readdir() path.
Can someone tell me how I can construct the file name
relative to the mount point. The TODO in this change.
--- a/fs/cifs/readdir.c
+++ b/fs/cifs/readdir.c
@@ -679,7 +679,7 @@ static int cifs_get_name_from_search_buf(struct qstr
*pqst,
return rc;
}
-static int cifs_filldir(char *pfindEntry, struct file *file, filldir_t
filldir,
+static int cifs_filldir(int xid, char *pfindEntry, struct file *file,
filldir_t filldir,
void *direntry, char *scratch_buf, unsigned int
max_len)
{
int rc = 0;
@@ -731,6 +731,15 @@ static int cifs_filldir(char *pfindEntry, struct
file *file, filldir_t filldir,
cifs_dir_info_to_fattr(&fattr, (FILE_DIRECTORY_INFO *)
pfindEntry, cifs_sb);
+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
+ int tmprc;
+ const char *full_path = qstring.name;
+ /* TODO: build full path relative to the mount point */
+ tmprc = CIFSCheckMFSymlink(&fattr, full_path, cifs_sb, xid);
+ if (tmprc)
+ cFYI(1, "CIFSCheckMFSymlink: %d", tmprc);
+ }
+
if (inum && (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) {
fattr.cf_uniqueid = inum;
} else {
@@ -856,7 +865,7 @@ int cifs_readdir(struct file *file, void *direntry,
filldir_t filldir)
}
/* if buggy server returns . and .. late do
we want to check for that here? */
- rc = cifs_filldir(current_entry, file,
+ rc = cifs_filldir(xid, current_entry, file,
filldir, direntry, tmp_buf,
max_len);
if (rc == -EOVERFLOW) {
rc = 0;
metze
Am 05.08.2010 14:31, schrieb Jeff Layton:
> On Thu, 05 Aug 2010 17:40:36 +0530
> Suresh Jayaraman <[email protected]> wrote:
>
>> On 08/04/2010 08:07 PM, Jeff Layton wrote:
>>> On Wed, 4 Aug 2010 16:11:44 +0200
>>> Stefan Metzmacher <[email protected]> wrote:
>>>
>>>> Signed-off-by: Stefan Metzmacher <[email protected]>
>>>> ---
>>>> fs/cifs/cifsproto.h | 3 +++
>>>> fs/cifs/inode.c | 7 +++++++
>>>> fs/cifs/link.c | 8 ++++++++
>>>> 3 files changed, 18 insertions(+), 0 deletions(-)
>>>>
>>>> diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
>>>> index 2eaebbd..e94e095 100644
>>>> --- a/fs/cifs/cifsproto.h
>>>> +++ b/fs/cifs/cifsproto.h
>>>> @@ -409,4 +409,7 @@ extern int CIFSSMBSetPosixACL(const int xid, struct
>>>> cifsTconInfo *tcon,
>>>> extern int CIFSGetExtAttr(const int xid, struct cifsTconInfo *tcon,
>>>> const int netfid, __u64 *pExtAttrBits, __u64 *pMask);
>>>> extern void cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb);
>>>> +extern int CIFSCheckMFSymlink(struct cifs_fattr *fattr,
>>>> + const unsigned char *path,
>>>> + struct cifs_sb_info *cifs_sb, int xid);
>>>> #endif /* _CIFSPROTO_H */
>>>> diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
>>>> index a15b3a9..c4121de 100644
>>>> --- a/fs/cifs/inode.c
>>>> +++ b/fs/cifs/inode.c
>>>> @@ -661,6 +661,13 @@ int cifs_get_inode_info(struct inode **pinode,
>>>> if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
>>>> cifs_sfu_mode(&fattr, full_path, cifs_sb, xid);
>>>>
>>>> + /* query for SFU type info if supported and needed */
>>>> + if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) {
>>>> + tmprc = CIFSCheckMFSymlink(&fattr, full_path, cifs_sb, xid);
>>>> + if (tmprc)
>>>> + cFYI(1, "CIFSCheckMFSymlink: %d", tmprc);
>>>> + }
>>>> +
>>>
>>> ^^^^^^^^^^^^^^
>>>
>>> This only seems to touch the codepath without posix extensions. What
>>> about when unix extensions are enabled? The previous patch seems to
>>> indicate that the behavior is that mfsymlinks are always used when that
>>> mount option is used even if unix extensions are enabled. If so, then I
>>> think you'll need a similar change in cifs_get_inode_info_unix.
>>>
>>
>> I initially thought so. But, looking again - there is no point in
>> querying for SFU type info if unix extensions are enabled..?
>>
>> Thanks,
>>
>
> I'm not sure that addresses the concern. It's very confusing, but:
>
> SFU != POSIX extensions
>
> The SFU codepath goes through the "normal" cifs code
> (cifs_get_inode_info). The POSIX extensions codepath goes through a
> different codepath (cifs_get_inode_info_unix). Yes, all of this is
> sorely in need of being cleaned up, but that's the way it works today...
>
> Metze's patches seem to indicate that mfsymlinks and unix extensions
> aren't mutually exclusive. The unix codepaths that determine inode
> type and fill out inode data should be using the mfsymlink stuff too.
>
signature.asc
Description: OpenPGP digital signature
