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