@@ -107,48 +107,48 @@ void *
107
107
cifs_follow_link (struct dentry * direntry , struct nameidata * nd )
108
108
{
109
109
struct inode * inode = direntry -> d_inode ;
110
- int rc = - EACCES ;
110
+ int rc = - ENOMEM ;
111
111
int xid ;
112
112
char * full_path = NULL ;
113
- char * target_path = ERR_PTR ( - ENOMEM ) ;
114
- struct cifs_sb_info * cifs_sb ;
115
- struct cifsTconInfo * pTcon ;
113
+ char * target_path = NULL ;
114
+ struct cifs_sb_info * cifs_sb = CIFS_SB ( inode -> i_sb ) ;
115
+ struct cifsTconInfo * tcon = cifs_sb -> tcon ;
116
116
117
117
xid = GetXid ();
118
118
119
- full_path = build_path_from_dentry (direntry );
119
+ /*
120
+ * For now, we just handle symlinks with unix extensions enabled.
121
+ * Eventually we should handle NTFS reparse points, and MacOS
122
+ * symlink support. For instance...
123
+ *
124
+ * rc = CIFSSMBQueryReparseLinkInfo(...)
125
+ *
126
+ * For now, just return -EACCES when the server doesn't support posix
127
+ * extensions. Note that we still allow querying symlinks when posix
128
+ * extensions are manually disabled. We could disable these as well
129
+ * but there doesn't seem to be any harm in allowing the client to
130
+ * read them.
131
+ */
132
+ if (!(tcon -> ses -> capabilities & CAP_UNIX )) {
133
+ rc = - EACCES ;
134
+ goto out ;
135
+ }
120
136
137
+ full_path = build_path_from_dentry (direntry );
121
138
if (!full_path )
122
139
goto out ;
123
140
124
141
cFYI (1 , ("Full path: %s inode = 0x%p" , full_path , inode ));
125
- cifs_sb = CIFS_SB (inode -> i_sb );
126
- pTcon = cifs_sb -> tcon ;
127
-
128
- /* We could change this to:
129
- if (pTcon->unix_ext)
130
- but there does not seem any point in refusing to
131
- get symlink info if we can, even if unix extensions
132
- turned off for this mount */
133
-
134
- if (pTcon -> ses -> capabilities & CAP_UNIX )
135
- rc = CIFSSMBUnixQuerySymLink (xid , pTcon , full_path ,
136
- & target_path ,
137
- cifs_sb -> local_nls );
138
- else {
139
- /* BB add read reparse point symlink code here */
140
- /* rc = CIFSSMBQueryReparseLinkInfo */
141
- /* BB Add code to Query ReparsePoint info */
142
- /* BB Add MAC style xsymlink check here if enabled */
143
- }
144
142
143
+ rc = CIFSSMBUnixQuerySymLink (xid , tcon , full_path , & target_path ,
144
+ cifs_sb -> local_nls );
145
+ kfree (full_path );
146
+ out :
145
147
if (rc != 0 ) {
146
148
kfree (target_path );
147
149
target_path = ERR_PTR (rc );
148
150
}
149
151
150
- kfree (full_path );
151
- out :
152
152
FreeXid (xid );
153
153
nd_set_link (nd , target_path );
154
154
return NULL ;
0 commit comments