On Thu 12-08-21 18:17:10, Amir Goldstein wrote: > On Thu, Aug 12, 2021 at 5:20 PM Jan Kara <jack@xxxxxxx> wrote: > > > > On Wed 11-08-21 17:12:05, Gabriel Krisman Bertazi wrote: > > > Jan Kara <jack@xxxxxxx> writes: > > > >> @@ -376,14 +371,24 @@ static int fanotify_encode_fh(struct fanotify_fh *fh, struct inode *inode, > > > >> fh->flags |= FANOTIFY_FH_FLAG_EXT_BUF; > > > >> } > > > >> > > > >> - dwords = fh_len >> 2; > > > >> - type = exportfs_encode_inode_fh(inode, buf, &dwords, NULL); > > > >> - err = -EINVAL; > > > >> - if (!type || type == FILEID_INVALID || fh_len != dwords << 2) > > > >> - goto out_err; > > > >> - > > > >> - fh->type = type; > > > >> - fh->len = fh_len; > > > >> + if (inode) { > > > >> + dwords = fh_len >> 2; > > > >> + type = exportfs_encode_inode_fh(inode, buf, &dwords, NULL); > > > >> + err = -EINVAL; > > > >> + if (!type || type == FILEID_INVALID || fh_len != dwords << 2) > > > >> + goto out_err; > > > >> + fh->type = type; > > > >> + fh->len = fh_len; > > > >> + } else { > > > >> + /* > > > >> + * Invalid FHs are used on FAN_FS_ERROR for errors not > > > >> + * linked to any inode. Caller needs to guarantee the fh > > > >> + * has at least FANOTIFY_NULL_FH_LEN bytes of space. > > > >> + */ > > > >> + fh->type = FILEID_INVALID; > > > >> + fh->len = FANOTIFY_NULL_FH_LEN; > > > >> + memset(buf, 0, FANOTIFY_NULL_FH_LEN); > > > >> + } > > > > > > > > Maybe it will become clearer later during the series but why do you set > > > > fh->len to FANOTIFY_NULL_FH_LEN and not 0? > > > > > > Jan, > > > > > > That is how we encode a NULL file handle (i.e. superblock error). Amir > > > suggested it would be an invalid FILEID_INVALID, with a zeroed handle of > > > size 8. I will improve the comment on the next iteration. > > > > Thanks for info. Then I have a question for Amir I guess :) Amir, what's > > the advantage of zeroed handle of size 8 instead of just 0 length file > > handle? > > With current code, zero fh->len means we are not reporting an FID info > record (e.g. due to encode error), see copy_info_records_to_user(). > > This is because fh->len plays a dual role for indicating the length of the > file handle and the existence of FID info. I see, thanks for info. > I figured that keeping a positive length for the special NULL_FH is an > easy way to workaround this ambiguity and keep the code simpler. > We don't really need to pay any cost for keeping the 8 bytes zero buffer. There are two separate questions: 1) How do we internally propagate the information that we don't have file_handle to report but we do want fsid reported. 2) What do we report to userspace in file_handle. For 2) I think we should report fsid + FILEID_INVALID, 0-length filehandle. Currently the non-zero lenght FILEID_INVALID filehandle was propagating to userspace and IMO that's confusing. For 1), whatever is the simplest to propagate the information "we want only fsid reported" internally is fine by me. Honza -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR