aboutsummaryrefslogtreecommitdiffstats
path: root/fs/9p
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2011-07-24 18:59:07 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2012-01-03 22:54:58 -0500
commitc2837de73e8081bd33bc72ad73f49d6bcba9d1b6 (patch)
tree3fca43b0147fc075c24a26aba1a60568ffd25f90 /fs/9p
parent18cb1b08d2e1ff6907130fc0ce78a5912efa0ba5 (diff)
9p: don't bother with unixmode2p9mode() for link() and symlink()
Pass perm to v9fs_vfs_mkspecial() instead of passing mode; calculate in caller when done for mknod(), use known value for link() and symlink(). As the result, we avoid a bit of work *and* stop mixing mode_t with P9_DMLINK. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/9p')
-rw-r--r--fs/9p/vfs_inode.c20
1 files changed, 8 insertions, 12 deletions
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c
index f54a26859fcc..cde57a850adb 100644
--- a/fs/9p/vfs_inode.c
+++ b/fs/9p/vfs_inode.c
@@ -59,15 +59,13 @@ static const struct inode_operations v9fs_symlink_inode_operations;
59 * 59 *
60 */ 60 */
61 61
62static int unixmode2p9mode(struct v9fs_session_info *v9ses, int mode) 62static u32 unixmode2p9mode(struct v9fs_session_info *v9ses, int mode)
63{ 63{
64 int res; 64 int res;
65 res = mode & 0777; 65 res = mode & 0777;
66 if (S_ISDIR(mode)) 66 if (S_ISDIR(mode))
67 res |= P9_DMDIR; 67 res |= P9_DMDIR;
68 if (v9fs_proto_dotu(v9ses)) { 68 if (v9fs_proto_dotu(v9ses)) {
69 if (S_ISLNK(mode))
70 res |= P9_DMSYMLINK;
71 if (v9ses->nodev == 0) { 69 if (v9ses->nodev == 0) {
72 if (S_ISSOCK(mode)) 70 if (S_ISSOCK(mode))
73 res |= P9_DMSOCKET; 71 res |= P9_DMSOCKET;
@@ -85,10 +83,7 @@ static int unixmode2p9mode(struct v9fs_session_info *v9ses, int mode)
85 res |= P9_DMSETGID; 83 res |= P9_DMSETGID;
86 if ((mode & S_ISVTX) == S_ISVTX) 84 if ((mode & S_ISVTX) == S_ISVTX)
87 res |= P9_DMSETVTX; 85 res |= P9_DMSETVTX;
88 if ((mode & P9_DMLINK))
89 res |= P9_DMLINK;
90 } 86 }
91
92 return res; 87 return res;
93} 88}
94 89
@@ -1303,9 +1298,8 @@ v9fs_vfs_put_link(struct dentry *dentry, struct nameidata *nd, void *p)
1303 */ 1298 */
1304 1299
1305static int v9fs_vfs_mkspecial(struct inode *dir, struct dentry *dentry, 1300static int v9fs_vfs_mkspecial(struct inode *dir, struct dentry *dentry,
1306 int mode, const char *extension) 1301 u32 perm, const char *extension)
1307{ 1302{
1308 u32 perm;
1309 struct p9_fid *fid; 1303 struct p9_fid *fid;
1310 struct v9fs_session_info *v9ses; 1304 struct v9fs_session_info *v9ses;
1311 1305
@@ -1315,7 +1309,6 @@ static int v9fs_vfs_mkspecial(struct inode *dir, struct dentry *dentry,
1315 return -EPERM; 1309 return -EPERM;
1316 } 1310 }
1317 1311
1318 perm = unixmode2p9mode(v9ses, mode);
1319 fid = v9fs_create(v9ses, dir, dentry, (char *) extension, perm, 1312 fid = v9fs_create(v9ses, dir, dentry, (char *) extension, perm,
1320 P9_OREAD); 1313 P9_OREAD);
1321 if (IS_ERR(fid)) 1314 if (IS_ERR(fid))
@@ -1342,7 +1335,7 @@ v9fs_vfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname)
1342 P9_DPRINTK(P9_DEBUG_VFS, " %lu,%s,%s\n", dir->i_ino, 1335 P9_DPRINTK(P9_DEBUG_VFS, " %lu,%s,%s\n", dir->i_ino,
1343 dentry->d_name.name, symname); 1336 dentry->d_name.name, symname);
1344 1337
1345 return v9fs_vfs_mkspecial(dir, dentry, S_IFLNK, symname); 1338 return v9fs_vfs_mkspecial(dir, dentry, P9_DMSYMLINK, symname);
1346} 1339}
1347 1340
1348/** 1341/**
@@ -1399,11 +1392,13 @@ clunk_fid:
1399static int 1392static int
1400v9fs_vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t rdev) 1393v9fs_vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t rdev)
1401{ 1394{
1395 struct v9fs_session_info *v9ses = v9fs_inode2v9ses(dir);
1402 int retval; 1396 int retval;
1403 char *name; 1397 char *name;
1398 u32 perm;
1404 1399
1405 P9_DPRINTK(P9_DEBUG_VFS, 1400 P9_DPRINTK(P9_DEBUG_VFS,
1406 " %lu,%s mode: %x MAJOR: %u MINOR: %u\n", dir->i_ino, 1401 " %lu,%s mode: %hx MAJOR: %u MINOR: %u\n", dir->i_ino,
1407 dentry->d_name.name, mode, MAJOR(rdev), MINOR(rdev)); 1402 dentry->d_name.name, mode, MAJOR(rdev), MINOR(rdev));
1408 1403
1409 if (!new_valid_dev(rdev)) 1404 if (!new_valid_dev(rdev))
@@ -1426,7 +1421,8 @@ v9fs_vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t rde
1426 return -EINVAL; 1421 return -EINVAL;
1427 } 1422 }
1428 1423
1429 retval = v9fs_vfs_mkspecial(dir, dentry, mode, name); 1424 perm = unixmode2p9mode(v9ses, mode);
1425 retval = v9fs_vfs_mkspecial(dir, dentry, perm, name);
1430 __putname(name); 1426 __putname(name);
1431 1427
1432 return retval; 1428 return retval;