Re: [PATCH 3/8] cifs: add CIFSCheckMFSymlink() as stub

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 <sjayaraman@xxxxxxx> wrote:
> 
>> On 08/04/2010 08:07 PM, Jeff Layton wrote:
>>> On Wed,  4 Aug 2010 16:11:44 +0200
>>> Stefan Metzmacher <metze@xxxxxxxxx> wrote:
>>>
>>>> Signed-off-by: Stefan Metzmacher <metze@xxxxxxxxx>
>>>> ---
>>>>  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.
> 

Attachment: signature.asc
Description: OpenPGP digital signature


[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux