namei.c (44e8ba93cf330f075178e31759100f367313790a) namei.c (8de52778798fe39660a8d6b26f290e0c93202761)
1/*
2 * linux/fs/namei.c
3 *
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 */
6
7/*
8 * Some corrections by tytso.

--- 2555 unchanged lines hidden (view full) ---

2564SYSCALL_DEFINE3(mknod, const char __user *, filename, umode_t, mode, unsigned, dev)
2565{
2566 return sys_mknodat(AT_FDCWD, filename, mode, dev);
2567}
2568
2569int vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
2570{
2571 int error = may_create(dir, dentry);
1/*
2 * linux/fs/namei.c
3 *
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 */
6
7/*
8 * Some corrections by tytso.

--- 2555 unchanged lines hidden (view full) ---

2564SYSCALL_DEFINE3(mknod, const char __user *, filename, umode_t, mode, unsigned, dev)
2565{
2566 return sys_mknodat(AT_FDCWD, filename, mode, dev);
2567}
2568
2569int vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
2570{
2571 int error = may_create(dir, dentry);
2572 unsigned max_links = dir->i_sb->s_max_links;
2572
2573 if (error)
2574 return error;
2575
2576 if (!dir->i_op->mkdir)
2577 return -EPERM;
2578
2579 mode &= (S_IRWXUGO|S_ISVTX);
2580 error = security_inode_mkdir(dir, dentry, mode);
2581 if (error)
2582 return error;
2583
2573
2574 if (error)
2575 return error;
2576
2577 if (!dir->i_op->mkdir)
2578 return -EPERM;
2579
2580 mode &= (S_IRWXUGO|S_ISVTX);
2581 error = security_inode_mkdir(dir, dentry, mode);
2582 if (error)
2583 return error;
2584
2585 if (max_links && dir->i_nlink >= max_links)
2586 return -EMLINK;
2587
2584 error = dir->i_op->mkdir(dir, dentry, mode);
2585 if (!error)
2586 fsnotify_mkdir(dir, dentry);
2587 return error;
2588}
2589
2590SYSCALL_DEFINE3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode)
2591{

--- 314 unchanged lines hidden (view full) ---

2906SYSCALL_DEFINE2(symlink, const char __user *, oldname, const char __user *, newname)
2907{
2908 return sys_symlinkat(oldname, AT_FDCWD, newname);
2909}
2910
2911int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)
2912{
2913 struct inode *inode = old_dentry->d_inode;
2588 error = dir->i_op->mkdir(dir, dentry, mode);
2589 if (!error)
2590 fsnotify_mkdir(dir, dentry);
2591 return error;
2592}
2593
2594SYSCALL_DEFINE3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode)
2595{

--- 314 unchanged lines hidden (view full) ---

2910SYSCALL_DEFINE2(symlink, const char __user *, oldname, const char __user *, newname)
2911{
2912 return sys_symlinkat(oldname, AT_FDCWD, newname);
2913}
2914
2915int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)
2916{
2917 struct inode *inode = old_dentry->d_inode;
2918 unsigned max_links = dir->i_sb->s_max_links;
2914 int error;
2915
2916 if (!inode)
2917 return -ENOENT;
2918
2919 error = may_create(dir, new_dentry);
2920 if (error)
2921 return error;

--- 14 unchanged lines hidden (view full) ---

2936 error = security_inode_link(old_dentry, dir, new_dentry);
2937 if (error)
2938 return error;
2939
2940 mutex_lock(&inode->i_mutex);
2941 /* Make sure we don't allow creating hardlink to an unlinked file */
2942 if (inode->i_nlink == 0)
2943 error = -ENOENT;
2919 int error;
2920
2921 if (!inode)
2922 return -ENOENT;
2923
2924 error = may_create(dir, new_dentry);
2925 if (error)
2926 return error;

--- 14 unchanged lines hidden (view full) ---

2941 error = security_inode_link(old_dentry, dir, new_dentry);
2942 if (error)
2943 return error;
2944
2945 mutex_lock(&inode->i_mutex);
2946 /* Make sure we don't allow creating hardlink to an unlinked file */
2947 if (inode->i_nlink == 0)
2948 error = -ENOENT;
2949 else if (max_links && inode->i_nlink >= max_links)
2950 error = -EMLINK;
2944 else
2945 error = dir->i_op->link(old_dentry, dir, new_dentry);
2946 mutex_unlock(&inode->i_mutex);
2947 if (!error)
2948 fsnotify_link(dir, inode, new_dentry);
2949 return error;
2950}
2951

--- 93 unchanged lines hidden (view full) ---

3045 * ->i_mutex on parents, which works but leads to some truly excessive
3046 * locking].
3047 */
3048static int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
3049 struct inode *new_dir, struct dentry *new_dentry)
3050{
3051 int error = 0;
3052 struct inode *target = new_dentry->d_inode;
2951 else
2952 error = dir->i_op->link(old_dentry, dir, new_dentry);
2953 mutex_unlock(&inode->i_mutex);
2954 if (!error)
2955 fsnotify_link(dir, inode, new_dentry);
2956 return error;
2957}
2958

--- 93 unchanged lines hidden (view full) ---

3052 * ->i_mutex on parents, which works but leads to some truly excessive
3053 * locking].
3054 */
3055static int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
3056 struct inode *new_dir, struct dentry *new_dentry)
3057{
3058 int error = 0;
3059 struct inode *target = new_dentry->d_inode;
3060 unsigned max_links = new_dir->i_sb->s_max_links;
3053
3054 /*
3055 * If we are going to change the parent - check write permissions,
3056 * we'll need to flip '..'.
3057 */
3058 if (new_dir != old_dir) {
3059 error = inode_permission(old_dentry->d_inode, MAY_WRITE);
3060 if (error)

--- 7 unchanged lines hidden (view full) ---

3068 dget(new_dentry);
3069 if (target)
3070 mutex_lock(&target->i_mutex);
3071
3072 error = -EBUSY;
3073 if (d_mountpoint(old_dentry) || d_mountpoint(new_dentry))
3074 goto out;
3075
3061
3062 /*
3063 * If we are going to change the parent - check write permissions,
3064 * we'll need to flip '..'.
3065 */
3066 if (new_dir != old_dir) {
3067 error = inode_permission(old_dentry->d_inode, MAY_WRITE);
3068 if (error)

--- 7 unchanged lines hidden (view full) ---

3076 dget(new_dentry);
3077 if (target)
3078 mutex_lock(&target->i_mutex);
3079
3080 error = -EBUSY;
3081 if (d_mountpoint(old_dentry) || d_mountpoint(new_dentry))
3082 goto out;
3083
3084 error = -EMLINK;
3085 if (max_links && !target && new_dir != old_dir &&
3086 new_dir->i_nlink >= max_links)
3087 goto out;
3088
3076 if (target)
3077 shrink_dcache_parent(new_dentry);
3078 error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry);
3079 if (error)
3080 goto out;
3081
3082 if (target) {
3083 target->i_flags |= S_DEAD;

--- 350 unchanged lines hidden ---
3089 if (target)
3090 shrink_dcache_parent(new_dentry);
3091 error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry);
3092 if (error)
3093 goto out;
3094
3095 if (target) {
3096 target->i_flags |= S_DEAD;

--- 350 unchanged lines hidden ---