ovl: make i_ino consistent with st_ino in more cases
Relax the condition that overlayfs supports nfs export, to require
that i_ino is consistent with st_ino/d_ino.
It is enough to require that st_ino and d_ino are consistent.
This fixes the failure of xfstest generic/504, due to mismatch of
st_ino to inode number in the output of /proc/locks.
Fixes: 12574a9f4c
("ovl: consistent i_ino for non-samefs with xino")
Cc: <stable@vger.kernel.org> # v4.19
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
This commit is contained in:
parent
253e748339
commit
6dde1e42f4
|
@ -553,15 +553,15 @@ static void ovl_fill_inode(struct inode *inode, umode_t mode, dev_t rdev,
|
||||||
int xinobits = ovl_xino_bits(inode->i_sb);
|
int xinobits = ovl_xino_bits(inode->i_sb);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When NFS export is enabled and d_ino is consistent with st_ino
|
* When d_ino is consistent with st_ino (samefs or i_ino has enough
|
||||||
* (samefs or i_ino has enough bits to encode layer), set the same
|
* bits to encode layer), set the same value used for st_ino to i_ino,
|
||||||
* value used for d_ino to i_ino, because nfsd readdirplus compares
|
* so inode number exposed via /proc/locks and a like will be
|
||||||
* d_ino values to i_ino values of child entries. When called from
|
* consistent with d_ino and st_ino values. An i_ino value inconsistent
|
||||||
|
* with d_ino also causes nfsd readdirplus to fail. When called from
|
||||||
* ovl_new_inode(), ino arg is 0, so i_ino will be updated to real
|
* ovl_new_inode(), ino arg is 0, so i_ino will be updated to real
|
||||||
* upper inode i_ino on ovl_inode_init() or ovl_inode_update().
|
* upper inode i_ino on ovl_inode_init() or ovl_inode_update().
|
||||||
*/
|
*/
|
||||||
if (inode->i_sb->s_export_op &&
|
if (ovl_same_sb(inode->i_sb) || xinobits) {
|
||||||
(ovl_same_sb(inode->i_sb) || xinobits)) {
|
|
||||||
inode->i_ino = ino;
|
inode->i_ino = ino;
|
||||||
if (xinobits && fsid && !(ino >> (64 - xinobits)))
|
if (xinobits && fsid && !(ino >> (64 - xinobits)))
|
||||||
inode->i_ino |= (unsigned long)fsid << (64 - xinobits);
|
inode->i_ino |= (unsigned long)fsid << (64 - xinobits);
|
||||||
|
|
Loading…
Reference in New Issue