Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] v9fs: Clean-up vfs_inode and setattr functions

Cleanup code in v9fs vfs_inode as suggested by Alexey Dobriyan. Did some
major revamping of the v9fs setattr code to remove unnecessary allocations and
clean up some dead-code.

Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Eric Van Hensbergen and committed by
Linus Torvalds
73c592b9 1346f51e

+36 -97
+1 -1
fs/9p/error.h
··· 139 139 {"illegal mode", EINVAL}, 140 140 {"illegal name", ENAMETOOLONG}, 141 141 {"not a directory", ENOTDIR}, 142 - {"not a member of proposed group", EINVAL}, 142 + {"not a member of proposed group", EPERM}, 143 143 {"not owner", EACCES}, 144 144 {"only owner can change group in wstat", EACCES}, 145 145 {"read only file system", EROFS},
+35 -96
fs/9p/vfs_inode.c
··· 1 1 /* 2 2 * linux/fs/9p/vfs_inode.c 3 3 * 4 - * This file contians vfs inode ops for the 9P2000 protocol. 4 + * This file contains vfs inode ops for the 9P2000 protocol. 5 5 * 6 6 * Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com> 7 7 * Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov> ··· 54 54 * 55 55 */ 56 56 57 - static inline int unixmode2p9mode(struct v9fs_session_info *v9ses, int mode) 57 + static int unixmode2p9mode(struct v9fs_session_info *v9ses, int mode) 58 58 { 59 59 int res; 60 60 res = mode & 0777; ··· 92 92 * 93 93 */ 94 94 95 - static inline int p9mode2unixmode(struct v9fs_session_info *v9ses, int mode) 95 + static int p9mode2unixmode(struct v9fs_session_info *v9ses, int mode) 96 96 { 97 97 int res; 98 98 ··· 132 132 * 133 133 */ 134 134 135 - static inline void 135 + static void 136 136 v9fs_blank_mistat(struct v9fs_session_info *v9ses, struct v9fs_stat *mistat) 137 137 { 138 138 mistat->type = ~0; ··· 160 160 /** 161 161 * v9fs_mistat2unix - convert mistat to unix stat 162 162 * @mistat: Plan 9 metadata (mistat) structure 163 - * @stat: unix metadata (stat) structure to populate 163 + * @buf: unix metadata (stat) structure to populate 164 164 * @sb: superblock 165 165 * 166 166 */ ··· 177 177 buf->st_mtime = mistat->mtime; 178 178 buf->st_ctime = mistat->mtime; 179 179 180 - if (v9ses && v9ses->extended) { 181 - /* TODO: string to uid mapping via user-space daemon */ 182 - buf->st_uid = mistat->n_uid; 183 - buf->st_gid = mistat->n_gid; 184 - 185 - sscanf(mistat->uid, "%x", (unsigned int *)&buf->st_uid); 186 - sscanf(mistat->gid, "%x", (unsigned int *)&buf->st_gid); 187 - } else { 188 - buf->st_uid = v9ses->uid; 189 - buf->st_gid = v9ses->gid; 190 - } 191 - 192 180 buf->st_uid = (unsigned short)-1; 193 181 buf->st_gid = (unsigned short)-1; 194 182 195 183 if (v9ses && v9ses->extended) { 184 + /* TODO: string to uid mapping via user-space daemon */ 196 185 if (mistat->n_uid != -1) 197 186 sscanf(mistat->uid, "%x", (unsigned int *)&buf->st_uid); 198 187 ··· 279 290 * @dir: directory inode file is being created in 280 291 * @file_dentry: dentry file is being created in 281 292 * @perm: permissions file is being created with 282 - * @open_mode: resulting open mode for file ??? 293 + * @open_mode: resulting open mode for file 283 294 * 284 295 */ 285 296 ··· 423 434 424 435 /** 425 436 * v9fs_remove - helper function to remove files and directories 426 - * @inode: directory inode that is being deleted 427 - * @dentry: dentry that is being deleted 428 - * @rmdir: where we are a file or a directory 437 + * @dir: directory inode that is being deleted 438 + * @file: dentry that is being deleted 439 + * @rmdir: removing a directory 429 440 * 430 441 */ 431 442 ··· 491 502 492 503 /** 493 504 * v9fs_vfs_mkdir - VFS mkdir hook to create a directory 494 - * @i: inode that is being unlinked 505 + * @inode: inode that is being unlinked 495 506 * @dentry: dentry that is being unlinked 496 507 * @mode: mode for new directory 497 508 * ··· 613 624 /** 614 625 * v9fs_vfs_unlink - VFS unlink hook to delete an inode 615 626 * @i: inode that is being unlinked 616 - * @dentry: dentry that is being unlinked 627 + * @d: dentry that is being unlinked 617 628 * 618 629 */ 619 630 ··· 625 636 /** 626 637 * v9fs_vfs_rmdir - VFS unlink hook to delete a directory 627 638 * @i: inode that is being unlinked 628 - * @dentry: dentry that is being unlinked 639 + * @d: dentry that is being unlinked 629 640 * 630 641 */ 631 642 ··· 662 673 int retval = 0; 663 674 664 675 dprintk(DEBUG_VFS, "\n"); 676 + 677 + if (!mistat) 678 + return -ENOMEM; 665 679 666 680 if ((!oldfid) || (!olddirfid) || (!newdirfid)) { 667 681 dprintk(DEBUG_ERROR, "problem with arguments\n"); ··· 763 771 { 764 772 struct v9fs_session_info *v9ses = v9fs_inode2v9ses(dentry->d_inode); 765 773 struct v9fs_fid *fid = v9fs_fid_lookup(dentry, FID_OP); 766 - struct v9fs_stat *mistat = kmalloc(v9ses->maxdata, GFP_KERNEL); 767 774 struct v9fs_fcall *fcall = NULL; 775 + struct v9fs_stat *mistat = kmalloc(v9ses->maxdata, GFP_KERNEL); 768 776 int res = -EPERM; 769 777 770 778 dprintk(DEBUG_VFS, "\n"); 779 + 780 + if (!mistat) 781 + return -ENOMEM; 782 + 771 783 if (!fid) { 772 784 dprintk(DEBUG_ERROR, 773 785 "Couldn't find fid associated with dentry\n"); 774 786 return -EBADF; 775 787 } 776 - 777 - if (!mistat) 778 - return -ENOMEM; 779 788 780 789 v9fs_blank_mistat(v9ses, mistat); 781 790 if (iattr->ia_valid & ATTR_MODE) ··· 792 799 mistat->length = iattr->ia_size; 793 800 794 801 if (v9ses->extended) { 795 - char *uid = kmalloc(strlen(mistat->uid), GFP_KERNEL); 796 - char *gid = kmalloc(strlen(mistat->gid), GFP_KERNEL); 797 - char *muid = kmalloc(strlen(mistat->muid), GFP_KERNEL); 798 - char *name = kmalloc(strlen(mistat->name), GFP_KERNEL); 799 - char *extension = kmalloc(strlen(mistat->extension), 800 - GFP_KERNEL); 801 - 802 - if ((!uid) || (!gid) || (!muid) || (!name) || (!extension)) { 803 - kfree(uid); 804 - kfree(gid); 805 - kfree(muid); 806 - kfree(name); 807 - kfree(extension); 808 - 809 - return -ENOMEM; 810 - } 811 - 812 - strcpy(uid, mistat->uid); 813 - strcpy(gid, mistat->gid); 814 - strcpy(muid, mistat->muid); 815 - strcpy(name, mistat->name); 816 - strcpy(extension, mistat->extension); 802 + char *ptr = mistat->data+1; 817 803 818 804 if (iattr->ia_valid & ATTR_UID) { 819 - if (strlen(uid) != 8) { 820 - dprintk(DEBUG_ERROR, "uid strlen is %u not 8\n", 821 - (unsigned int)strlen(uid)); 822 - sprintf(uid, "%08x", iattr->ia_uid); 823 - } else { 824 - kfree(uid); 825 - uid = kmalloc(9, GFP_KERNEL); 826 - } 827 - 828 - sprintf(uid, "%08x", iattr->ia_uid); 805 + mistat->uid = ptr; 806 + ptr += 1+sprintf(ptr, "%08x", iattr->ia_uid); 829 807 mistat->n_uid = iattr->ia_uid; 830 808 } 831 809 832 810 if (iattr->ia_valid & ATTR_GID) { 833 - if (strlen(gid) != 8) 834 - dprintk(DEBUG_ERROR, "gid strlen is %u not 8\n", 835 - (unsigned int)strlen(gid)); 836 - else { 837 - kfree(gid); 838 - gid = kmalloc(9, GFP_KERNEL); 839 - } 840 - 841 - sprintf(gid, "%08x", iattr->ia_gid); 811 + mistat->gid = ptr; 812 + ptr += 1+sprintf(ptr, "%08x", iattr->ia_gid); 842 813 mistat->n_gid = iattr->ia_gid; 843 814 } 844 - 845 - mistat->uid = mistat->data; 846 - strcpy(mistat->uid, uid); 847 - mistat->gid = mistat->data + strlen(uid) + 1; 848 - strcpy(mistat->gid, gid); 849 - mistat->muid = mistat->gid + strlen(gid) + 1; 850 - strcpy(mistat->muid, muid); 851 - mistat->name = mistat->muid + strlen(muid) + 1; 852 - strcpy(mistat->name, name); 853 - mistat->extension = mistat->name + strlen(name) + 1; 854 - strcpy(mistat->extension, extension); 855 - 856 - kfree(uid); 857 - kfree(gid); 858 - kfree(muid); 859 - kfree(name); 860 - kfree(extension); 861 815 } 862 816 863 817 res = v9fs_t_wstat(v9ses, fid->fid, mistat, &fcall); ··· 925 985 int retval = -EPERM; 926 986 struct v9fs_fid *newfid; 927 987 struct v9fs_session_info *v9ses = v9fs_inode2v9ses(dir); 928 - struct super_block *sb = dir ? dir->i_sb : NULL; 929 988 struct v9fs_fcall *fcall = NULL; 930 989 struct v9fs_stat *mistat = kmalloc(v9ses->maxdata, GFP_KERNEL); 931 990 932 991 dprintk(DEBUG_VFS, " %lu,%s,%s\n", dir->i_ino, dentry->d_name.name, 933 992 symname); 934 993 935 - if ((!dentry) || (!sb) || (!v9ses)) { 936 - dprintk(DEBUG_ERROR, "problem with arguments\n"); 937 - return -EBADF; 938 - } 994 + if (!mistat) 995 + return -ENOMEM; 939 996 940 997 if (!v9ses->extended) { 941 998 dprintk(DEBUG_ERROR, "not extended\n"); ··· 977 1040 /** 978 1041 * v9fs_readlink - read a symlink's location (internal version) 979 1042 * @dentry: dentry for symlink 980 - * @buf: buffer to load symlink location into 1043 + * @buffer: buffer to load symlink location into 981 1044 * @buflen: length of buffer 982 1045 * 983 1046 */ ··· 1116 1179 * v9fs_vfs_link - create a hardlink 1117 1180 * @old_dentry: dentry for file to link to 1118 1181 * @dir: inode destination for new link 1119 - * @new_dentry: dentry for link 1182 + * @dentry: dentry for link 1120 1183 * 1121 1184 */ 1122 1185 ··· 1211 1274 dprintk(DEBUG_VFS, " %lu,%s mode: %x MAJOR: %u MINOR: %u\n", dir->i_ino, 1212 1275 dentry->d_name.name, mode, MAJOR(rdev), MINOR(rdev)); 1213 1276 1277 + if (!mistat) 1278 + return -ENOMEM; 1279 + 1214 1280 if (!new_valid_dev(rdev)) { 1215 1281 retval = -EINVAL; 1216 1282 goto FreeMem; ··· 1242 1302 sprintf(symname, "b %u %u", MAJOR(rdev), MINOR(rdev)); 1243 1303 else if (S_ISCHR(mode)) 1244 1304 sprintf(symname, "c %u %u", MAJOR(rdev), MINOR(rdev)); 1245 - else if (S_ISFIFO(mode)) ; /* DO NOTHING */ 1305 + else if (S_ISFIFO(mode)) 1306 + ; /* DO NOTHING */ 1246 1307 else { 1247 1308 retval = -EINVAL; 1248 1309 goto FreeMem; ··· 1260 1319 FCALL_ERROR(fcall)); 1261 1320 goto FreeMem; 1262 1321 } 1263 - 1264 - kfree(fcall); 1265 1322 } 1266 1323 1267 1324 /* need to update dcache so we show up */