If the file being sillyrenamed is being completely deleted, or
we are using NFSv4.0, then we need to return the delegation before
sending off the sillydelete.
Signed-off-by: Trond Myklebust <[email protected]>
---
fs/nfs/dir.c | 23 ++++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index b315f53b3aec..ed20ff51f865 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -1399,11 +1399,32 @@ EXPORT_SYMBOL_GPL(nfs_lookup);
#if IS_ENABLED(CONFIG_NFS_V4)
static int nfs4_lookup_revalidate(struct dentry *, unsigned int);
+/*
+ * Called when the dentry loses inode.
+ * We use it to clean up silly-renamed files.
+ */
+static void nfs4_dentry_iput(struct dentry *dentry, struct inode *inode)
+{
+ if (S_ISDIR(inode->i_mode))
+ /* drop any readdir cache as it could easily be old */
+ NFS_I(inode)->cache_validity |= NFS_INO_INVALID_DATA;
+
+ if (dentry->d_flags & DCACHE_NFSFS_RENAMED) {
+ if (inode->i_nlink == 1)
+ nfs4_inode_return_delegation(inode);
+ else
+ nfs4_inode_make_writeable(inode);
+ nfs_complete_unlink(dentry, inode);
+ nfs_drop_nlink(inode);
+ }
+ iput(inode);
+}
+
const struct dentry_operations nfs4_dentry_operations = {
.d_revalidate = nfs4_lookup_revalidate,
.d_weak_revalidate = nfs_weak_revalidate,
.d_delete = nfs_dentry_delete,
- .d_iput = nfs_dentry_iput,
+ .d_iput = nfs4_dentry_iput,
.d_automount = nfs_d_automount,
.d_release = nfs_d_release,
};
--
2.17.0
Hi Trond,
On 05/29/2018 11:48 AM, Trond Myklebust wrote:
> If the file being sillyrenamed is being completely deleted, or
> we are using NFSv4.0, then we need to return the delegation before
> sending off the sillydelete.
>
> Signed-off-by: Trond Myklebust <[email protected]>
> ---
> fs/nfs/dir.c | 23 ++++++++++++++++++++++-
> 1 file changed, 22 insertions(+), 1 deletion(-)
>
> diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
> index b315f53b3aec..ed20ff51f865 100644
> --- a/fs/nfs/dir.c
> +++ b/fs/nfs/dir.c
> @@ -1399,11 +1399,32 @@ EXPORT_SYMBOL_GPL(nfs_lookup);
> #if IS_ENABLED(CONFIG_NFS_V4)
> static int nfs4_lookup_revalidate(struct dentry *, unsigned int);
>
> +/*
> + * Called when the dentry loses inode.
> + * We use it to clean up silly-renamed files.
> + */
> +static void nfs4_dentry_iput(struct dentry *dentry, struct inode *inode)
> +{
> + if (S_ISDIR(inode->i_mode))
> + /* drop any readdir cache as it could easily be old */
> + NFS_I(inode)->cache_validity |= NFS_INO_INVALID_DATA;
> +
> + if (dentry->d_flags & DCACHE_NFSFS_RENAMED) {
> + if (inode->i_nlink == 1)
> + nfs4_inode_return_delegation(inode);
> + else
> + nfs4_inode_make_writeable(inode);
I think these functions need to be exported in delegation.c to avoid undefined symbol warnings from the compiler.
Thanks,
Anna
> + nfs_complete_unlink(dentry, inode);
> + nfs_drop_nlink(inode);
> + }
> + iput(inode);
> +}
> +
> const struct dentry_operations nfs4_dentry_operations = {
> .d_revalidate = nfs4_lookup_revalidate,
> .d_weak_revalidate = nfs_weak_revalidate,
> .d_delete = nfs_dentry_delete,
> - .d_iput = nfs_dentry_iput,
> + .d_iput = nfs4_dentry_iput,
> .d_automount = nfs_d_automount,
> .d_release = nfs_d_release,
> };
>
T24gVHVlLCAyMDE4LTA1LTI5IGF0IDE0OjMzIC0wNDAwLCBBbm5hIFNjaHVtYWtlciB3cm90ZToN
Cj4gSGkgVHJvbmQsDQo+IA0KPiBPbiAwNS8yOS8yMDE4IDExOjQ4IEFNLCBUcm9uZCBNeWtsZWJ1
c3Qgd3JvdGU6DQo+ID4gSWYgdGhlIGZpbGUgYmVpbmcgc2lsbHlyZW5hbWVkIGlzIGJlaW5nIGNv
bXBsZXRlbHkgZGVsZXRlZCwgb3INCj4gPiB3ZSBhcmUgdXNpbmcgTkZTdjQuMCwgdGhlbiB3ZSBu
ZWVkIHRvIHJldHVybiB0aGUgZGVsZWdhdGlvbiBiZWZvcmUNCj4gPiBzZW5kaW5nIG9mZiB0aGUg
c2lsbHlkZWxldGUuDQo+ID4gDQo+ID4gU2lnbmVkLW9mZi1ieTogVHJvbmQgTXlrbGVidXN0IDx0
cm9uZC5teWtsZWJ1c3RAaGFtbWVyc3BhY2UuY29tPg0KPiA+IC0tLQ0KPiA+ICBmcy9uZnMvZGly
LmMgfCAyMyArKysrKysrKysrKysrKysrKysrKysrLQ0KPiA+ICAxIGZpbGUgY2hhbmdlZCwgMjIg
aW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQ0KPiA+IA0KPiA+IGRpZmYgLS1naXQgYS9mcy9u
ZnMvZGlyLmMgYi9mcy9uZnMvZGlyLmMNCj4gPiBpbmRleCBiMzE1ZjUzYjNhZWMuLmVkMjBmZjUx
Zjg2NSAxMDA2NDQNCj4gPiAtLS0gYS9mcy9uZnMvZGlyLmMNCj4gPiArKysgYi9mcy9uZnMvZGly
LmMNCj4gPiBAQCAtMTM5OSwxMSArMTM5OSwzMiBAQCBFWFBPUlRfU1lNQk9MX0dQTChuZnNfbG9v
a3VwKTsNCj4gPiAgI2lmIElTX0VOQUJMRUQoQ09ORklHX05GU19WNCkNCj4gPiAgc3RhdGljIGlu
dCBuZnM0X2xvb2t1cF9yZXZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKiwgdW5zaWduZWQgaW50KTsN
Cj4gPiAgDQo+ID4gKy8qDQo+ID4gKyAqIENhbGxlZCB3aGVuIHRoZSBkZW50cnkgbG9zZXMgaW5v
ZGUuDQo+ID4gKyAqIFdlIHVzZSBpdCB0byBjbGVhbiB1cCBzaWxseS1yZW5hbWVkIGZpbGVzLg0K
PiA+ICsgKi8NCj4gPiArc3RhdGljIHZvaWQgbmZzNF9kZW50cnlfaXB1dChzdHJ1Y3QgZGVudHJ5
ICpkZW50cnksIHN0cnVjdCBpbm9kZQ0KPiA+ICppbm9kZSkNCj4gPiArew0KPiA+ICsJaWYgKFNf
SVNESVIoaW5vZGUtPmlfbW9kZSkpDQo+ID4gKwkJLyogZHJvcCBhbnkgcmVhZGRpciBjYWNoZSBh
cyBpdCBjb3VsZCBlYXNpbHkgYmUNCj4gPiBvbGQgKi8NCj4gPiArCQlORlNfSShpbm9kZSktPmNh
Y2hlX3ZhbGlkaXR5IHw9DQo+ID4gTkZTX0lOT19JTlZBTElEX0RBVEE7DQo+ID4gKw0KPiA+ICsJ
aWYgKGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9ORlNGU19SRU5BTUVEKSB7DQo+ID4gKwkJaWYg
KGlub2RlLT5pX25saW5rID09IDEpDQo+ID4gKwkJCW5mczRfaW5vZGVfcmV0dXJuX2RlbGVnYXRp
b24oaW5vZGUpOw0KPiA+ICsJCWVsc2UNCj4gPiArCQkJbmZzNF9pbm9kZV9tYWtlX3dyaXRlYWJs
ZShpbm9kZSk7DQo+IA0KPiBJIHRoaW5rIHRoZXNlIGZ1bmN0aW9ucyBuZWVkIHRvIGJlIGV4cG9y
dGVkIGluIGRlbGVnYXRpb24uYyB0byBhdm9pZA0KPiB1bmRlZmluZWQgc3ltYm9sIHdhcm5pbmdz
IGZyb20gdGhlIGNvbXBpbGVyLg0KPiANCg0KV2hvb3BzLiBZZXMsIHRoYW5rcyBmb3Igbm90aWNp
bmchDQoNCi0tIA0KVHJvbmQgTXlrbGVidXN0DQpMaW51eCBORlMgY2xpZW50IG1haW50YWluZXIs
IEhhbW1lcnNwYWNlDQp0cm9uZC5teWtsZWJ1c3RAaGFtbWVyc3BhY2UuY29tDQoNCg==
Hi Trond,
I love your patch! Yet something to improve:
[auto build test ERROR on nfs/linux-next]
[also build test ERROR on v4.17-rc7 next-20180531]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Trond-Myklebust/NFSv4-Fix-sillyrename-to-return-the-delegation-when-appropriate/20180531-232019
base: git://git.linux-nfs.org/projects/trondmy/linux-nfs.git linux-next
config: arm-arm5 (attached as .config)
compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=arm
All errors (new ones prefixed by >>):
fs/nfs/dir.o: In function `nfs4_dentry_iput':
>> dir.c:(.text+0xe04): undefined reference to `nfs4_inode_make_writeable'
>> dir.c:(.text+0xe28): undefined reference to `nfs4_inode_return_delegation'
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
Hi Trond,
I love your patch! Yet something to improve:
[auto build test ERROR on nfs/linux-next]
[also build test ERROR on v4.17-rc7 next-20180531]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Trond-Myklebust/NFSv4-Fix-sillyrename-to-return-the-delegation-when-appropriate/20180531-232019
base: git://git.linux-nfs.org/projects/trondmy/linux-nfs.git linux-next
config: mips-fuloong2e_defconfig (attached as .config)
compiler: mips64el-linux-gnuabi64-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=mips
All errors (new ones prefixed by >>):
>> ERROR: "nfs4_inode_make_writeable" [fs/nfs/nfs.ko] undefined!
>> ERROR: "nfs4_inode_return_delegation" [fs/nfs/nfs.ko] undefined!
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation