[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

task->fs





Isn't here a race?

linux-2.4.20-vanilla/fs/namespace.c:chroot_fs_refs():
[called from sys_pivot_root():

#        read_lock(&tasklist_lock);
#        for_each_task(p) {
#                task_lock(p);
#                fs = p->fs;
#                if (fs) {
#                        atomic_inc(&fs->count);
#                        task_unlock(p);
#                        if (fs->root==old_nd->dentry&&fs->rootmnt==old_nd->mnt)
#                                set_fs_root(fs, new_nd->mnt, new_nd->dentry);


While include/linux/fs_struct.h:set_fs_root():
[called from sys_chroot()]

#        write_lock(&fs->lock);
#        old_root = fs->root;
#        old_rootmnt = fs->rootmnt;
#        fs->rootmnt = mntget(mnt);
#        fs->root = dget(dentry);

Shouldn't chroot_fs_refs() read_lock() fs->lock? What if p is in
the middle of a chroot() on another CPU while we trying to pivot_root()?

bit,
adam

--
1024D/37B8D989 954B 998A E5F5 BA2A 3622  82DD 54C2 843D 37B8 D989      
finger://borso@vekoll.vein.hu | Some days, my soul's confined
http://www.keyserver.net | And out of mind
Sleep forever
--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive:       http://mail.nl.linux.org/kernelnewbies/
FAQ:           http://kernelnewbies.org/faq/