nfsd4: helper function for getting mounted_on ino
authorJ. Bruce Fields <bfields@redhat.com>
Mon, 1 Oct 2012 21:50:56 +0000 (17:50 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Thu, 8 Nov 2012 00:31:31 +0000 (19:31 -0500)
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4xdr.c

index fd548d1550882a78abb7cbe3e632bff6021f6030..af65fda7685a0225fc89e2249b50c727ea1210a0 100644 (file)
@@ -2014,6 +2014,22 @@ static __be32 fattr_handle_absent_fs(u32 *bmval0, u32 *bmval1, u32 *rdattr_err)
        return 0;
 }
 
+
+static int get_parent_attributes(struct svc_export *exp, struct kstat *stat)
+{
+       struct path path = exp->ex_path;
+       int err;
+
+       path_get(&path);
+       while (follow_up(&path)) {
+               if (path.dentry != path.mnt->mnt_root)
+                       break;
+       }
+       err = vfs_getattr(path.mnt, path.dentry, stat);
+       path_put(&path);
+       return err;
+}
+
 /*
  * Note: @fhp can be NULL; in this case, we might have to compose the filehandle
  * ourselves.
@@ -2430,18 +2446,8 @@ out_acl:
                 * and this is the root of a cross-mounted filesystem.
                 */
                if (ignore_crossmnt == 0 &&
-                   dentry == exp->ex_path.mnt->mnt_root) {
-                       struct path path = exp->ex_path;
-                       path_get(&path);
-                       while (follow_up(&path)) {
-                               if (path.dentry != path.mnt->mnt_root)
-                                       break;
-                       }
-                       err = vfs_getattr(path.mnt, path.dentry, &stat);
-                       path_put(&path);
-                       if (err)
-                               goto out_nfserr;
-               }
+                   dentry == exp->ex_path.mnt->mnt_root)
+                       get_parent_attributes(exp, &stat);
                WRITE64(stat.ino);
        }
        if (bmval2 & FATTR4_WORD2_SUPPATTR_EXCLCREAT) {