4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 only,
8 * as published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License version 2 for more details (a copy is included
14 * in the LICENSE file that accompanied this code).
16 * You should have received a copy of the GNU General Public License
17 * version 2 along with this program; If not, see
18 * http://www.gnu.org/licenses/gpl-2.0.html
23 * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
24 * Use is subject to license terms.
26 * Copyright (c) 2011, 2012, Intel Corporation.
29 * This file is part of Lustre, http://www.lustre.org/
30 * Lustre is a trademark of Sun Microsystems, Inc.
35 #include <linux/stat.h>
36 #define DEBUG_SUBSYSTEM S_LLITE
38 #include "../include/lustre_lite.h"
39 #include "llite_internal.h"
41 static int ll_readlink_internal(struct inode
*inode
,
42 struct ptlrpc_request
**request
, char **symname
)
44 struct ll_inode_info
*lli
= ll_i2info(inode
);
45 struct ll_sb_info
*sbi
= ll_i2sbi(inode
);
46 int rc
, symlen
= i_size_read(inode
) + 1;
47 struct mdt_body
*body
;
48 struct md_op_data
*op_data
;
52 if (lli
->lli_symlink_name
) {
53 int print_limit
= min_t(int, PAGE_SIZE
- 128, symlen
);
55 *symname
= lli
->lli_symlink_name
;
56 /* If the total CDEBUG() size is larger than a page, it
57 * will print a warning to the console, avoid this by
58 * printing just the last part of the symlink.
60 CDEBUG(D_INODE
, "using cached symlink %s%.*s, len = %d\n",
61 print_limit
< symlen
? "..." : "", print_limit
,
62 (*symname
) + symlen
- print_limit
, symlen
);
66 op_data
= ll_prep_md_op_data(NULL
, inode
, NULL
, NULL
, 0, symlen
,
67 LUSTRE_OPC_ANY
, NULL
);
69 return PTR_ERR(op_data
);
71 op_data
->op_valid
= OBD_MD_LINKNAME
;
72 rc
= md_getattr(sbi
->ll_md_exp
, op_data
, request
);
73 ll_finish_md_op_data(op_data
);
76 CERROR("%s: inode "DFID
": rc = %d\n",
77 ll_get_fsname(inode
->i_sb
, NULL
, 0),
78 PFID(ll_inode2fid(inode
)), rc
);
82 body
= req_capsule_server_get(&(*request
)->rq_pill
, &RMF_MDT_BODY
);
83 if ((body
->valid
& OBD_MD_LINKNAME
) == 0) {
84 CERROR("OBD_MD_LINKNAME not set on reply\n");
90 if (body
->eadatasize
!= symlen
) {
91 CERROR("%s: inode "DFID
": symlink length %d not expected %d\n",
92 ll_get_fsname(inode
->i_sb
, NULL
, 0),
93 PFID(ll_inode2fid(inode
)), body
->eadatasize
- 1,
99 *symname
= req_capsule_server_get(&(*request
)->rq_pill
, &RMF_MDT_MD
);
101 strnlen(*symname
, symlen
) != symlen
- 1) {
102 /* not full/NULL terminated */
103 CERROR("inode %lu: symlink not NULL terminated string of length %d\n",
104 inode
->i_ino
, symlen
- 1);
109 lli
->lli_symlink_name
= kzalloc(symlen
, GFP_NOFS
);
110 /* do not return an error if we cannot cache the symlink locally */
111 if (lli
->lli_symlink_name
) {
112 memcpy(lli
->lli_symlink_name
, *symname
, symlen
);
113 *symname
= lli
->lli_symlink_name
;
121 static void ll_put_link(void *p
)
123 ptlrpc_req_finished(p
);
126 static const char *ll_get_link(struct dentry
*dentry
,
128 struct delayed_call
*done
)
130 struct ptlrpc_request
*request
= NULL
;
132 char *symname
= NULL
;
134 return ERR_PTR(-ECHILD
);
136 CDEBUG(D_VFSTRACE
, "VFS Op\n");
137 ll_inode_size_lock(inode
);
138 rc
= ll_readlink_internal(inode
, &request
, &symname
);
139 ll_inode_size_unlock(inode
);
141 ptlrpc_req_finished(request
);
145 /* symname may contain a pointer to the request message buffer,
146 * we delay request releasing then.
148 set_delayed_call(done
, ll_put_link
, request
);
152 const struct inode_operations ll_fast_symlink_inode_operations
= {
153 .readlink
= generic_readlink
,
154 .setattr
= ll_setattr
,
155 .get_link
= ll_get_link
,
156 .getattr
= ll_getattr
,
157 .permission
= ll_inode_permission
,
158 .setxattr
= ll_setxattr
,
159 .getxattr
= ll_getxattr
,
160 .listxattr
= ll_listxattr
,
161 .removexattr
= ll_removexattr
,