From patchwork Tue Oct 29 01:48:11 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "Geyslan G. Bem" X-Patchwork-Id: 3105921 Return-Path: X-Original-To: patchwork-v9fs-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 88845BF924 for ; Tue, 29 Oct 2013 01:48:35 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 70F7B2034E for ; Tue, 29 Oct 2013 01:48:34 +0000 (UTC) Received: from lists.sourceforge.net (lists.sourceforge.net [216.34.181.88]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 09E6220328 for ; Tue, 29 Oct 2013 01:48:33 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=sfs-ml-3.v29.ch3.sourceforge.com) by sfs-ml-3.v29.ch3.sourceforge.com with esmtp (Exim 4.76) (envelope-from ) id 1VayPr-0003q5-R8; Tue, 29 Oct 2013 01:48:19 +0000 Received: from sog-mx-2.v43.ch3.sourceforge.com ([172.29.43.192] helo=mx.sourceforge.net) by sfs-ml-3.v29.ch3.sourceforge.com with esmtp (Exim 4.76) (envelope-from ) id 1VayPq-0003q0-HI for v9fs-developer@lists.sourceforge.net; Tue, 29 Oct 2013 01:48:18 +0000 Received-SPF: pass (sog-mx-2.v43.ch3.sourceforge.com: domain of gmail.com designates 209.85.223.181 as permitted sender) client-ip=209.85.223.181; envelope-from=geyslan@gmail.com; helo=mail-ie0-f181.google.com; Received: from mail-ie0-f181.google.com ([209.85.223.181]) by sog-mx-2.v43.ch3.sourceforge.com with esmtps (TLSv1:RC4-SHA:128) (Exim 4.76) id 1VayPo-0006Xj-KZ for v9fs-developer@lists.sourceforge.net; Tue, 29 Oct 2013 01:48:18 +0000 Received: by mail-ie0-f181.google.com with SMTP id ar20so12540490iec.40 for ; Mon, 28 Oct 2013 18:48:11 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.50.26.36 with SMTP id i4mr10663082igg.33.1383011291187; Mon, 28 Oct 2013 18:48:11 -0700 (PDT) Received: by 10.64.81.102 with HTTP; Mon, 28 Oct 2013 18:48:11 -0700 (PDT) In-Reply-To: References: <1381184340-11190-1-git-send-email-geyslan@gmail.com> <1381185204.2081.221.camel@joe-AO722> <1381191145.2081.230.camel@joe-AO722> Date: Mon, 28 Oct 2013 23:48:11 -0200 Message-ID: From: =?ISO-8859-1?Q?Geyslan_Greg=F3rio_Bem?= To: Eric Van Hensbergen X-Spam-Score: -1.6 (-) X-Headers-End: 1VayPo-0006Xj-KZ Cc: Latchesar Ionkov , linux-kernel , V9FS Developers , Joe Perches , Ron Minnich , kernel-br Subject: Re: [V9fs-developer] [PATCH] 9p: unsigned/signed wrap in p9/unix modes. X-BeenThere: v9fs-developer@lists.sourceforge.net X-Mailman-Version: 2.1.9 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: v9fs-developer-bounces@lists.sourceforge.net X-Spam-Status: No, score=-7.4 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, FREEMAIL_FROM,RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 2013/10/28 Geyslan Gregório Bem > > 2013/10/27 Eric Van Hensbergen >> >> Looks like the right approach. The one other optional thing I mentioned was support for passing NULL for rdev and not trying to parse the device info when rdev == NULL. Its a very slight optimization in the grand scheme of things, but would seem to be cleaner for the folks calling the function who don't touch rdev after the fact... >> >> -eric >> > Great. Let me do the changes this afternoon. > > Hi Eric and all. You requested to avoid the parsing of device when rdev is NULL, all right? But I'm afraid that that manner the res (return value) can be returned wrong when the bit mode is a device. Well, I did some changes. In this new approach, when rdev is NULL, the function only doesn't make the device, but returns the res (umode_t) nicely. Tell me if this approach is correct. Do I have to modify something else? res |= P9_DMDIR; @@ -125,10 +125,9 @@ static int p9mode2perm(struct v9fs_session_info *v9ses, static umode_t p9mode2unixmode(struct v9fs_session_info *v9ses, struct p9_wstat *stat, dev_t *rdev) { - int res; + umode_t res; u32 mode = stat->mode; - *rdev = 0; res = p9mode2perm(v9ses, stat); if ((mode & P9_DMDIR) == P9_DMDIR) @@ -144,10 +143,15 @@ static umode_t p9mode2unixmode(struct v9fs_session_info *v9ses, else if ((mode & P9_DMDEVICE) && (v9fs_proto_dotu(v9ses)) && (v9ses->nodev == 0)) { char type = 0, ext[32]; - int major = -1, minor = -1; + u32 major = 0, minor = 0; strlcpy(ext, stat->extension, sizeof(ext)); - sscanf(ext, "%c %u %u", &type, &major, &minor); + if (sscanf(ext, "%c %u %u", &type, &major, &minor) < 3) { + p9_debug(P9_DEBUG_ERROR, + "It's necessary define type [%c], major [%u] and minor [%u]" \ + "values when mode is P9_DMDEVICE\n", type, major, minor); + goto err_dev; + } switch (type) { case 'c': res |= S_IFCHR; @@ -158,11 +162,18 @@ static umode_t p9mode2unixmode(struct v9fs_session_info *v9ses, default: p9_debug(P9_DEBUG_ERROR, "Unknown special type %c %s\n", type, stat->extension); - }; - *rdev = MKDEV(major, minor); + goto err_dev; + } + /* Only make device if rdev pointer isn't NULL */ + if (rdev) + *rdev = MKDEV(major, minor); } else res |= S_IFREG; - + goto ret; +err_dev: + if (rdev) + rdev = ERR_PTR(-EIO); +ret: return res; } @@ -460,13 +471,12 @@ void v9fs_evict_inode(struct inode *inode) static int v9fs_test_inode(struct inode *inode, void *data) { - int umode; - dev_t rdev; + umode_t umode; struct v9fs_inode *v9inode = V9FS_I(inode); struct p9_wstat *st = (struct p9_wstat *)data; struct v9fs_session_info *v9ses = v9fs_inode2v9ses(inode); - umode = p9mode2unixmode(v9ses, st, &rdev); + umode = p9mode2unixmode(v9ses, st, NULL); /* don't match inode of different type */ if ((inode->i_mode & S_IFMT) != (umode & S_IFMT)) return 0; @@ -526,6 +536,10 @@ static struct inode *v9fs_qid_iget(struct super_block *sb, */ inode->i_ino = i_ino; umode = p9mode2unixmode(v9ses, st, &rdev); + if (IS_ERR_VALUE(rdev)) { + retval = rdev; + goto error; + } retval = v9fs_init_inode(v9ses, inode, umode, rdev); if (retval) goto error; @@ -1461,8 +1475,7 @@ v9fs_vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t rde int v9fs_refresh_inode(struct p9_fid *fid, struct inode *inode) { - int umode; - dev_t rdev; + umode_t umode; loff_t i_size; struct p9_wstat *st; struct v9fs_session_info *v9ses; @@ -1474,7 +1487,7 @@ int v9fs_refresh_inode(struct p9_fid *fid, struct inode *inode) /* * Don't update inode if the file type is different */ - umode = p9mode2unixmode(v9ses, st, &rdev); + umode = p9mode2unixmode(v9ses, st, NULL); if ((inode->i_mode & S_IFMT) != (umode & S_IFMT)) goto out; diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index 94de6d1..e3d56f1 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c @@ -63,7 +63,7 @@ static const struct inode_operations v9fs_symlink_inode_operations; static u32 unixmode2p9mode(struct v9fs_session_info *v9ses, umode_t mode) { - int res; + u32 res; res = mode & 0777; if (S_ISDIR(mode))