免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2695 | 回复: 1
打印 上一主题 下一主题

能咨询大家一个NFS引发的问题吗 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-01 22:29 |只看该作者 |倒序浏览


问题是这样的,在生产环境下
   1、Suse的Linux有  /nfsmnt/work_pub/web 文件夹和 /nfsmnt/work_inwork/web 文件夹 ,他们都是NFS文件挂载
   2、机器上有多个进程会读写/nfsmnt/work_pub/web 文件夹的内容
   3、cron会周期性的 删除/nfsmnt/work_pub/web 文件夹下所有文件,并把/nfsmnt/work_inwork/web 文件夹下的所有内容拷贝到前面那个文件夹中

这样,完全删除/nfsmnt/work_pub/web 文件夹下所有文件的时候就会有.nfs文件删除不掉(上面的流程因为某些问题不方便改动)。


想咨询的问题是:我现在能不能修改一下fs/nfs/dir.c 中 nfs_sillyrename这个方法,把所有.nfs文件生成到/nfsmnt/temp目录下,然后重新编译内核解决上面的问题?期待大家指点,先谢谢了。




static int nfs_sillyrename(struct inode *dir, struct dentry *dentry)
{
static unsigned int sillycounter;
const int      i_inosize  = sizeof(dir->i_ino)*2;
const int      countersize = sizeof(sillycounter)*2;
const int      slen       = strlen(".nfs") + i_inosize + countersize;
char           silly[slen+1];
struct qstr    qsilly;
struct dentry *sdentry;
int            error = -EIO;
dfprintk(VFS, "NFS: silly-rename(%s/%s, ct=%d)\n",
dentry->d_parent->d_name.name, dentry->d_name.name,
atomic_read(&dentry->d_count));
if (atomic_read(&dentry->d_count) == 1)
goto out;  /* No need to silly rename. */
#ifdef NFS_PARANOIA
if (!dentry->d_inode)
printk("NFS: silly-renaming %s/%s, negative dentry??\n",
dentry->d_parent->d_name.name, dentry->d_name.name);
#endif
/*
* We don't allow a dentry to be silly-renamed twice.
*/
error = -EBUSY;
if (dentry->d_flags & DCACHE_NFSFS_RENAMED)
goto out;
sprintf(silly, ".nfs%*.*lx",
i_inosize, i_inosize, dentry->d_inode->i_ino);
sdentry = NULL;
do {
char *suffix = silly + slen - countersize;
dput(sdentry);
sillycounter++;
sprintf(suffix, "%*.*x", countersize, countersize, sillycounter);
dfprintk(VFS, "trying to rename %s to %s\n",
dentry->d_name.name, silly);
sdentry = lookup_one(silly, dentry->d_parent);
/*
* N.B. Better to return EBUSY here ... it could be
* dangerous to delete the file while it's in use.
*/
if (IS_ERR(sdentry))
goto out;
} while(sdentry->d_inode != NULL); /* need negative lookup */
nfs_zap_caches(dir);
qsilly.name = silly;
qsilly.len  = strlen(silly);
error = NFS_PROTO(dir)->rename(dir, &dentry->d_name, dir, &qsilly);  //可否修改 此处代码来解决问题
if (!error) {
nfs_renew_times(dentry);
d_move(dentry, sdentry);
error = nfs_async_unlink(dentry);
  /* If we return 0 we don't unlink */
}
dput(sdentry);
out:
return error;
}

论坛徽章:
0
2 [报告]
发表于 2012-02-04 17:40 |只看该作者
先不用急着hack内核代码,nfs出现隐藏文件是因为还有进程在访问这些文件,nfs会把这些删掉的文件重命名,对外表现为删除了文件,并且允许其他进程继续访问,这些文件在进程close文件描述符之后才会被删掉,fuse也有类似的功能,不过提供了一个hard_remove的选项,在进程删除文件之后立即删除文件而不是重命名隐藏。
你的cron会删除一些正在使用的文件吗?在cron执行时确保没有文件正被打开使用吧,这个比修改nfs代码更可行一些。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP