w****2 发帖数: 2 | 1 很冒昧的打扰大家。大家能帮我看一下下面的问题吗,不胜感激。
问题是这样的,在生产环境下
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;
} | y***d 发帖数: 2330 | 2 能不能这样
mv /nfsmnt/work_pub/web /nfsmnt/work_pub/web.old.timestamp
mv /nfsmnt/work_inwork/web /nfsmnt/work_pub/web
或者
mv /nfsmnt/work_pub/web/* /nfsmnt/work_pub/web.old.timestamp/
mv /nfsmnt/work_inwork/web/* /nfsmnt/work_pub/web/
nfsmnt/
【在 w****2 的大作中提到】 : 很冒昧的打扰大家。大家能帮我看一下下面的问题吗,不胜感激。 : 问题是这样的,在生产环境下 : 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这个方法
| f******y 发帖数: 2971 | 3 你下面的问题很严重!
nfsmnt/
【在 w****2 的大作中提到】 : 很冒昧的打扰大家。大家能帮我看一下下面的问题吗,不胜感激。 : 问题是这样的,在生产环境下 : 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这个方法
|
|