Whamcloud - gitweb
LU-2800 llite: introduce local getname()
authorJeff Mahoney <jeffm@suse.com>
Wed, 20 Mar 2013 01:18:32 +0000 (21:18 -0400)
committerOleg Drokin <oleg.drokin@intel.com>
Fri, 7 Jun 2013 03:56:48 +0000 (23:56 -0400)
Commit 8e377d15 (v3.7) unexported getname and putname. Although
getname was re-exported, putname was not. All we really need is
something to to allocate a buffer and copy it from userspace so
let's just use our own version. The down size is that we lose
the audit support in the original getname.

Signed-off-by: Jeff Mahoney <jeffm@suse.com>
Change-Id: If44cd9f9d14f26f220d5f0c52e8b804a49d3cf92
Reviewed-on: http://review.whamcloud.com/5781
Tested-by: Hudson
Reviewed-by: Peng Tao <bergwolf@gmail.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Alexey Shvetsov <alexxy@gentoo.org>
Reviewed-by: James Simmons <uja.ornl@gmail.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/llite/dir.c

index febf6ea..484d177 100644 (file)
@@ -1228,6 +1228,30 @@ out:
         RETURN(rc);
 }
 
+static char *
+ll_getname(const char __user *filename)
+{
+       int ret = 0, len;
+       char *tmp = __getname();
+
+       if (!tmp)
+               return ERR_PTR(-ENOMEM);
+
+       len = strncpy_from_user(tmp, filename, PATH_MAX);
+       if (len == 0)
+               ret = -ENOENT;
+       else if (len > PATH_MAX)
+               ret = -ENAMETOOLONG;
+
+       if (ret) {
+               __putname(tmp);
+               tmp =  ERR_PTR(ret);
+       }
+       return tmp;
+}
+
+#define ll_putname(filename) __putname(filename)
+
 static long ll_dir_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
         struct inode *inode = file->f_dentry->d_inode;
@@ -1430,7 +1454,7 @@ free_lmv:
                if (!(exp_connect_flags(sbi->ll_md_exp) & OBD_CONNECT_LVB_TYPE))
                        return -ENOTSUPP;
 
-               filename = getname((const char *)arg);
+               filename = ll_getname((const char *)arg);
                if (IS_ERR(filename))
                        RETURN(PTR_ERR(filename));
 
@@ -1441,7 +1465,7 @@ free_lmv:
                rc = ll_rmdir_entry(inode, filename, namelen);
 out_rmdir:
                 if (filename)
-                        putname(filename);
+                        ll_putname(filename);
                RETURN(rc);
        }
        case LL_IOC_LOV_SWAP_LAYOUTS:
@@ -1461,7 +1485,7 @@ out_rmdir:
 
                 if (cmd == IOC_MDC_GETFILEINFO ||
                     cmd == IOC_MDC_GETFILESTRIPE) {
-                        filename = getname((const char *)arg);
+                        filename = ll_getname((const char *)arg);
                         if (IS_ERR(filename))
                                 RETURN(PTR_ERR(filename));
 
@@ -1528,7 +1552,7 @@ out_rmdir:
         out_req:
                 ptlrpc_req_finished(request);
                 if (filename)
-                        putname(filename);
+                        ll_putname(filename);
                 return rc;
         }
         case IOC_LOV_GETINFO: {