diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-04-02 14:34:06 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-05-29 23:28:33 -0400 |
commit | b0b0382bb4904965a9e9fca77ad87514dfda0d1c (patch) | |
tree | dc46873fa74e0d194e4a2571b16f0767e1919ae8 /fs/exportfs | |
parent | 6d42e7e9f6d86ed4dfacde75a6cf515068f9749c (diff) |
->encode_fh() API change
pass inode + parent's inode or NULL instead of dentry + bool saying
whether we want the parent or not.
NOTE: that needs ceph fix folded in.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/exportfs')
-rw-r--r-- | fs/exportfs/expfs.c | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c index b05acb796135..b0201ca6e9c6 100644 --- a/fs/exportfs/expfs.c +++ b/fs/exportfs/expfs.c | |||
@@ -304,24 +304,23 @@ out: | |||
304 | 304 | ||
305 | /** | 305 | /** |
306 | * export_encode_fh - default export_operations->encode_fh function | 306 | * export_encode_fh - default export_operations->encode_fh function |
307 | * @dentry: the dentry to encode | 307 | * @inode: the object to encode |
308 | * @fh: where to store the file handle fragment | 308 | * @fh: where to store the file handle fragment |
309 | * @max_len: maximum length to store there | 309 | * @max_len: maximum length to store there |
310 | * @connectable: whether to store parent information | 310 | * @parent: parent directory inode, if wanted |
311 | * | 311 | * |
312 | * This default encode_fh function assumes that the 32 inode number | 312 | * This default encode_fh function assumes that the 32 inode number |
313 | * is suitable for locating an inode, and that the generation number | 313 | * is suitable for locating an inode, and that the generation number |
314 | * can be used to check that it is still valid. It places them in the | 314 | * can be used to check that it is still valid. It places them in the |
315 | * filehandle fragment where export_decode_fh expects to find them. | 315 | * filehandle fragment where export_decode_fh expects to find them. |
316 | */ | 316 | */ |
317 | static int export_encode_fh(struct dentry *dentry, struct fid *fid, | 317 | static int export_encode_fh(struct inode *inode, struct fid *fid, |
318 | int *max_len, int connectable) | 318 | int *max_len, struct inode *parent) |
319 | { | 319 | { |
320 | struct inode * inode = dentry->d_inode; | ||
321 | int len = *max_len; | 320 | int len = *max_len; |
322 | int type = FILEID_INO32_GEN; | 321 | int type = FILEID_INO32_GEN; |
323 | 322 | ||
324 | if (connectable && (len < 4)) { | 323 | if (parent && (len < 4)) { |
325 | *max_len = 4; | 324 | *max_len = 4; |
326 | return 255; | 325 | return 255; |
327 | } else if (len < 2) { | 326 | } else if (len < 2) { |
@@ -332,14 +331,9 @@ static int export_encode_fh(struct dentry *dentry, struct fid *fid, | |||
332 | len = 2; | 331 | len = 2; |
333 | fid->i32.ino = inode->i_ino; | 332 | fid->i32.ino = inode->i_ino; |
334 | fid->i32.gen = inode->i_generation; | 333 | fid->i32.gen = inode->i_generation; |
335 | if (connectable && !S_ISDIR(inode->i_mode)) { | 334 | if (parent) { |
336 | struct inode *parent; | ||
337 | |||
338 | spin_lock(&dentry->d_lock); | ||
339 | parent = dentry->d_parent->d_inode; | ||
340 | fid->i32.parent_ino = parent->i_ino; | 335 | fid->i32.parent_ino = parent->i_ino; |
341 | fid->i32.parent_gen = parent->i_generation; | 336 | fid->i32.parent_gen = parent->i_generation; |
342 | spin_unlock(&dentry->d_lock); | ||
343 | len = 4; | 337 | len = 4; |
344 | type = FILEID_INO32_GEN_PARENT; | 338 | type = FILEID_INO32_GEN_PARENT; |
345 | } | 339 | } |
@@ -352,11 +346,22 @@ int exportfs_encode_fh(struct dentry *dentry, struct fid *fid, int *max_len, | |||
352 | { | 346 | { |
353 | const struct export_operations *nop = dentry->d_sb->s_export_op; | 347 | const struct export_operations *nop = dentry->d_sb->s_export_op; |
354 | int error; | 348 | int error; |
349 | struct dentry *p = NULL; | ||
350 | struct inode *inode = dentry->d_inode, *parent = NULL; | ||
355 | 351 | ||
352 | if (connectable && !S_ISDIR(inode->i_mode)) { | ||
353 | p = dget_parent(dentry); | ||
354 | /* | ||
355 | * note that while p might've ceased to be our parent already, | ||
356 | * it's still pinned by and still positive. | ||
357 | */ | ||
358 | parent = p->d_inode; | ||
359 | } | ||
356 | if (nop->encode_fh) | 360 | if (nop->encode_fh) |
357 | error = nop->encode_fh(dentry, fid->raw, max_len, connectable); | 361 | error = nop->encode_fh(inode, fid->raw, max_len, parent); |
358 | else | 362 | else |
359 | error = export_encode_fh(dentry, fid, max_len, connectable); | 363 | error = export_encode_fh(inode, fid, max_len, parent); |
364 | dput(p); | ||
360 | 365 | ||
361 | return error; | 366 | return error; |
362 | } | 367 | } |