From 1bf4640f5a8e60d3f8d4676663a87c735ea57552 Mon Sep 17 00:00:00 2001 From: Jeff Mahoney Date: Tue, 19 Mar 2013 21:18:32 -0400 Subject: [PATCH] LU-2800 llite: introduce local getname() 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 Signed-off-by: yang sheng Change-Id: If44cd9f9d14f26f220d5f0c52e8b804a49d3cf92 Reviewed-on: http://review.whamcloud.com/8581 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Bob Glossman Reviewed-by: Bobi Jam Reviewed-by: Oleg Drokin --- lustre/llite/dir.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/lustre/llite/dir.c b/lustre/llite/dir.c index febf6ea..484d177 100644 --- a/lustre/llite/dir.c +++ b/lustre/llite/dir.c @@ -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: { -- 1.8.3.1