@@ -456,6 +456,7 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap,
* NFS junction information is stored in an extended attribute.
*/
#define NFSD_JUNCTION_XATTR_NAME XATTR_TRUSTED_PREFIX "junction.nfs"
+#define NFSD_EXPORTED_XATTR_NAME NFSD_JUNCTION_XATTR_NAME ".exported"
/**
* nfsd4_is_junction - Test if an object could be an NFS junction
@@ -471,6 +472,8 @@ int nfsd4_is_junction(struct dentry *dentry)
if (inode == NULL)
return 0;
+ if (vfs_getxattr(dentry, NFSD_EXPORTED_XATTR_NAME, NULL, 0) > 0)
+ return 1;
if (inode->i_mode & S_IXUGO)
return 0;
if (!(inode->i_mode & S_ISVTX))
@@ -28,6 +28,7 @@
#include <errno.h>
#include <limits.h>
#include <time.h>
+#include <linux/xattr.h>
#define INT_TO_LONG_THRESHOLD_SECS (INT_MAX - (60 * 60 * 24))
@@ -556,6 +557,9 @@ validate_export(nfs_export *exp)
return;
}
+
+#define NFSD_EXPORTED_XATTR_NAME XATTR_TRUSTED_PREFIX "junction.nfs.exported"
+ setxattr(path, NFSD_EXPORTED_XATTR_NAME, "exported", 8, 0);
}
static _Bool