struct super_block * sb = mnt->mnt_sb; 
struct super_block *sb = mnt->mnt_sb; 
static int do_umount(struct vfsmount *mnt, int flags){	struct super_block * sb = mnt->mnt_sb;	int retval;	retval = security_sb_umount(mnt, flags);	if (retval)		return retval;	/*	 * Allow userspace to request a mountpoint be expired rather than	 * unmounting unconditionally. Unmount only happens if:	 *  (1) the mark is already set (the mark is cleared by mntput())	 *  (2) the usage count == 1 [parent vfsmount] + 1 [sys_umount]	 */	if (flags & MNT_EXPIRE) {		if (mnt == current->fs->rootmnt ||		    flags & (MNT_FORCE | MNT_DETACH))			return -EINVAL;		if (atomic_read(&mnt->mnt_count) != 2)			return -EBUSY;		if (!xchg(&mnt->mnt_expiry_mark, 1))			return -EAGAIN;	}	/*	 * If we may have to abort operations to get out of this	 * mount, and they will themselves hold resources we must	 * allow the fs to do things. In the Unix tradition of	 * 'Gee thats tricky lets do it in userspace' the umount_begin	 * might fail to complete on the first run through as other tasks	 * must return, and the like. Thats for the mount program to worry	 * about for the moment.	 */	lock_kernel();	if( (flags&MNT_FORCE) && sb->s_op->umount_begin)		sb->s_op->umount_begin(sb);	unlock_kernel();	/*	 * No sense to grab the lock for this test, but test itself looks	 * somewhat bogus. Suggestions for better replacement?	 * Ho-hum... In principle, we might treat that as umount + switch	 * to rootfs. GC would eventually take care of the old vfsmount.	 * Actually it makes sense, especially if rootfs would contain a	 * /reboot - static binary that would close all descriptors and	 * call reboot(9). Then init(8) could umount root and exec /reboot.	 */	if (mnt == current->fs->rootmnt && !(flags & MNT_DETACH)) {		/*		 * Special case for "unmounting" root ...		 * we just try to remount it readonly.		 */		down_write(&sb->s_umount);		if (!(sb->s_flags & MS_RDONLY)) {			lock_kernel();			DQUOT_OFF(sb);			retval = do_remount_sb(sb, MS_RDONLY, NULL, 0);			unlock_kernel();		}		up_write(&sb->s_umount);		return retval;	}	down_write(&current->namespace->sem);	spin_lock(&vfsmount_lock);	event++;	retval = -EBUSY;	if (atomic_read(&mnt->mnt_count) == 2 || flags & MNT_DETACH) {		if (!list_empty(&mnt->mnt_list))			umount_tree(mnt);		retval = 0;	}	spin_unlock(&vfsmount_lock);	if (retval)		security_sb_umount_busy(mnt);	up_write(&current->namespace->sem);	return retval;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/b58fed8b1959d6b9e4c951a54adc8960e1401b18/namespace.c/clean/fs/namespace.c