Commit a95aef69 authored by Amir Goldstein's avatar Amir Goldstein Committed by Jan Kara

fanotify: support reporting non-decodeable file handles

fanotify users do not always need to decode the file handles reported
with FAN_REPORT_FID.

Relax the restriction that filesystem needs to support NFS export and
allow reporting file handles from filesystems that only support ecoding
unique file handles.

Even filesystems that do not have export_operations at all can fallback
to use the default FILEID_INO32_GEN encoding, but we use the existence
of export_operations as an indication that the encoded file handles will
be sufficiently unique and that user will be able to compare them to
filesystem objects using AT_HANDLE_FID flag to name_to_handle_at(2).

For filesystems that do not support NFS export, users will have to use
the AT_HANDLE_FID of name_to_handle_at(2) if they want to compare the
object in path to the object fid reported in an event.
Signed-off-by: default avatarAmir Goldstein <amir73il@gmail.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
Message-Id: <20230502124817.3070545-5-amir73il@gmail.com>
parent 96b2b072
...@@ -380,7 +380,7 @@ static int fanotify_encode_fh_len(struct inode *inode) ...@@ -380,7 +380,7 @@ static int fanotify_encode_fh_len(struct inode *inode)
if (!inode) if (!inode)
return 0; return 0;
exportfs_encode_inode_fh(inode, NULL, &dwords, NULL, 0); exportfs_encode_fid(inode, NULL, &dwords);
fh_len = dwords << 2; fh_len = dwords << 2;
/* /*
...@@ -443,7 +443,7 @@ static int fanotify_encode_fh(struct fanotify_fh *fh, struct inode *inode, ...@@ -443,7 +443,7 @@ static int fanotify_encode_fh(struct fanotify_fh *fh, struct inode *inode,
} }
dwords = fh_len >> 2; dwords = fh_len >> 2;
type = exportfs_encode_inode_fh(inode, buf, &dwords, NULL, 0); type = exportfs_encode_fid(inode, buf, &dwords);
err = -EINVAL; err = -EINVAL;
if (!type || type == FILEID_INVALID || fh_len != dwords << 2) if (!type || type == FILEID_INVALID || fh_len != dwords << 2)
goto out_err; goto out_err;
......
...@@ -1591,11 +1591,10 @@ static int fanotify_test_fid(struct dentry *dentry) ...@@ -1591,11 +1591,10 @@ static int fanotify_test_fid(struct dentry *dentry)
* We need to make sure that the file system supports at least * We need to make sure that the file system supports at least
* encoding a file handle so user can use name_to_handle_at() to * encoding a file handle so user can use name_to_handle_at() to
* compare fid returned with event to the file handle of watched * compare fid returned with event to the file handle of watched
* objects. However, name_to_handle_at() requires that the * objects. However, even the relaxed AT_HANDLE_FID flag requires
* filesystem also supports decoding file handles. * at least empty export_operations for ecoding unique file ids.
*/ */
if (!dentry->d_sb->s_export_op || if (!dentry->d_sb->s_export_op)
!dentry->d_sb->s_export_op->fh_to_dentry)
return -EOPNOTSUPP; return -EOPNOTSUPP;
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment