@@ -176,35 +176,37 @@ static int ovl_connect_layer(struct dentry *dentry)
176176 *
177177 * Return 0 for upper file handle, > 0 for lower file handle or < 0 on error.
178178 */
179- static int ovl_check_encode_origin (struct dentry * dentry )
179+ static int ovl_check_encode_origin (struct inode * inode )
180180{
181- struct ovl_fs * ofs = OVL_FS (dentry -> d_sb );
181+ struct ovl_fs * ofs = OVL_FS (inode -> i_sb );
182182 bool decodable = ofs -> config .nfs_export ;
183+ struct dentry * dentry ;
184+ int err ;
183185
184186 /* No upper layer? */
185187 if (!ovl_upper_mnt (ofs ))
186188 return 1 ;
187189
188190 /* Lower file handle for non-upper non-decodable */
189- if (!ovl_dentry_upper ( dentry ) && !decodable )
191+ if (!ovl_inode_upper ( inode ) && !decodable )
190192 return 1 ;
191193
192194 /* Upper file handle for pure upper */
193- if (!ovl_dentry_lower ( dentry ))
195+ if (!ovl_inode_lower ( inode ))
194196 return 0 ;
195197
196198 /*
197199 * Root is never indexed, so if there's an upper layer, encode upper for
198200 * root.
199201 */
200- if (dentry == dentry -> d_sb -> s_root )
202+ if (inode == d_inode ( inode -> i_sb -> s_root ) )
201203 return 0 ;
202204
203205 /*
204206 * Upper decodable file handle for non-indexed upper.
205207 */
206- if (ovl_dentry_upper ( dentry ) && decodable &&
207- !ovl_test_flag (OVL_INDEX , d_inode ( dentry ) ))
208+ if (ovl_inode_upper ( inode ) && decodable &&
209+ !ovl_test_flag (OVL_INDEX , inode ))
208210 return 0 ;
209211
210212 /*
@@ -213,14 +215,23 @@ static int ovl_check_encode_origin(struct dentry *dentry)
213215 * ovl_connect_layer() will try to make origin's layer "connected" by
214216 * copying up a "connectable" ancestor.
215217 */
216- if (d_is_dir (dentry ) && decodable )
217- return ovl_connect_layer (dentry );
218+ if (!decodable || !S_ISDIR (inode -> i_mode ))
219+ return 1 ;
220+
221+ dentry = d_find_any_alias (inode );
222+ if (!dentry )
223+ return - ENOENT ;
224+
225+ err = ovl_connect_layer (dentry );
226+ dput (dentry );
227+ if (err < 0 )
228+ return err ;
218229
219230 /* Lower file handle for indexed and non-upper dir/non-dir */
220231 return 1 ;
221232}
222233
223- static int ovl_dentry_to_fid (struct ovl_fs * ofs , struct dentry * dentry ,
234+ static int ovl_dentry_to_fid (struct ovl_fs * ofs , struct inode * inode ,
224235 u32 * fid , int buflen )
225236{
226237 struct ovl_fh * fh = NULL ;
@@ -231,13 +242,13 @@ static int ovl_dentry_to_fid(struct ovl_fs *ofs, struct dentry *dentry,
231242 * Check if we should encode a lower or upper file handle and maybe
232243 * copy up an ancestor to make lower file handle connectable.
233244 */
234- err = enc_lower = ovl_check_encode_origin (dentry );
245+ err = enc_lower = ovl_check_encode_origin (inode );
235246 if (enc_lower < 0 )
236247 goto fail ;
237248
238249 /* Encode an upper or lower file handle */
239- fh = ovl_encode_real_fh (ofs , enc_lower ? ovl_dentry_lower ( dentry ) :
240- ovl_dentry_upper ( dentry ), !enc_lower );
250+ fh = ovl_encode_real_fh (ofs , enc_lower ? ovl_inode_lower ( inode ) :
251+ ovl_inode_upper ( inode ), !enc_lower );
241252 if (IS_ERR (fh ))
242253 return PTR_ERR (fh );
243254
@@ -251,28 +262,22 @@ static int ovl_dentry_to_fid(struct ovl_fs *ofs, struct dentry *dentry,
251262 return err ;
252263
253264fail :
254- pr_warn_ratelimited ("failed to encode file handle (%pd2 , err=%i)\n" ,
255- dentry , err );
265+ pr_warn_ratelimited ("failed to encode file handle (ino=%lu , err=%i)\n" ,
266+ inode -> i_ino , err );
256267 goto out ;
257268}
258269
259270static int ovl_encode_fh (struct inode * inode , u32 * fid , int * max_len ,
260271 struct inode * parent )
261272{
262273 struct ovl_fs * ofs = OVL_FS (inode -> i_sb );
263- struct dentry * dentry ;
264274 int bytes , buflen = * max_len << 2 ;
265275
266276 /* TODO: encode connectable file handles */
267277 if (parent )
268278 return FILEID_INVALID ;
269279
270- dentry = d_find_any_alias (inode );
271- if (!dentry )
272- return FILEID_INVALID ;
273-
274- bytes = ovl_dentry_to_fid (ofs , dentry , fid , buflen );
275- dput (dentry );
280+ bytes = ovl_dentry_to_fid (ofs , inode , fid , buflen );
276281 if (bytes <= 0 )
277282 return FILEID_INVALID ;
278283
0 commit comments