@@ -176,35 +176,37 @@ static int ovl_connect_layer(struct dentry *dentry)
176
176
*
177
177
* Return 0 for upper file handle, > 0 for lower file handle or < 0 on error.
178
178
*/
179
- static int ovl_check_encode_origin (struct dentry * dentry )
179
+ static int ovl_check_encode_origin (struct inode * inode )
180
180
{
181
- struct ovl_fs * ofs = OVL_FS (dentry -> d_sb );
181
+ struct ovl_fs * ofs = OVL_FS (inode -> i_sb );
182
182
bool decodable = ofs -> config .nfs_export ;
183
+ struct dentry * dentry ;
184
+ int err ;
183
185
184
186
/* No upper layer? */
185
187
if (!ovl_upper_mnt (ofs ))
186
188
return 1 ;
187
189
188
190
/* Lower file handle for non-upper non-decodable */
189
- if (!ovl_dentry_upper ( dentry ) && !decodable )
191
+ if (!ovl_inode_upper ( inode ) && !decodable )
190
192
return 1 ;
191
193
192
194
/* Upper file handle for pure upper */
193
- if (!ovl_dentry_lower ( dentry ))
195
+ if (!ovl_inode_lower ( inode ))
194
196
return 0 ;
195
197
196
198
/*
197
199
* Root is never indexed, so if there's an upper layer, encode upper for
198
200
* root.
199
201
*/
200
- if (dentry == dentry -> d_sb -> s_root )
202
+ if (inode == d_inode ( inode -> i_sb -> s_root ) )
201
203
return 0 ;
202
204
203
205
/*
204
206
* Upper decodable file handle for non-indexed upper.
205
207
*/
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 ))
208
210
return 0 ;
209
211
210
212
/*
@@ -213,14 +215,23 @@ static int ovl_check_encode_origin(struct dentry *dentry)
213
215
* ovl_connect_layer() will try to make origin's layer "connected" by
214
216
* copying up a "connectable" ancestor.
215
217
*/
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 ;
218
229
219
230
/* Lower file handle for indexed and non-upper dir/non-dir */
220
231
return 1 ;
221
232
}
222
233
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 ,
224
235
u32 * fid , int buflen )
225
236
{
226
237
struct ovl_fh * fh = NULL ;
@@ -231,13 +242,13 @@ static int ovl_dentry_to_fid(struct ovl_fs *ofs, struct dentry *dentry,
231
242
* Check if we should encode a lower or upper file handle and maybe
232
243
* copy up an ancestor to make lower file handle connectable.
233
244
*/
234
- err = enc_lower = ovl_check_encode_origin (dentry );
245
+ err = enc_lower = ovl_check_encode_origin (inode );
235
246
if (enc_lower < 0 )
236
247
goto fail ;
237
248
238
249
/* 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 );
241
252
if (IS_ERR (fh ))
242
253
return PTR_ERR (fh );
243
254
@@ -251,28 +262,22 @@ static int ovl_dentry_to_fid(struct ovl_fs *ofs, struct dentry *dentry,
251
262
return err ;
252
263
253
264
fail :
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 );
256
267
goto out ;
257
268
}
258
269
259
270
static int ovl_encode_fh (struct inode * inode , u32 * fid , int * max_len ,
260
271
struct inode * parent )
261
272
{
262
273
struct ovl_fs * ofs = OVL_FS (inode -> i_sb );
263
- struct dentry * dentry ;
264
274
int bytes , buflen = * max_len << 2 ;
265
275
266
276
/* TODO: encode connectable file handles */
267
277
if (parent )
268
278
return FILEID_INVALID ;
269
279
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 );
276
281
if (bytes <= 0 )
277
282
return FILEID_INVALID ;
278
283
0 commit comments